]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elf32-ppc.c
Update Dutch translation
[thirdparty/binutils-gdb.git] / bfd / elf32-ppc.c
CommitLineData
252b5132 1/* PowerPC-specific support for 32-bit ELF
051d5130 2 Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
264a1fe0 3 2004, 2005 Free Software Foundation, Inc.
252b5132
RH
4 Written by Ian Lance Taylor, Cygnus Support.
5
ae9a127f 6 This file is part of BFD, the Binary File Descriptor library.
252b5132 7
ae9a127f
NC
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
252b5132 12
ae9a127f
NC
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
252b5132 17
ae9a127f 18 You should have received a copy of the GNU General Public License
fc0bffd6 19 along with this program; if not, write to the
3e110533 20 Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
53e09e0a 21 Boston, MA 02110-1301, USA. */
252b5132
RH
22
23/* This file is based on a preliminary PowerPC ELF ABI. The
24 information may not match the final PowerPC ELF ABI. It includes
25 suggestions from the in-progress Embedded PowerPC ABI, and that
26 information may also not match. */
27
28#include "bfd.h"
29#include "sysdep.h"
30#include "bfdlink.h"
31#include "libbfd.h"
32#include "elf-bfd.h"
33#include "elf/ppc.h"
7619e7c7 34#include "elf32-ppc.h"
252b5132 35
f0fe0e16 36/* RELA relocations are used here. */
252b5132 37
252b5132 38static bfd_reloc_status_type ppc_elf_addr16_ha_reloc
55fd94b0 39 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
7619e7c7 40static bfd_reloc_status_type ppc_elf_unhandled_reloc
55fd94b0 41 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
252b5132 42
70bccea4
AM
43/* Branch prediction bit for branch taken relocs. */
44#define BRANCH_PREDICT_BIT 0x200000
45/* Mask to set RA in memory instructions. */
46#define RA_REGISTER_MASK 0x001f0000
47/* Value to shift register by to insert RA. */
48#define RA_REGISTER_SHIFT 16
252b5132
RH
49
50/* The name of the dynamic interpreter. This is put in the .interp
51 section. */
252b5132
RH
52#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
53
54/* The size in bytes of an entry in the procedure linkage table. */
55#define PLT_ENTRY_SIZE 12
56/* The initial size of the plt reserved for the dynamic linker. */
57#define PLT_INITIAL_ENTRY_SIZE 72
58/* The size of the gap between entries in the PLT. */
59#define PLT_SLOT_SIZE 8
60/* The number of single-slot PLT entries (the rest use two slots). */
61#define PLT_NUM_SINGLE_ENTRIES 8192
62
7619e7c7
AM
63/* Some nop instructions. */
64#define NOP 0x60000000
65#define CROR_151515 0x4def7b82
66#define CROR_313131 0x4ffffb82
67
68/* Offset of tp and dtp pointers from start of TLS block. */
69#define TP_OFFSET 0x7000
70#define DTP_OFFSET 0x8000
7fce784e 71\f
e47cd125 72static reloc_howto_type *ppc_elf_howto_table[R_PPC_max];
252b5132 73
8da6118f 74static reloc_howto_type ppc_elf_howto_raw[] = {
252b5132
RH
75 /* This reloc does nothing. */
76 HOWTO (R_PPC_NONE, /* type */
77 0, /* rightshift */
78 2, /* size (0 = byte, 1 = short, 2 = long) */
79 32, /* bitsize */
b34976b6 80 FALSE, /* pc_relative */
252b5132
RH
81 0, /* bitpos */
82 complain_overflow_bitfield, /* complain_on_overflow */
83 bfd_elf_generic_reloc, /* special_function */
84 "R_PPC_NONE", /* name */
b34976b6 85 FALSE, /* partial_inplace */
252b5132
RH
86 0, /* src_mask */
87 0, /* dst_mask */
b34976b6 88 FALSE), /* pcrel_offset */
252b5132
RH
89
90 /* A standard 32 bit relocation. */
91 HOWTO (R_PPC_ADDR32, /* type */
92 0, /* rightshift */
93 2, /* size (0 = byte, 1 = short, 2 = long) */
94 32, /* bitsize */
b34976b6 95 FALSE, /* pc_relative */
252b5132
RH
96 0, /* bitpos */
97 complain_overflow_bitfield, /* complain_on_overflow */
98 bfd_elf_generic_reloc, /* special_function */
99 "R_PPC_ADDR32", /* name */
b34976b6 100 FALSE, /* partial_inplace */
252b5132
RH
101 0, /* src_mask */
102 0xffffffff, /* dst_mask */
b34976b6 103 FALSE), /* pcrel_offset */
252b5132
RH
104
105 /* An absolute 26 bit branch; the lower two bits must be zero.
106 FIXME: we don't check that, we just clear them. */
107 HOWTO (R_PPC_ADDR24, /* type */
108 0, /* rightshift */
109 2, /* size (0 = byte, 1 = short, 2 = long) */
110 26, /* bitsize */
b34976b6 111 FALSE, /* pc_relative */
252b5132
RH
112 0, /* bitpos */
113 complain_overflow_bitfield, /* complain_on_overflow */
114 bfd_elf_generic_reloc, /* special_function */
115 "R_PPC_ADDR24", /* name */
b34976b6 116 FALSE, /* partial_inplace */
252b5132
RH
117 0, /* src_mask */
118 0x3fffffc, /* dst_mask */
b34976b6 119 FALSE), /* pcrel_offset */
252b5132
RH
120
121 /* A standard 16 bit relocation. */
122 HOWTO (R_PPC_ADDR16, /* type */
123 0, /* rightshift */
124 1, /* size (0 = byte, 1 = short, 2 = long) */
125 16, /* bitsize */
b34976b6 126 FALSE, /* pc_relative */
252b5132
RH
127 0, /* bitpos */
128 complain_overflow_bitfield, /* complain_on_overflow */
129 bfd_elf_generic_reloc, /* special_function */
130 "R_PPC_ADDR16", /* name */
b34976b6 131 FALSE, /* partial_inplace */
252b5132
RH
132 0, /* src_mask */
133 0xffff, /* dst_mask */
b34976b6 134 FALSE), /* pcrel_offset */
252b5132
RH
135
136 /* A 16 bit relocation without overflow. */
137 HOWTO (R_PPC_ADDR16_LO, /* type */
138 0, /* rightshift */
139 1, /* size (0 = byte, 1 = short, 2 = long) */
140 16, /* bitsize */
b34976b6 141 FALSE, /* pc_relative */
252b5132
RH
142 0, /* bitpos */
143 complain_overflow_dont,/* complain_on_overflow */
144 bfd_elf_generic_reloc, /* special_function */
145 "R_PPC_ADDR16_LO", /* name */
b34976b6 146 FALSE, /* partial_inplace */
252b5132
RH
147 0, /* src_mask */
148 0xffff, /* dst_mask */
b34976b6 149 FALSE), /* pcrel_offset */
252b5132
RH
150
151 /* The high order 16 bits of an address. */
152 HOWTO (R_PPC_ADDR16_HI, /* type */
153 16, /* rightshift */
154 1, /* size (0 = byte, 1 = short, 2 = long) */
155 16, /* bitsize */
b34976b6 156 FALSE, /* pc_relative */
252b5132
RH
157 0, /* bitpos */
158 complain_overflow_dont, /* complain_on_overflow */
159 bfd_elf_generic_reloc, /* special_function */
160 "R_PPC_ADDR16_HI", /* name */
b34976b6 161 FALSE, /* partial_inplace */
252b5132
RH
162 0, /* src_mask */
163 0xffff, /* dst_mask */
b34976b6 164 FALSE), /* pcrel_offset */
252b5132
RH
165
166 /* The high order 16 bits of an address, plus 1 if the contents of
8da6118f 167 the low 16 bits, treated as a signed number, is negative. */
252b5132
RH
168 HOWTO (R_PPC_ADDR16_HA, /* type */
169 16, /* rightshift */
170 1, /* size (0 = byte, 1 = short, 2 = long) */
171 16, /* bitsize */
b34976b6 172 FALSE, /* pc_relative */
252b5132
RH
173 0, /* bitpos */
174 complain_overflow_dont, /* complain_on_overflow */
175 ppc_elf_addr16_ha_reloc, /* special_function */
176 "R_PPC_ADDR16_HA", /* name */
b34976b6 177 FALSE, /* partial_inplace */
252b5132
RH
178 0, /* src_mask */
179 0xffff, /* dst_mask */
b34976b6 180 FALSE), /* pcrel_offset */
252b5132
RH
181
182 /* An absolute 16 bit branch; the lower two bits must be zero.
183 FIXME: we don't check that, we just clear them. */
184 HOWTO (R_PPC_ADDR14, /* type */
185 0, /* rightshift */
186 2, /* size (0 = byte, 1 = short, 2 = long) */
187 16, /* bitsize */
b34976b6 188 FALSE, /* pc_relative */
252b5132
RH
189 0, /* bitpos */
190 complain_overflow_bitfield, /* complain_on_overflow */
191 bfd_elf_generic_reloc, /* special_function */
192 "R_PPC_ADDR14", /* name */
b34976b6 193 FALSE, /* partial_inplace */
252b5132
RH
194 0, /* src_mask */
195 0xfffc, /* dst_mask */
b34976b6 196 FALSE), /* pcrel_offset */
252b5132
RH
197
198 /* An absolute 16 bit branch, for which bit 10 should be set to
199 indicate that the branch is expected to be taken. The lower two
8da6118f 200 bits must be zero. */
252b5132
RH
201 HOWTO (R_PPC_ADDR14_BRTAKEN, /* type */
202 0, /* rightshift */
203 2, /* size (0 = byte, 1 = short, 2 = long) */
204 16, /* bitsize */
b34976b6 205 FALSE, /* pc_relative */
252b5132
RH
206 0, /* bitpos */
207 complain_overflow_bitfield, /* complain_on_overflow */
208 bfd_elf_generic_reloc, /* special_function */
209 "R_PPC_ADDR14_BRTAKEN",/* name */
b34976b6 210 FALSE, /* partial_inplace */
252b5132
RH
211 0, /* src_mask */
212 0xfffc, /* dst_mask */
b34976b6 213 FALSE), /* pcrel_offset */
252b5132
RH
214
215 /* An absolute 16 bit branch, for which bit 10 should be set to
216 indicate that the branch is not expected to be taken. The lower
217 two bits must be zero. */
218 HOWTO (R_PPC_ADDR14_BRNTAKEN, /* type */
219 0, /* rightshift */
220 2, /* size (0 = byte, 1 = short, 2 = long) */
221 16, /* bitsize */
b34976b6 222 FALSE, /* pc_relative */
252b5132
RH
223 0, /* bitpos */
224 complain_overflow_bitfield, /* complain_on_overflow */
225 bfd_elf_generic_reloc, /* special_function */
226 "R_PPC_ADDR14_BRNTAKEN",/* name */
b34976b6 227 FALSE, /* partial_inplace */
252b5132
RH
228 0, /* src_mask */
229 0xfffc, /* dst_mask */
b34976b6 230 FALSE), /* pcrel_offset */
252b5132 231
8da6118f 232 /* A relative 26 bit branch; the lower two bits must be zero. */
252b5132
RH
233 HOWTO (R_PPC_REL24, /* type */
234 0, /* rightshift */
235 2, /* size (0 = byte, 1 = short, 2 = long) */
236 26, /* bitsize */
b34976b6 237 TRUE, /* pc_relative */
252b5132
RH
238 0, /* bitpos */
239 complain_overflow_signed, /* complain_on_overflow */
240 bfd_elf_generic_reloc, /* special_function */
241 "R_PPC_REL24", /* name */
b34976b6 242 FALSE, /* partial_inplace */
252b5132
RH
243 0, /* src_mask */
244 0x3fffffc, /* dst_mask */
b34976b6 245 TRUE), /* pcrel_offset */
252b5132 246
8da6118f 247 /* A relative 16 bit branch; the lower two bits must be zero. */
252b5132
RH
248 HOWTO (R_PPC_REL14, /* type */
249 0, /* rightshift */
250 2, /* size (0 = byte, 1 = short, 2 = long) */
251 16, /* bitsize */
b34976b6 252 TRUE, /* pc_relative */
252b5132
RH
253 0, /* bitpos */
254 complain_overflow_signed, /* complain_on_overflow */
255 bfd_elf_generic_reloc, /* special_function */
256 "R_PPC_REL14", /* name */
b34976b6 257 FALSE, /* partial_inplace */
252b5132
RH
258 0, /* src_mask */
259 0xfffc, /* dst_mask */
b34976b6 260 TRUE), /* pcrel_offset */
252b5132 261
8da6118f 262 /* A relative 16 bit branch. Bit 10 should be set to indicate that
252b5132
RH
263 the branch is expected to be taken. The lower two bits must be
264 zero. */
265 HOWTO (R_PPC_REL14_BRTAKEN, /* type */
266 0, /* rightshift */
267 2, /* size (0 = byte, 1 = short, 2 = long) */
268 16, /* bitsize */
b34976b6 269 TRUE, /* pc_relative */
252b5132
RH
270 0, /* bitpos */
271 complain_overflow_signed, /* complain_on_overflow */
272 bfd_elf_generic_reloc, /* special_function */
273 "R_PPC_REL14_BRTAKEN", /* name */
b34976b6 274 FALSE, /* partial_inplace */
252b5132
RH
275 0, /* src_mask */
276 0xfffc, /* dst_mask */
b34976b6 277 TRUE), /* pcrel_offset */
252b5132 278
8da6118f 279 /* A relative 16 bit branch. Bit 10 should be set to indicate that
252b5132
RH
280 the branch is not expected to be taken. The lower two bits must
281 be zero. */
282 HOWTO (R_PPC_REL14_BRNTAKEN, /* type */
283 0, /* rightshift */
284 2, /* size (0 = byte, 1 = short, 2 = long) */
285 16, /* bitsize */
b34976b6 286 TRUE, /* pc_relative */
252b5132
RH
287 0, /* bitpos */
288 complain_overflow_signed, /* complain_on_overflow */
289 bfd_elf_generic_reloc, /* special_function */
290 "R_PPC_REL14_BRNTAKEN",/* name */
b34976b6 291 FALSE, /* partial_inplace */
252b5132
RH
292 0, /* src_mask */
293 0xfffc, /* dst_mask */
b34976b6 294 TRUE), /* pcrel_offset */
252b5132
RH
295
296 /* Like R_PPC_ADDR16, but referring to the GOT table entry for the
297 symbol. */
298 HOWTO (R_PPC_GOT16, /* type */
299 0, /* rightshift */
300 1, /* size (0 = byte, 1 = short, 2 = long) */
301 16, /* bitsize */
b34976b6 302 FALSE, /* pc_relative */
252b5132
RH
303 0, /* bitpos */
304 complain_overflow_signed, /* complain_on_overflow */
305 bfd_elf_generic_reloc, /* special_function */
306 "R_PPC_GOT16", /* name */
b34976b6 307 FALSE, /* partial_inplace */
252b5132
RH
308 0, /* src_mask */
309 0xffff, /* dst_mask */
b34976b6 310 FALSE), /* pcrel_offset */
252b5132
RH
311
312 /* Like R_PPC_ADDR16_LO, but referring to the GOT table entry for
313 the symbol. */
314 HOWTO (R_PPC_GOT16_LO, /* type */
315 0, /* rightshift */
316 1, /* size (0 = byte, 1 = short, 2 = long) */
317 16, /* bitsize */
b34976b6 318 FALSE, /* pc_relative */
252b5132
RH
319 0, /* bitpos */
320 complain_overflow_dont, /* complain_on_overflow */
321 bfd_elf_generic_reloc, /* special_function */
322 "R_PPC_GOT16_LO", /* name */
b34976b6 323 FALSE, /* partial_inplace */
252b5132
RH
324 0, /* src_mask */
325 0xffff, /* dst_mask */
b34976b6 326 FALSE), /* pcrel_offset */
252b5132
RH
327
328 /* Like R_PPC_ADDR16_HI, but referring to the GOT table entry for
329 the symbol. */
330 HOWTO (R_PPC_GOT16_HI, /* type */
331 16, /* rightshift */
332 1, /* size (0 = byte, 1 = short, 2 = long) */
333 16, /* bitsize */
b34976b6 334 FALSE, /* pc_relative */
252b5132
RH
335 0, /* bitpos */
336 complain_overflow_bitfield, /* complain_on_overflow */
337 bfd_elf_generic_reloc, /* special_function */
338 "R_PPC_GOT16_HI", /* name */
b34976b6 339 FALSE, /* partial_inplace */
252b5132
RH
340 0, /* src_mask */
341 0xffff, /* dst_mask */
b34976b6 342 FALSE), /* pcrel_offset */
252b5132
RH
343
344 /* Like R_PPC_ADDR16_HA, but referring to the GOT table entry for
345 the symbol. */
346 HOWTO (R_PPC_GOT16_HA, /* type */
347 16, /* rightshift */
348 1, /* size (0 = byte, 1 = short, 2 = long) */
349 16, /* bitsize */
b34976b6 350 FALSE, /* pc_relative */
252b5132
RH
351 0, /* bitpos */
352 complain_overflow_bitfield, /* complain_on_overflow */
353 ppc_elf_addr16_ha_reloc, /* special_function */
354 "R_PPC_GOT16_HA", /* name */
b34976b6 355 FALSE, /* partial_inplace */
252b5132
RH
356 0, /* src_mask */
357 0xffff, /* dst_mask */
b34976b6 358 FALSE), /* pcrel_offset */
252b5132
RH
359
360 /* Like R_PPC_REL24, but referring to the procedure linkage table
361 entry for the symbol. */
362 HOWTO (R_PPC_PLTREL24, /* type */
363 0, /* rightshift */
364 2, /* size (0 = byte, 1 = short, 2 = long) */
365 26, /* bitsize */
b34976b6 366 TRUE, /* pc_relative */
252b5132
RH
367 0, /* bitpos */
368 complain_overflow_signed, /* complain_on_overflow */
369 bfd_elf_generic_reloc, /* special_function */
370 "R_PPC_PLTREL24", /* name */
b34976b6 371 FALSE, /* partial_inplace */
252b5132
RH
372 0, /* src_mask */
373 0x3fffffc, /* dst_mask */
b34976b6 374 TRUE), /* pcrel_offset */
252b5132
RH
375
376 /* This is used only by the dynamic linker. The symbol should exist
377 both in the object being run and in some shared library. The
378 dynamic linker copies the data addressed by the symbol from the
379 shared library into the object, because the object being
380 run has to have the data at some particular address. */
381 HOWTO (R_PPC_COPY, /* type */
382 0, /* rightshift */
383 2, /* size (0 = byte, 1 = short, 2 = long) */
384 32, /* bitsize */
b34976b6 385 FALSE, /* pc_relative */
252b5132
RH
386 0, /* bitpos */
387 complain_overflow_bitfield, /* complain_on_overflow */
388 bfd_elf_generic_reloc, /* special_function */
389 "R_PPC_COPY", /* name */
b34976b6 390 FALSE, /* partial_inplace */
252b5132
RH
391 0, /* src_mask */
392 0, /* dst_mask */
b34976b6 393 FALSE), /* pcrel_offset */
252b5132
RH
394
395 /* Like R_PPC_ADDR32, but used when setting global offset table
396 entries. */
397 HOWTO (R_PPC_GLOB_DAT, /* type */
398 0, /* rightshift */
399 2, /* size (0 = byte, 1 = short, 2 = long) */
400 32, /* bitsize */
b34976b6 401 FALSE, /* pc_relative */
252b5132
RH
402 0, /* bitpos */
403 complain_overflow_bitfield, /* complain_on_overflow */
404 bfd_elf_generic_reloc, /* special_function */
405 "R_PPC_GLOB_DAT", /* name */
b34976b6 406 FALSE, /* partial_inplace */
252b5132
RH
407 0, /* src_mask */
408 0xffffffff, /* dst_mask */
b34976b6 409 FALSE), /* pcrel_offset */
252b5132
RH
410
411 /* Marks a procedure linkage table entry for a symbol. */
412 HOWTO (R_PPC_JMP_SLOT, /* type */
413 0, /* rightshift */
414 2, /* size (0 = byte, 1 = short, 2 = long) */
415 32, /* bitsize */
b34976b6 416 FALSE, /* pc_relative */
252b5132
RH
417 0, /* bitpos */
418 complain_overflow_bitfield, /* complain_on_overflow */
419 bfd_elf_generic_reloc, /* special_function */
420 "R_PPC_JMP_SLOT", /* name */
b34976b6 421 FALSE, /* partial_inplace */
252b5132
RH
422 0, /* src_mask */
423 0, /* dst_mask */
b34976b6 424 FALSE), /* pcrel_offset */
252b5132
RH
425
426 /* Used only by the dynamic linker. When the object is run, this
427 longword is set to the load address of the object, plus the
428 addend. */
429 HOWTO (R_PPC_RELATIVE, /* type */
430 0, /* rightshift */
431 2, /* size (0 = byte, 1 = short, 2 = long) */
432 32, /* bitsize */
b34976b6 433 FALSE, /* pc_relative */
252b5132
RH
434 0, /* bitpos */
435 complain_overflow_bitfield, /* complain_on_overflow */
436 bfd_elf_generic_reloc, /* special_function */
437 "R_PPC_RELATIVE", /* name */
b34976b6 438 FALSE, /* partial_inplace */
252b5132
RH
439 0, /* src_mask */
440 0xffffffff, /* dst_mask */
b34976b6 441 FALSE), /* pcrel_offset */
252b5132
RH
442
443 /* Like R_PPC_REL24, but uses the value of the symbol within the
444 object rather than the final value. Normally used for
445 _GLOBAL_OFFSET_TABLE_. */
446 HOWTO (R_PPC_LOCAL24PC, /* type */
447 0, /* rightshift */
448 2, /* size (0 = byte, 1 = short, 2 = long) */
449 26, /* bitsize */
b34976b6 450 TRUE, /* pc_relative */
252b5132
RH
451 0, /* bitpos */
452 complain_overflow_signed, /* complain_on_overflow */
453 bfd_elf_generic_reloc, /* special_function */
454 "R_PPC_LOCAL24PC", /* name */
b34976b6 455 FALSE, /* partial_inplace */
252b5132
RH
456 0, /* src_mask */
457 0x3fffffc, /* dst_mask */
b34976b6 458 TRUE), /* pcrel_offset */
252b5132
RH
459
460 /* Like R_PPC_ADDR32, but may be unaligned. */
461 HOWTO (R_PPC_UADDR32, /* type */
462 0, /* rightshift */
463 2, /* size (0 = byte, 1 = short, 2 = long) */
464 32, /* bitsize */
b34976b6 465 FALSE, /* pc_relative */
252b5132
RH
466 0, /* bitpos */
467 complain_overflow_bitfield, /* complain_on_overflow */
468 bfd_elf_generic_reloc, /* special_function */
469 "R_PPC_UADDR32", /* name */
b34976b6 470 FALSE, /* partial_inplace */
252b5132
RH
471 0, /* src_mask */
472 0xffffffff, /* dst_mask */
b34976b6 473 FALSE), /* pcrel_offset */
252b5132
RH
474
475 /* Like R_PPC_ADDR16, but may be unaligned. */
476 HOWTO (R_PPC_UADDR16, /* type */
477 0, /* rightshift */
478 1, /* size (0 = byte, 1 = short, 2 = long) */
479 16, /* bitsize */
b34976b6 480 FALSE, /* pc_relative */
252b5132
RH
481 0, /* bitpos */
482 complain_overflow_bitfield, /* complain_on_overflow */
483 bfd_elf_generic_reloc, /* special_function */
484 "R_PPC_UADDR16", /* name */
b34976b6 485 FALSE, /* partial_inplace */
252b5132
RH
486 0, /* src_mask */
487 0xffff, /* dst_mask */
b34976b6 488 FALSE), /* pcrel_offset */
252b5132
RH
489
490 /* 32-bit PC relative */
491 HOWTO (R_PPC_REL32, /* type */
492 0, /* rightshift */
493 2, /* size (0 = byte, 1 = short, 2 = long) */
494 32, /* bitsize */
b34976b6 495 TRUE, /* pc_relative */
252b5132
RH
496 0, /* bitpos */
497 complain_overflow_bitfield, /* complain_on_overflow */
498 bfd_elf_generic_reloc, /* special_function */
499 "R_PPC_REL32", /* name */
b34976b6 500 FALSE, /* partial_inplace */
252b5132
RH
501 0, /* src_mask */
502 0xffffffff, /* dst_mask */
b34976b6 503 TRUE), /* pcrel_offset */
252b5132
RH
504
505 /* 32-bit relocation to the symbol's procedure linkage table.
c3668558 506 FIXME: not supported. */
252b5132
RH
507 HOWTO (R_PPC_PLT32, /* type */
508 0, /* rightshift */
509 2, /* size (0 = byte, 1 = short, 2 = long) */
510 32, /* bitsize */
b34976b6 511 FALSE, /* pc_relative */
252b5132
RH
512 0, /* bitpos */
513 complain_overflow_bitfield, /* complain_on_overflow */
514 bfd_elf_generic_reloc, /* special_function */
515 "R_PPC_PLT32", /* name */
b34976b6 516 FALSE, /* partial_inplace */
252b5132
RH
517 0, /* src_mask */
518 0, /* dst_mask */
b34976b6 519 FALSE), /* pcrel_offset */
252b5132
RH
520
521 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
c3668558 522 FIXME: not supported. */
252b5132
RH
523 HOWTO (R_PPC_PLTREL32, /* type */
524 0, /* rightshift */
525 2, /* size (0 = byte, 1 = short, 2 = long) */
526 32, /* bitsize */
b34976b6 527 TRUE, /* pc_relative */
252b5132
RH
528 0, /* bitpos */
529 complain_overflow_bitfield, /* complain_on_overflow */
530 bfd_elf_generic_reloc, /* special_function */
531 "R_PPC_PLTREL32", /* name */
b34976b6 532 FALSE, /* partial_inplace */
252b5132
RH
533 0, /* src_mask */
534 0, /* dst_mask */
b34976b6 535 TRUE), /* pcrel_offset */
252b5132
RH
536
537 /* Like R_PPC_ADDR16_LO, but referring to the PLT table entry for
538 the symbol. */
539 HOWTO (R_PPC_PLT16_LO, /* type */
540 0, /* rightshift */
541 1, /* size (0 = byte, 1 = short, 2 = long) */
542 16, /* bitsize */
b34976b6 543 FALSE, /* pc_relative */
252b5132
RH
544 0, /* bitpos */
545 complain_overflow_dont, /* complain_on_overflow */
546 bfd_elf_generic_reloc, /* special_function */
547 "R_PPC_PLT16_LO", /* name */
b34976b6 548 FALSE, /* partial_inplace */
252b5132
RH
549 0, /* src_mask */
550 0xffff, /* dst_mask */
b34976b6 551 FALSE), /* pcrel_offset */
252b5132
RH
552
553 /* Like R_PPC_ADDR16_HI, but referring to the PLT table entry for
554 the symbol. */
555 HOWTO (R_PPC_PLT16_HI, /* type */
556 16, /* rightshift */
557 1, /* size (0 = byte, 1 = short, 2 = long) */
558 16, /* bitsize */
b34976b6 559 FALSE, /* pc_relative */
252b5132
RH
560 0, /* bitpos */
561 complain_overflow_bitfield, /* complain_on_overflow */
562 bfd_elf_generic_reloc, /* special_function */
563 "R_PPC_PLT16_HI", /* name */
b34976b6 564 FALSE, /* partial_inplace */
252b5132
RH
565 0, /* src_mask */
566 0xffff, /* dst_mask */
b34976b6 567 FALSE), /* pcrel_offset */
252b5132
RH
568
569 /* Like R_PPC_ADDR16_HA, but referring to the PLT table entry for
570 the symbol. */
571 HOWTO (R_PPC_PLT16_HA, /* type */
572 16, /* rightshift */
573 1, /* size (0 = byte, 1 = short, 2 = long) */
574 16, /* bitsize */
b34976b6 575 FALSE, /* pc_relative */
252b5132
RH
576 0, /* bitpos */
577 complain_overflow_bitfield, /* complain_on_overflow */
578 ppc_elf_addr16_ha_reloc, /* special_function */
579 "R_PPC_PLT16_HA", /* name */
b34976b6 580 FALSE, /* partial_inplace */
252b5132
RH
581 0, /* src_mask */
582 0xffff, /* dst_mask */
b34976b6 583 FALSE), /* pcrel_offset */
252b5132
RH
584
585 /* A sign-extended 16 bit value relative to _SDA_BASE_, for use with
586 small data items. */
587 HOWTO (R_PPC_SDAREL16, /* type */
588 0, /* rightshift */
589 1, /* size (0 = byte, 1 = short, 2 = long) */
590 16, /* bitsize */
b34976b6 591 FALSE, /* pc_relative */
252b5132
RH
592 0, /* bitpos */
593 complain_overflow_signed, /* complain_on_overflow */
594 bfd_elf_generic_reloc, /* special_function */
595 "R_PPC_SDAREL16", /* name */
b34976b6 596 FALSE, /* partial_inplace */
252b5132
RH
597 0, /* src_mask */
598 0xffff, /* dst_mask */
b34976b6 599 FALSE), /* pcrel_offset */
252b5132 600
c061c2d8 601 /* 16-bit section relative relocation. */
252b5132
RH
602 HOWTO (R_PPC_SECTOFF, /* type */
603 0, /* rightshift */
c061c2d8
AM
604 1, /* size (0 = byte, 1 = short, 2 = long) */
605 16, /* bitsize */
b34976b6 606 FALSE, /* pc_relative */
252b5132
RH
607 0, /* bitpos */
608 complain_overflow_bitfield, /* complain_on_overflow */
609 bfd_elf_generic_reloc, /* special_function */
610 "R_PPC_SECTOFF", /* name */
b34976b6 611 FALSE, /* partial_inplace */
252b5132 612 0, /* src_mask */
c061c2d8 613 0xffff, /* dst_mask */
b34976b6 614 FALSE), /* pcrel_offset */
252b5132 615
c3668558 616 /* 16-bit lower half section relative relocation. */
252b5132
RH
617 HOWTO (R_PPC_SECTOFF_LO, /* type */
618 0, /* rightshift */
619 1, /* size (0 = byte, 1 = short, 2 = long) */
620 16, /* bitsize */
b34976b6 621 FALSE, /* pc_relative */
252b5132
RH
622 0, /* bitpos */
623 complain_overflow_dont, /* complain_on_overflow */
624 bfd_elf_generic_reloc, /* special_function */
625 "R_PPC_SECTOFF_LO", /* name */
b34976b6 626 FALSE, /* partial_inplace */
252b5132
RH
627 0, /* src_mask */
628 0xffff, /* dst_mask */
b34976b6 629 FALSE), /* pcrel_offset */
252b5132 630
c3668558 631 /* 16-bit upper half section relative relocation. */
252b5132
RH
632 HOWTO (R_PPC_SECTOFF_HI, /* type */
633 16, /* rightshift */
634 1, /* size (0 = byte, 1 = short, 2 = long) */
635 16, /* bitsize */
b34976b6 636 FALSE, /* pc_relative */
252b5132
RH
637 0, /* bitpos */
638 complain_overflow_bitfield, /* complain_on_overflow */
639 bfd_elf_generic_reloc, /* special_function */
640 "R_PPC_SECTOFF_HI", /* name */
b34976b6 641 FALSE, /* partial_inplace */
252b5132
RH
642 0, /* src_mask */
643 0xffff, /* dst_mask */
b34976b6 644 FALSE), /* pcrel_offset */
252b5132 645
c3668558 646 /* 16-bit upper half adjusted section relative relocation. */
252b5132
RH
647 HOWTO (R_PPC_SECTOFF_HA, /* type */
648 16, /* rightshift */
649 1, /* size (0 = byte, 1 = short, 2 = long) */
650 16, /* bitsize */
b34976b6 651 FALSE, /* pc_relative */
252b5132
RH
652 0, /* bitpos */
653 complain_overflow_bitfield, /* complain_on_overflow */
654 ppc_elf_addr16_ha_reloc, /* special_function */
655 "R_PPC_SECTOFF_HA", /* name */
b34976b6 656 FALSE, /* partial_inplace */
252b5132
RH
657 0, /* src_mask */
658 0xffff, /* dst_mask */
b34976b6 659 FALSE), /* pcrel_offset */
252b5132 660
7619e7c7
AM
661 /* Marker reloc for TLS. */
662 HOWTO (R_PPC_TLS,
252b5132
RH
663 0, /* rightshift */
664 2, /* size (0 = byte, 1 = short, 2 = long) */
665 32, /* bitsize */
b34976b6 666 FALSE, /* pc_relative */
252b5132 667 0, /* bitpos */
7619e7c7 668 complain_overflow_dont, /* complain_on_overflow */
252b5132 669 bfd_elf_generic_reloc, /* special_function */
7619e7c7
AM
670 "R_PPC_TLS", /* name */
671 FALSE, /* partial_inplace */
672 0, /* src_mask */
673 0, /* dst_mask */
674 FALSE), /* pcrel_offset */
675
676 /* Computes the load module index of the load module that contains the
677 definition of its TLS sym. */
678 HOWTO (R_PPC_DTPMOD32,
679 0, /* rightshift */
680 2, /* size (0 = byte, 1 = short, 2 = long) */
681 32, /* bitsize */
682 FALSE, /* pc_relative */
683 0, /* bitpos */
684 complain_overflow_dont, /* complain_on_overflow */
685 ppc_elf_unhandled_reloc, /* special_function */
686 "R_PPC_DTPMOD32", /* name */
b34976b6 687 FALSE, /* partial_inplace */
252b5132
RH
688 0, /* src_mask */
689 0xffffffff, /* dst_mask */
b34976b6 690 FALSE), /* pcrel_offset */
252b5132 691
7619e7c7
AM
692 /* Computes a dtv-relative displacement, the difference between the value
693 of sym+add and the base address of the thread-local storage block that
694 contains the definition of sym, minus 0x8000. */
695 HOWTO (R_PPC_DTPREL32,
696 0, /* rightshift */
697 2, /* size (0 = byte, 1 = short, 2 = long) */
698 32, /* bitsize */
699 FALSE, /* pc_relative */
700 0, /* bitpos */
701 complain_overflow_dont, /* complain_on_overflow */
702 ppc_elf_unhandled_reloc, /* special_function */
703 "R_PPC_DTPREL32", /* name */
704 FALSE, /* partial_inplace */
705 0, /* src_mask */
706 0xffffffff, /* dst_mask */
707 FALSE), /* pcrel_offset */
708
709 /* A 16 bit dtprel reloc. */
710 HOWTO (R_PPC_DTPREL16,
252b5132
RH
711 0, /* rightshift */
712 1, /* size (0 = byte, 1 = short, 2 = long) */
713 16, /* bitsize */
b34976b6 714 FALSE, /* pc_relative */
252b5132 715 0, /* bitpos */
7619e7c7
AM
716 complain_overflow_signed, /* complain_on_overflow */
717 ppc_elf_unhandled_reloc, /* special_function */
718 "R_PPC_DTPREL16", /* name */
b34976b6 719 FALSE, /* partial_inplace */
252b5132
RH
720 0, /* src_mask */
721 0xffff, /* dst_mask */
b34976b6 722 FALSE), /* pcrel_offset */
252b5132 723
7619e7c7
AM
724 /* Like DTPREL16, but no overflow. */
725 HOWTO (R_PPC_DTPREL16_LO,
252b5132
RH
726 0, /* rightshift */
727 1, /* size (0 = byte, 1 = short, 2 = long) */
728 16, /* bitsize */
b34976b6 729 FALSE, /* pc_relative */
252b5132 730 0, /* bitpos */
7619e7c7
AM
731 complain_overflow_dont, /* complain_on_overflow */
732 ppc_elf_unhandled_reloc, /* special_function */
733 "R_PPC_DTPREL16_LO", /* name */
b34976b6 734 FALSE, /* partial_inplace */
252b5132
RH
735 0, /* src_mask */
736 0xffff, /* dst_mask */
b34976b6 737 FALSE), /* pcrel_offset */
252b5132 738
7619e7c7
AM
739 /* Like DTPREL16_LO, but next higher group of 16 bits. */
740 HOWTO (R_PPC_DTPREL16_HI,
252b5132
RH
741 16, /* rightshift */
742 1, /* size (0 = byte, 1 = short, 2 = long) */
743 16, /* bitsize */
b34976b6 744 FALSE, /* pc_relative */
252b5132
RH
745 0, /* bitpos */
746 complain_overflow_dont, /* complain_on_overflow */
7619e7c7
AM
747 ppc_elf_unhandled_reloc, /* special_function */
748 "R_PPC_DTPREL16_HI", /* name */
b34976b6 749 FALSE, /* partial_inplace */
252b5132
RH
750 0, /* src_mask */
751 0xffff, /* dst_mask */
b34976b6 752 FALSE), /* pcrel_offset */
252b5132 753
7619e7c7
AM
754 /* Like DTPREL16_HI, but adjust for low 16 bits. */
755 HOWTO (R_PPC_DTPREL16_HA,
252b5132
RH
756 16, /* rightshift */
757 1, /* size (0 = byte, 1 = short, 2 = long) */
758 16, /* bitsize */
b34976b6 759 FALSE, /* pc_relative */
252b5132
RH
760 0, /* bitpos */
761 complain_overflow_dont, /* complain_on_overflow */
7619e7c7
AM
762 ppc_elf_unhandled_reloc, /* special_function */
763 "R_PPC_DTPREL16_HA", /* name */
b34976b6 764 FALSE, /* partial_inplace */
252b5132
RH
765 0, /* src_mask */
766 0xffff, /* dst_mask */
b34976b6 767 FALSE), /* pcrel_offset */
252b5132 768
7619e7c7
AM
769 /* Computes a tp-relative displacement, the difference between the value of
770 sym+add and the value of the thread pointer (r13). */
771 HOWTO (R_PPC_TPREL32,
772 0, /* rightshift */
773 2, /* size (0 = byte, 1 = short, 2 = long) */
774 32, /* bitsize */
775 FALSE, /* pc_relative */
776 0, /* bitpos */
777 complain_overflow_dont, /* complain_on_overflow */
778 ppc_elf_unhandled_reloc, /* special_function */
779 "R_PPC_TPREL32", /* name */
780 FALSE, /* partial_inplace */
781 0, /* src_mask */
782 0xffffffff, /* dst_mask */
783 FALSE), /* pcrel_offset */
784
785 /* A 16 bit tprel reloc. */
786 HOWTO (R_PPC_TPREL16,
252b5132
RH
787 0, /* rightshift */
788 1, /* size (0 = byte, 1 = short, 2 = long) */
789 16, /* bitsize */
b34976b6 790 FALSE, /* pc_relative */
252b5132 791 0, /* bitpos */
7619e7c7
AM
792 complain_overflow_signed, /* complain_on_overflow */
793 ppc_elf_unhandled_reloc, /* special_function */
794 "R_PPC_TPREL16", /* name */
b34976b6 795 FALSE, /* partial_inplace */
252b5132
RH
796 0, /* src_mask */
797 0xffff, /* dst_mask */
b34976b6 798 FALSE), /* pcrel_offset */
252b5132 799
7619e7c7
AM
800 /* Like TPREL16, but no overflow. */
801 HOWTO (R_PPC_TPREL16_LO,
252b5132
RH
802 0, /* rightshift */
803 1, /* size (0 = byte, 1 = short, 2 = long) */
804 16, /* bitsize */
b34976b6 805 FALSE, /* pc_relative */
252b5132 806 0, /* bitpos */
7619e7c7
AM
807 complain_overflow_dont, /* complain_on_overflow */
808 ppc_elf_unhandled_reloc, /* special_function */
809 "R_PPC_TPREL16_LO", /* name */
b34976b6 810 FALSE, /* partial_inplace */
252b5132
RH
811 0, /* src_mask */
812 0xffff, /* dst_mask */
b34976b6 813 FALSE), /* pcrel_offset */
252b5132 814
7619e7c7
AM
815 /* Like TPREL16_LO, but next higher group of 16 bits. */
816 HOWTO (R_PPC_TPREL16_HI,
817 16, /* rightshift */
818 1, /* size (0 = byte, 1 = short, 2 = long) */
819 16, /* bitsize */
820 FALSE, /* pc_relative */
821 0, /* bitpos */
822 complain_overflow_dont, /* complain_on_overflow */
823 ppc_elf_unhandled_reloc, /* special_function */
824 "R_PPC_TPREL16_HI", /* name */
825 FALSE, /* partial_inplace */
826 0, /* src_mask */
827 0xffff, /* dst_mask */
828 FALSE), /* pcrel_offset */
829
830 /* Like TPREL16_HI, but adjust for low 16 bits. */
831 HOWTO (R_PPC_TPREL16_HA,
832 16, /* rightshift */
833 1, /* size (0 = byte, 1 = short, 2 = long) */
834 16, /* bitsize */
835 FALSE, /* pc_relative */
836 0, /* bitpos */
837 complain_overflow_dont, /* complain_on_overflow */
838 ppc_elf_unhandled_reloc, /* special_function */
839 "R_PPC_TPREL16_HA", /* name */
840 FALSE, /* partial_inplace */
841 0, /* src_mask */
842 0xffff, /* dst_mask */
843 FALSE), /* pcrel_offset */
844
845 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
846 with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
847 to the first entry. */
848 HOWTO (R_PPC_GOT_TLSGD16,
252b5132
RH
849 0, /* rightshift */
850 1, /* size (0 = byte, 1 = short, 2 = long) */
851 16, /* bitsize */
b34976b6 852 FALSE, /* pc_relative */
252b5132
RH
853 0, /* bitpos */
854 complain_overflow_signed, /* complain_on_overflow */
7619e7c7
AM
855 ppc_elf_unhandled_reloc, /* special_function */
856 "R_PPC_GOT_TLSGD16", /* name */
b34976b6 857 FALSE, /* partial_inplace */
252b5132
RH
858 0, /* src_mask */
859 0xffff, /* dst_mask */
b34976b6 860 FALSE), /* pcrel_offset */
252b5132 861
7619e7c7
AM
862 /* Like GOT_TLSGD16, but no overflow. */
863 HOWTO (R_PPC_GOT_TLSGD16_LO,
252b5132 864 0, /* rightshift */
7619e7c7 865 1, /* size (0 = byte, 1 = short, 2 = long) */
252b5132 866 16, /* bitsize */
b34976b6 867 FALSE, /* pc_relative */
252b5132 868 0, /* bitpos */
7619e7c7
AM
869 complain_overflow_dont, /* complain_on_overflow */
870 ppc_elf_unhandled_reloc, /* special_function */
871 "R_PPC_GOT_TLSGD16_LO", /* name */
b34976b6 872 FALSE, /* partial_inplace */
252b5132
RH
873 0, /* src_mask */
874 0xffff, /* dst_mask */
b34976b6 875 FALSE), /* pcrel_offset */
252b5132 876
7619e7c7
AM
877 /* Like GOT_TLSGD16_LO, but next higher group of 16 bits. */
878 HOWTO (R_PPC_GOT_TLSGD16_HI,
879 16, /* rightshift */
880 1, /* size (0 = byte, 1 = short, 2 = long) */
881 16, /* bitsize */
882 FALSE, /* pc_relative */
883 0, /* bitpos */
884 complain_overflow_dont, /* complain_on_overflow */
885 ppc_elf_unhandled_reloc, /* special_function */
886 "R_PPC_GOT_TLSGD16_HI", /* name */
887 FALSE, /* partial_inplace */
888 0, /* src_mask */
889 0xffff, /* dst_mask */
890 FALSE), /* pcrel_offset */
252b5132 891
7619e7c7
AM
892 /* Like GOT_TLSGD16_HI, but adjust for low 16 bits. */
893 HOWTO (R_PPC_GOT_TLSGD16_HA,
894 16, /* rightshift */
895 1, /* size (0 = byte, 1 = short, 2 = long) */
896 16, /* bitsize */
897 FALSE, /* pc_relative */
898 0, /* bitpos */
899 complain_overflow_dont, /* complain_on_overflow */
900 ppc_elf_unhandled_reloc, /* special_function */
901 "R_PPC_GOT_TLSGD16_HA", /* name */
902 FALSE, /* partial_inplace */
903 0, /* src_mask */
904 0xffff, /* dst_mask */
905 FALSE), /* pcrel_offset */
906
907 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
908 with values (sym+add)@dtpmod and zero, and computes the offset to the
909 first entry. */
910 HOWTO (R_PPC_GOT_TLSLD16,
252b5132
RH
911 0, /* rightshift */
912 1, /* size (0 = byte, 1 = short, 2 = long) */
913 16, /* bitsize */
7619e7c7 914 FALSE, /* pc_relative */
252b5132
RH
915 0, /* bitpos */
916 complain_overflow_signed, /* complain_on_overflow */
7619e7c7
AM
917 ppc_elf_unhandled_reloc, /* special_function */
918 "R_PPC_GOT_TLSLD16", /* name */
b34976b6 919 FALSE, /* partial_inplace */
252b5132
RH
920 0, /* src_mask */
921 0xffff, /* dst_mask */
b34976b6 922 FALSE), /* pcrel_offset */
252b5132 923
7619e7c7
AM
924 /* Like GOT_TLSLD16, but no overflow. */
925 HOWTO (R_PPC_GOT_TLSLD16_LO,
252b5132 926 0, /* rightshift */
7619e7c7
AM
927 1, /* size (0 = byte, 1 = short, 2 = long) */
928 16, /* bitsize */
b34976b6 929 FALSE, /* pc_relative */
252b5132
RH
930 0, /* bitpos */
931 complain_overflow_dont, /* complain_on_overflow */
7619e7c7
AM
932 ppc_elf_unhandled_reloc, /* special_function */
933 "R_PPC_GOT_TLSLD16_LO", /* name */
b34976b6 934 FALSE, /* partial_inplace */
252b5132 935 0, /* src_mask */
7619e7c7 936 0xffff, /* dst_mask */
b34976b6 937 FALSE), /* pcrel_offset */
252b5132 938
7619e7c7
AM
939 /* Like GOT_TLSLD16_LO, but next higher group of 16 bits. */
940 HOWTO (R_PPC_GOT_TLSLD16_HI,
941 16, /* rightshift */
942 1, /* size (0 = byte, 1 = short, 2 = long) */
943 16, /* bitsize */
b34976b6 944 FALSE, /* pc_relative */
252b5132
RH
945 0, /* bitpos */
946 complain_overflow_dont, /* complain_on_overflow */
7619e7c7
AM
947 ppc_elf_unhandled_reloc, /* special_function */
948 "R_PPC_GOT_TLSLD16_HI", /* name */
b34976b6 949 FALSE, /* partial_inplace */
252b5132 950 0, /* src_mask */
7619e7c7 951 0xffff, /* dst_mask */
b34976b6 952 FALSE), /* pcrel_offset */
252b5132 953
7619e7c7
AM
954 /* Like GOT_TLSLD16_HI, but adjust for low 16 bits. */
955 HOWTO (R_PPC_GOT_TLSLD16_HA,
956 16, /* rightshift */
957 1, /* size (0 = byte, 1 = short, 2 = long) */
958 16, /* bitsize */
959 FALSE, /* pc_relative */
960 0, /* bitpos */
961 complain_overflow_dont, /* complain_on_overflow */
962 ppc_elf_unhandled_reloc, /* special_function */
963 "R_PPC_GOT_TLSLD16_HA", /* name */
964 FALSE, /* partial_inplace */
965 0, /* src_mask */
966 0xffff, /* dst_mask */
967 FALSE), /* pcrel_offset */
968
969 /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
970 the offset to the entry. */
971 HOWTO (R_PPC_GOT_DTPREL16,
252b5132
RH
972 0, /* rightshift */
973 1, /* size (0 = byte, 1 = short, 2 = long) */
974 16, /* bitsize */
b34976b6 975 FALSE, /* pc_relative */
252b5132
RH
976 0, /* bitpos */
977 complain_overflow_signed, /* complain_on_overflow */
7619e7c7
AM
978 ppc_elf_unhandled_reloc, /* special_function */
979 "R_PPC_GOT_DTPREL16", /* name */
b34976b6 980 FALSE, /* partial_inplace */
252b5132
RH
981 0, /* src_mask */
982 0xffff, /* dst_mask */
b34976b6 983 FALSE), /* pcrel_offset */
252b5132 984
7619e7c7
AM
985 /* Like GOT_DTPREL16, but no overflow. */
986 HOWTO (R_PPC_GOT_DTPREL16_LO,
987 0, /* rightshift */
988 1, /* size (0 = byte, 1 = short, 2 = long) */
989 16, /* bitsize */
990 FALSE, /* pc_relative */
991 0, /* bitpos */
992 complain_overflow_dont, /* complain_on_overflow */
993 ppc_elf_unhandled_reloc, /* special_function */
994 "R_PPC_GOT_DTPREL16_LO", /* name */
995 FALSE, /* partial_inplace */
996 0, /* src_mask */
997 0xffff, /* dst_mask */
998 FALSE), /* pcrel_offset */
252b5132 999
7619e7c7
AM
1000 /* Like GOT_DTPREL16_LO, but next higher group of 16 bits. */
1001 HOWTO (R_PPC_GOT_DTPREL16_HI,
1002 16, /* rightshift */
1003 1, /* size (0 = byte, 1 = short, 2 = long) */
1004 16, /* bitsize */
1005 FALSE, /* pc_relative */
1006 0, /* bitpos */
1007 complain_overflow_dont, /* complain_on_overflow */
1008 ppc_elf_unhandled_reloc, /* special_function */
1009 "R_PPC_GOT_DTPREL16_HI", /* name */
1010 FALSE, /* partial_inplace */
1011 0, /* src_mask */
1012 0xffff, /* dst_mask */
1013 FALSE), /* pcrel_offset */
252b5132 1014
7619e7c7
AM
1015 /* Like GOT_DTPREL16_HI, but adjust for low 16 bits. */
1016 HOWTO (R_PPC_GOT_DTPREL16_HA,
1017 16, /* rightshift */
1018 1, /* size (0 = byte, 1 = short, 2 = long) */
1019 16, /* bitsize */
1020 FALSE, /* pc_relative */
1021 0, /* bitpos */
1022 complain_overflow_dont, /* complain_on_overflow */
1023 ppc_elf_unhandled_reloc, /* special_function */
1024 "R_PPC_GOT_DTPREL16_HA", /* name */
1025 FALSE, /* partial_inplace */
1026 0, /* src_mask */
1027 0xffff, /* dst_mask */
1028 FALSE), /* pcrel_offset */
c3668558 1029
7619e7c7
AM
1030 /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1031 offset to the entry. */
1032 HOWTO (R_PPC_GOT_TPREL16,
1033 0, /* rightshift */
1034 1, /* size (0 = byte, 1 = short, 2 = long) */
1035 16, /* bitsize */
1036 FALSE, /* pc_relative */
1037 0, /* bitpos */
1038 complain_overflow_signed, /* complain_on_overflow */
1039 ppc_elf_unhandled_reloc, /* special_function */
1040 "R_PPC_GOT_TPREL16", /* name */
1041 FALSE, /* partial_inplace */
1042 0, /* src_mask */
1043 0xffff, /* dst_mask */
1044 FALSE), /* pcrel_offset */
1045
1046 /* Like GOT_TPREL16, but no overflow. */
1047 HOWTO (R_PPC_GOT_TPREL16_LO,
1048 0, /* rightshift */
1049 1, /* size (0 = byte, 1 = short, 2 = long) */
1050 16, /* bitsize */
1051 FALSE, /* pc_relative */
1052 0, /* bitpos */
1053 complain_overflow_dont, /* complain_on_overflow */
1054 ppc_elf_unhandled_reloc, /* special_function */
1055 "R_PPC_GOT_TPREL16_LO", /* name */
1056 FALSE, /* partial_inplace */
1057 0, /* src_mask */
1058 0xffff, /* dst_mask */
1059 FALSE), /* pcrel_offset */
1060
1061 /* Like GOT_TPREL16_LO, but next higher group of 16 bits. */
1062 HOWTO (R_PPC_GOT_TPREL16_HI,
1063 16, /* rightshift */
1064 1, /* size (0 = byte, 1 = short, 2 = long) */
1065 16, /* bitsize */
1066 FALSE, /* pc_relative */
1067 0, /* bitpos */
1068 complain_overflow_dont, /* complain_on_overflow */
1069 ppc_elf_unhandled_reloc, /* special_function */
1070 "R_PPC_GOT_TPREL16_HI", /* name */
1071 FALSE, /* partial_inplace */
1072 0, /* src_mask */
1073 0xffff, /* dst_mask */
1074 FALSE), /* pcrel_offset */
1075
1076 /* Like GOT_TPREL16_HI, but adjust for low 16 bits. */
1077 HOWTO (R_PPC_GOT_TPREL16_HA,
1078 16, /* rightshift */
1079 1, /* size (0 = byte, 1 = short, 2 = long) */
1080 16, /* bitsize */
1081 FALSE, /* pc_relative */
1082 0, /* bitpos */
1083 complain_overflow_dont, /* complain_on_overflow */
1084 ppc_elf_unhandled_reloc, /* special_function */
1085 "R_PPC_GOT_TPREL16_HA", /* name */
1086 FALSE, /* partial_inplace */
1087 0, /* src_mask */
1088 0xffff, /* dst_mask */
1089 FALSE), /* pcrel_offset */
1090
1091 /* The remaining relocs are from the Embedded ELF ABI, and are not
1092 in the SVR4 ELF ABI. */
1093
1094 /* 32 bit value resulting from the addend minus the symbol. */
1095 HOWTO (R_PPC_EMB_NADDR32, /* type */
1096 0, /* rightshift */
1097 2, /* size (0 = byte, 1 = short, 2 = long) */
1098 32, /* bitsize */
1099 FALSE, /* pc_relative */
1100 0, /* bitpos */
1101 complain_overflow_bitfield, /* complain_on_overflow */
1102 bfd_elf_generic_reloc, /* special_function */
1103 "R_PPC_EMB_NADDR32", /* name */
1104 FALSE, /* partial_inplace */
1105 0, /* src_mask */
1106 0xffffffff, /* dst_mask */
1107 FALSE), /* pcrel_offset */
1108
1109 /* 16 bit value resulting from the addend minus the symbol. */
1110 HOWTO (R_PPC_EMB_NADDR16, /* type */
1111 0, /* rightshift */
1112 1, /* size (0 = byte, 1 = short, 2 = long) */
1113 16, /* bitsize */
1114 FALSE, /* pc_relative */
1115 0, /* bitpos */
1116 complain_overflow_bitfield, /* complain_on_overflow */
1117 bfd_elf_generic_reloc, /* special_function */
1118 "R_PPC_EMB_NADDR16", /* name */
1119 FALSE, /* partial_inplace */
1120 0, /* src_mask */
1121 0xffff, /* dst_mask */
1122 FALSE), /* pcrel_offset */
1123
1124 /* 16 bit value resulting from the addend minus the symbol. */
1125 HOWTO (R_PPC_EMB_NADDR16_LO, /* type */
1126 0, /* rightshift */
1127 1, /* size (0 = byte, 1 = short, 2 = long) */
1128 16, /* bitsize */
1129 FALSE, /* pc_relative */
1130 0, /* bitpos */
1131 complain_overflow_dont,/* complain_on_overflow */
1132 bfd_elf_generic_reloc, /* special_function */
1133 "R_PPC_EMB_ADDR16_LO", /* name */
1134 FALSE, /* partial_inplace */
1135 0, /* src_mask */
1136 0xffff, /* dst_mask */
1137 FALSE), /* pcrel_offset */
1138
1139 /* The high order 16 bits of the addend minus the symbol. */
1140 HOWTO (R_PPC_EMB_NADDR16_HI, /* type */
1141 16, /* rightshift */
1142 1, /* size (0 = byte, 1 = short, 2 = long) */
1143 16, /* bitsize */
1144 FALSE, /* pc_relative */
1145 0, /* bitpos */
1146 complain_overflow_dont, /* complain_on_overflow */
1147 bfd_elf_generic_reloc, /* special_function */
1148 "R_PPC_EMB_NADDR16_HI", /* name */
1149 FALSE, /* partial_inplace */
1150 0, /* src_mask */
1151 0xffff, /* dst_mask */
1152 FALSE), /* pcrel_offset */
1153
1154 /* The high order 16 bits of the result of the addend minus the address,
1155 plus 1 if the contents of the low 16 bits, treated as a signed number,
1156 is negative. */
1157 HOWTO (R_PPC_EMB_NADDR16_HA, /* type */
1158 16, /* rightshift */
1159 1, /* size (0 = byte, 1 = short, 2 = long) */
1160 16, /* bitsize */
1161 FALSE, /* pc_relative */
1162 0, /* bitpos */
1163 complain_overflow_dont, /* complain_on_overflow */
25dbc73a
AM
1164 ppc_elf_addr16_ha_reloc, /* special_function */
1165 "R_PPC_EMB_NADDR16_HA", /* name */
1166 FALSE, /* partial_inplace */
1167 0, /* src_mask */
1168 0xffff, /* dst_mask */
1169 FALSE), /* pcrel_offset */
1170
1171 /* 16 bit value resulting from allocating a 4 byte word to hold an
1172 address in the .sdata section, and returning the offset from
1173 _SDA_BASE_ for that relocation. */
1174 HOWTO (R_PPC_EMB_SDAI16, /* type */
1175 0, /* rightshift */
1176 1, /* size (0 = byte, 1 = short, 2 = long) */
1177 16, /* bitsize */
1178 FALSE, /* pc_relative */
1179 0, /* bitpos */
1180 complain_overflow_bitfield, /* complain_on_overflow */
1181 bfd_elf_generic_reloc, /* special_function */
1182 "R_PPC_EMB_SDAI16", /* name */
1183 FALSE, /* partial_inplace */
1184 0, /* src_mask */
1185 0xffff, /* dst_mask */
1186 FALSE), /* pcrel_offset */
1187
1188 /* 16 bit value resulting from allocating a 4 byte word to hold an
1189 address in the .sdata2 section, and returning the offset from
1190 _SDA2_BASE_ for that relocation. */
1191 HOWTO (R_PPC_EMB_SDA2I16, /* type */
1192 0, /* rightshift */
1193 1, /* size (0 = byte, 1 = short, 2 = long) */
1194 16, /* bitsize */
1195 FALSE, /* pc_relative */
1196 0, /* bitpos */
1197 complain_overflow_bitfield, /* complain_on_overflow */
1198 bfd_elf_generic_reloc, /* special_function */
1199 "R_PPC_EMB_SDA2I16", /* name */
1200 FALSE, /* partial_inplace */
1201 0, /* src_mask */
1202 0xffff, /* dst_mask */
1203 FALSE), /* pcrel_offset */
1204
1205 /* A sign-extended 16 bit value relative to _SDA2_BASE_, for use with
1206 small data items. */
1207 HOWTO (R_PPC_EMB_SDA2REL, /* type */
1208 0, /* rightshift */
1209 1, /* size (0 = byte, 1 = short, 2 = long) */
1210 16, /* bitsize */
1211 FALSE, /* pc_relative */
1212 0, /* bitpos */
1213 complain_overflow_signed, /* complain_on_overflow */
1214 bfd_elf_generic_reloc, /* special_function */
1215 "R_PPC_EMB_SDA2REL", /* name */
1216 FALSE, /* partial_inplace */
1217 0, /* src_mask */
1218 0xffff, /* dst_mask */
1219 FALSE), /* pcrel_offset */
1220
1221 /* Relocate against either _SDA_BASE_ or _SDA2_BASE_, filling in the 16 bit
1222 signed offset from the appropriate base, and filling in the register
1223 field with the appropriate register (0, 2, or 13). */
1224 HOWTO (R_PPC_EMB_SDA21, /* type */
1225 0, /* rightshift */
1226 2, /* size (0 = byte, 1 = short, 2 = long) */
1227 16, /* bitsize */
1228 FALSE, /* pc_relative */
1229 0, /* bitpos */
1230 complain_overflow_signed, /* complain_on_overflow */
1231 bfd_elf_generic_reloc, /* special_function */
1232 "R_PPC_EMB_SDA21", /* name */
1233 FALSE, /* partial_inplace */
1234 0, /* src_mask */
1235 0xffff, /* dst_mask */
1236 FALSE), /* pcrel_offset */
1237
1238 /* Relocation not handled: R_PPC_EMB_MRKREF */
1239 /* Relocation not handled: R_PPC_EMB_RELSEC16 */
1240 /* Relocation not handled: R_PPC_EMB_RELST_LO */
1241 /* Relocation not handled: R_PPC_EMB_RELST_HI */
1242 /* Relocation not handled: R_PPC_EMB_RELST_HA */
1243 /* Relocation not handled: R_PPC_EMB_BIT_FLD */
1244
1245 /* PC relative relocation against either _SDA_BASE_ or _SDA2_BASE_, filling
1246 in the 16 bit signed offset from the appropriate base, and filling in the
1247 register field with the appropriate register (0, 2, or 13). */
1248 HOWTO (R_PPC_EMB_RELSDA, /* type */
1249 0, /* rightshift */
1250 1, /* size (0 = byte, 1 = short, 2 = long) */
1251 16, /* bitsize */
1252 TRUE, /* pc_relative */
1253 0, /* bitpos */
1254 complain_overflow_signed, /* complain_on_overflow */
1255 bfd_elf_generic_reloc, /* special_function */
1256 "R_PPC_EMB_RELSDA", /* name */
1257 FALSE, /* partial_inplace */
1258 0, /* src_mask */
1259 0xffff, /* dst_mask */
1260 FALSE), /* pcrel_offset */
1261
1262 /* GNU extension to record C++ vtable hierarchy. */
1263 HOWTO (R_PPC_GNU_VTINHERIT, /* type */
1264 0, /* rightshift */
1265 0, /* size (0 = byte, 1 = short, 2 = long) */
1266 0, /* bitsize */
1267 FALSE, /* pc_relative */
1268 0, /* bitpos */
1269 complain_overflow_dont, /* complain_on_overflow */
1270 NULL, /* special_function */
1271 "R_PPC_GNU_VTINHERIT", /* name */
1272 FALSE, /* partial_inplace */
1273 0, /* src_mask */
1274 0, /* dst_mask */
1275 FALSE), /* pcrel_offset */
1276
1277 /* GNU extension to record C++ vtable member usage. */
1278 HOWTO (R_PPC_GNU_VTENTRY, /* type */
1279 0, /* rightshift */
1280 0, /* size (0 = byte, 1 = short, 2 = long) */
1281 0, /* bitsize */
1282 FALSE, /* pc_relative */
1283 0, /* bitpos */
1284 complain_overflow_dont, /* complain_on_overflow */
1285 NULL, /* special_function */
1286 "R_PPC_GNU_VTENTRY", /* name */
7619e7c7
AM
1287 FALSE, /* partial_inplace */
1288 0, /* src_mask */
25dbc73a 1289 0, /* dst_mask */
7619e7c7
AM
1290 FALSE), /* pcrel_offset */
1291
25dbc73a
AM
1292 /* Phony reloc to handle AIX style TOC entries. */
1293 HOWTO (R_PPC_TOC16, /* type */
7619e7c7
AM
1294 0, /* rightshift */
1295 1, /* size (0 = byte, 1 = short, 2 = long) */
1296 16, /* bitsize */
1297 FALSE, /* pc_relative */
1298 0, /* bitpos */
25dbc73a 1299 complain_overflow_signed, /* complain_on_overflow */
7619e7c7 1300 bfd_elf_generic_reloc, /* special_function */
25dbc73a 1301 "R_PPC_TOC16", /* name */
7619e7c7
AM
1302 FALSE, /* partial_inplace */
1303 0, /* src_mask */
1304 0xffff, /* dst_mask */
1305 FALSE), /* pcrel_offset */
25dbc73a
AM
1306};
1307\f
1308/* Initialize the ppc_elf_howto_table, so that linear accesses can be done. */
1309
1310static void
1311ppc_elf_howto_init (void)
1312{
1313 unsigned int i, type;
1314
1315 for (i = 0;
1316 i < sizeof (ppc_elf_howto_raw) / sizeof (ppc_elf_howto_raw[0]);
1317 i++)
1318 {
1319 type = ppc_elf_howto_raw[i].type;
1320 if (type >= (sizeof (ppc_elf_howto_table)
1321 / sizeof (ppc_elf_howto_table[0])))
1322 abort ();
1323 ppc_elf_howto_table[type] = &ppc_elf_howto_raw[i];
1324 }
1325}
1326
1327static reloc_howto_type *
1328ppc_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1329 bfd_reloc_code_real_type code)
1330{
1331 enum elf_ppc_reloc_type r;
1332
1333 /* Initialize howto table if not already done. */
1334 if (!ppc_elf_howto_table[R_PPC_ADDR32])
1335 ppc_elf_howto_init ();
1336
1337 switch (code)
1338 {
1339 default:
1340 return NULL;
1341
1342 case BFD_RELOC_NONE: r = R_PPC_NONE; break;
1343 case BFD_RELOC_32: r = R_PPC_ADDR32; break;
1344 case BFD_RELOC_PPC_BA26: r = R_PPC_ADDR24; break;
1345 case BFD_RELOC_16: r = R_PPC_ADDR16; break;
1346 case BFD_RELOC_LO16: r = R_PPC_ADDR16_LO; break;
1347 case BFD_RELOC_HI16: r = R_PPC_ADDR16_HI; break;
1348 case BFD_RELOC_HI16_S: r = R_PPC_ADDR16_HA; break;
1349 case BFD_RELOC_PPC_BA16: r = R_PPC_ADDR14; break;
1350 case BFD_RELOC_PPC_BA16_BRTAKEN: r = R_PPC_ADDR14_BRTAKEN; break;
1351 case BFD_RELOC_PPC_BA16_BRNTAKEN: r = R_PPC_ADDR14_BRNTAKEN; break;
1352 case BFD_RELOC_PPC_B26: r = R_PPC_REL24; break;
1353 case BFD_RELOC_PPC_B16: r = R_PPC_REL14; break;
1354 case BFD_RELOC_PPC_B16_BRTAKEN: r = R_PPC_REL14_BRTAKEN; break;
1355 case BFD_RELOC_PPC_B16_BRNTAKEN: r = R_PPC_REL14_BRNTAKEN; break;
1356 case BFD_RELOC_16_GOTOFF: r = R_PPC_GOT16; break;
1357 case BFD_RELOC_LO16_GOTOFF: r = R_PPC_GOT16_LO; break;
1358 case BFD_RELOC_HI16_GOTOFF: r = R_PPC_GOT16_HI; break;
1359 case BFD_RELOC_HI16_S_GOTOFF: r = R_PPC_GOT16_HA; break;
1360 case BFD_RELOC_24_PLT_PCREL: r = R_PPC_PLTREL24; break;
1361 case BFD_RELOC_PPC_COPY: r = R_PPC_COPY; break;
1362 case BFD_RELOC_PPC_GLOB_DAT: r = R_PPC_GLOB_DAT; break;
1363 case BFD_RELOC_PPC_LOCAL24PC: r = R_PPC_LOCAL24PC; break;
1364 case BFD_RELOC_32_PCREL: r = R_PPC_REL32; break;
1365 case BFD_RELOC_32_PLTOFF: r = R_PPC_PLT32; break;
1366 case BFD_RELOC_32_PLT_PCREL: r = R_PPC_PLTREL32; break;
1367 case BFD_RELOC_LO16_PLTOFF: r = R_PPC_PLT16_LO; break;
1368 case BFD_RELOC_HI16_PLTOFF: r = R_PPC_PLT16_HI; break;
1369 case BFD_RELOC_HI16_S_PLTOFF: r = R_PPC_PLT16_HA; break;
1370 case BFD_RELOC_GPREL16: r = R_PPC_SDAREL16; break;
1371 case BFD_RELOC_16_BASEREL: r = R_PPC_SECTOFF; break;
1372 case BFD_RELOC_LO16_BASEREL: r = R_PPC_SECTOFF_LO; break;
1373 case BFD_RELOC_HI16_BASEREL: r = R_PPC_SECTOFF_HI; break;
1374 case BFD_RELOC_HI16_S_BASEREL: r = R_PPC_SECTOFF_HA; break;
1375 case BFD_RELOC_CTOR: r = R_PPC_ADDR32; break;
1376 case BFD_RELOC_PPC_TOC16: r = R_PPC_TOC16; break;
1377 case BFD_RELOC_PPC_TLS: r = R_PPC_TLS; break;
1378 case BFD_RELOC_PPC_DTPMOD: r = R_PPC_DTPMOD32; break;
1379 case BFD_RELOC_PPC_TPREL16: r = R_PPC_TPREL16; break;
1380 case BFD_RELOC_PPC_TPREL16_LO: r = R_PPC_TPREL16_LO; break;
1381 case BFD_RELOC_PPC_TPREL16_HI: r = R_PPC_TPREL16_HI; break;
1382 case BFD_RELOC_PPC_TPREL16_HA: r = R_PPC_TPREL16_HA; break;
1383 case BFD_RELOC_PPC_TPREL: r = R_PPC_TPREL32; break;
1384 case BFD_RELOC_PPC_DTPREL16: r = R_PPC_DTPREL16; break;
1385 case BFD_RELOC_PPC_DTPREL16_LO: r = R_PPC_DTPREL16_LO; break;
1386 case BFD_RELOC_PPC_DTPREL16_HI: r = R_PPC_DTPREL16_HI; break;
1387 case BFD_RELOC_PPC_DTPREL16_HA: r = R_PPC_DTPREL16_HA; break;
1388 case BFD_RELOC_PPC_DTPREL: r = R_PPC_DTPREL32; break;
1389 case BFD_RELOC_PPC_GOT_TLSGD16: r = R_PPC_GOT_TLSGD16; break;
1390 case BFD_RELOC_PPC_GOT_TLSGD16_LO: r = R_PPC_GOT_TLSGD16_LO; break;
1391 case BFD_RELOC_PPC_GOT_TLSGD16_HI: r = R_PPC_GOT_TLSGD16_HI; break;
1392 case BFD_RELOC_PPC_GOT_TLSGD16_HA: r = R_PPC_GOT_TLSGD16_HA; break;
1393 case BFD_RELOC_PPC_GOT_TLSLD16: r = R_PPC_GOT_TLSLD16; break;
1394 case BFD_RELOC_PPC_GOT_TLSLD16_LO: r = R_PPC_GOT_TLSLD16_LO; break;
1395 case BFD_RELOC_PPC_GOT_TLSLD16_HI: r = R_PPC_GOT_TLSLD16_HI; break;
1396 case BFD_RELOC_PPC_GOT_TLSLD16_HA: r = R_PPC_GOT_TLSLD16_HA; break;
1397 case BFD_RELOC_PPC_GOT_TPREL16: r = R_PPC_GOT_TPREL16; break;
1398 case BFD_RELOC_PPC_GOT_TPREL16_LO: r = R_PPC_GOT_TPREL16_LO; break;
1399 case BFD_RELOC_PPC_GOT_TPREL16_HI: r = R_PPC_GOT_TPREL16_HI; break;
1400 case BFD_RELOC_PPC_GOT_TPREL16_HA: r = R_PPC_GOT_TPREL16_HA; break;
1401 case BFD_RELOC_PPC_GOT_DTPREL16: r = R_PPC_GOT_DTPREL16; break;
1402 case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC_GOT_DTPREL16_LO; break;
1403 case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC_GOT_DTPREL16_HI; break;
1404 case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC_GOT_DTPREL16_HA; break;
1405 case BFD_RELOC_PPC_EMB_NADDR32: r = R_PPC_EMB_NADDR32; break;
1406 case BFD_RELOC_PPC_EMB_NADDR16: r = R_PPC_EMB_NADDR16; break;
1407 case BFD_RELOC_PPC_EMB_NADDR16_LO: r = R_PPC_EMB_NADDR16_LO; break;
1408 case BFD_RELOC_PPC_EMB_NADDR16_HI: r = R_PPC_EMB_NADDR16_HI; break;
1409 case BFD_RELOC_PPC_EMB_NADDR16_HA: r = R_PPC_EMB_NADDR16_HA; break;
1410 case BFD_RELOC_PPC_EMB_SDAI16: r = R_PPC_EMB_SDAI16; break;
1411 case BFD_RELOC_PPC_EMB_SDA2I16: r = R_PPC_EMB_SDA2I16; break;
1412 case BFD_RELOC_PPC_EMB_SDA2REL: r = R_PPC_EMB_SDA2REL; break;
1413 case BFD_RELOC_PPC_EMB_SDA21: r = R_PPC_EMB_SDA21; break;
1414 case BFD_RELOC_PPC_EMB_MRKREF: r = R_PPC_EMB_MRKREF; break;
1415 case BFD_RELOC_PPC_EMB_RELSEC16: r = R_PPC_EMB_RELSEC16; break;
1416 case BFD_RELOC_PPC_EMB_RELST_LO: r = R_PPC_EMB_RELST_LO; break;
1417 case BFD_RELOC_PPC_EMB_RELST_HI: r = R_PPC_EMB_RELST_HI; break;
1418 case BFD_RELOC_PPC_EMB_RELST_HA: r = R_PPC_EMB_RELST_HA; break;
1419 case BFD_RELOC_PPC_EMB_BIT_FLD: r = R_PPC_EMB_BIT_FLD; break;
1420 case BFD_RELOC_PPC_EMB_RELSDA: r = R_PPC_EMB_RELSDA; break;
1421 case BFD_RELOC_VTABLE_INHERIT: r = R_PPC_GNU_VTINHERIT; break;
1422 case BFD_RELOC_VTABLE_ENTRY: r = R_PPC_GNU_VTENTRY; break;
1423 }
1424
1425 return ppc_elf_howto_table[r];
1426};
1427
1428/* Set the howto pointer for a PowerPC ELF reloc. */
1429
1430static void
1431ppc_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
1432 arelent *cache_ptr,
1433 Elf_Internal_Rela *dst)
1434{
1435 /* Initialize howto table if not already done. */
1436 if (!ppc_elf_howto_table[R_PPC_ADDR32])
1437 ppc_elf_howto_init ();
1438
1439 BFD_ASSERT (ELF32_R_TYPE (dst->r_info) < (unsigned int) R_PPC_max);
1440 cache_ptr->howto = ppc_elf_howto_table[ELF32_R_TYPE (dst->r_info)];
1441}
1442
1443/* Handle the R_PPC_ADDR16_HA reloc. */
1444
1445static bfd_reloc_status_type
1446ppc_elf_addr16_ha_reloc (bfd *abfd ATTRIBUTE_UNUSED,
1447 arelent *reloc_entry,
1448 asymbol *symbol,
1449 void *data ATTRIBUTE_UNUSED,
1450 asection *input_section,
1451 bfd *output_bfd,
1452 char **error_message ATTRIBUTE_UNUSED)
1453{
1454 bfd_vma relocation;
1455
1456 if (output_bfd != NULL)
1457 {
1458 reloc_entry->address += input_section->output_offset;
1459 return bfd_reloc_ok;
1460 }
1461
1462 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
1463 return bfd_reloc_outofrange;
1464
1465 if (bfd_is_com_section (symbol->section))
1466 relocation = 0;
1467 else
1468 relocation = symbol->value;
1469
1470 relocation += symbol->section->output_section->vma;
1471 relocation += symbol->section->output_offset;
1472 relocation += reloc_entry->addend;
1473
1474 reloc_entry->addend += (relocation & 0x8000) << 1;
1475
1476 return bfd_reloc_continue;
1477}
1478
1479static bfd_reloc_status_type
1480ppc_elf_unhandled_reloc (bfd *abfd,
1481 arelent *reloc_entry,
1482 asymbol *symbol,
1483 void *data,
1484 asection *input_section,
1485 bfd *output_bfd,
1486 char **error_message)
1487{
1488 /* If this is a relocatable link (output_bfd test tells us), just
1489 call the generic function. Any adjustment will be done at final
1490 link time. */
1491 if (output_bfd != NULL)
1492 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1493 input_section, output_bfd, error_message);
1494
1495 if (error_message != NULL)
1496 {
1497 static char buf[60];
1498 sprintf (buf, _("generic linker can't handle %s"),
1499 reloc_entry->howto->name);
1500 *error_message = buf;
1501 }
1502 return bfd_reloc_dangerous;
1503}
1504\f
1505/* Sections created by the linker. */
1506
1507typedef struct elf_linker_section
1508{
c9a2f333 1509 /* Pointer to the bfd section. */
25dbc73a 1510 asection *section;
c9a2f333
AM
1511 /* Section name. */
1512 const char *name;
1513 /* Associated bss section name. */
1514 const char *bss_name;
1515 /* Associated symbol name. */
1516 const char *sym_name;
1517 /* Value of symbol. */
1518 bfd_vma sym_val;
25dbc73a
AM
1519} elf_linker_section_t;
1520
1521/* Linked list of allocated pointer entries. This hangs off of the
1522 symbol lists, and provides allows us to return different pointers,
1523 based on different addend's. */
1524
1525typedef struct elf_linker_section_pointers
1526{
1527 /* next allocated pointer for this symbol */
1528 struct elf_linker_section_pointers *next;
1529 /* offset of pointer from beginning of section */
1530 bfd_vma offset;
1531 /* addend used */
1532 bfd_vma addend;
1533 /* which linker section this is */
1534 elf_linker_section_t *lsect;
25dbc73a
AM
1535} elf_linker_section_pointers_t;
1536
1537struct ppc_elf_obj_tdata
1538{
1539 struct elf_obj_tdata elf;
1540
1541 /* A mapping from local symbols to offsets into the various linker
1542 sections added. This is index by the symbol index. */
1543 elf_linker_section_pointers_t **linker_section_pointers;
1544};
1545
1546#define ppc_elf_tdata(bfd) \
1547 ((struct ppc_elf_obj_tdata *) (bfd)->tdata.any)
7619e7c7 1548
25dbc73a
AM
1549#define elf_local_ptr_offsets(bfd) \
1550 (ppc_elf_tdata (bfd)->linker_section_pointers)
7619e7c7 1551
25dbc73a 1552/* Override the generic function because we store some extras. */
7619e7c7 1553
25dbc73a
AM
1554static bfd_boolean
1555ppc_elf_mkobject (bfd *abfd)
1556{
1557 bfd_size_type amt = sizeof (struct ppc_elf_obj_tdata);
1558 abfd->tdata.any = bfd_zalloc (abfd, amt);
1559 if (abfd->tdata.any == NULL)
1560 return FALSE;
1561 return TRUE;
1562}
7619e7c7 1563
25dbc73a
AM
1564/* Fix bad default arch selected for a 32 bit input bfd when the
1565 default is 64 bit. */
7619e7c7 1566
25dbc73a
AM
1567static bfd_boolean
1568ppc_elf_object_p (bfd *abfd)
1569{
1570 if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 64)
1571 {
1572 Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
7619e7c7 1573
25dbc73a
AM
1574 if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS32)
1575 {
1576 /* Relies on arch after 64 bit default being 32 bit default. */
1577 abfd->arch_info = abfd->arch_info->next;
1578 BFD_ASSERT (abfd->arch_info->bits_per_word == 32);
1579 }
1580 }
1581 return TRUE;
1582}
7619e7c7 1583
25dbc73a 1584/* Function to set whether a module needs the -mrelocatable bit set. */
7619e7c7 1585
25dbc73a
AM
1586static bfd_boolean
1587ppc_elf_set_private_flags (bfd *abfd, flagword flags)
1588{
1589 BFD_ASSERT (!elf_flags_init (abfd)
1590 || elf_elfheader (abfd)->e_flags == flags);
7619e7c7 1591
25dbc73a
AM
1592 elf_elfheader (abfd)->e_flags = flags;
1593 elf_flags_init (abfd) = TRUE;
1594 return TRUE;
1595}
1596
25dbc73a 1597/* Support for core dump NOTE sections. */
deaaf2f3 1598
b34976b6 1599static bfd_boolean
25dbc73a 1600ppc_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
252b5132 1601{
25dbc73a
AM
1602 int offset;
1603 unsigned int size;
252b5132 1604
25dbc73a
AM
1605 switch (note->descsz)
1606 {
1607 default:
1608 return FALSE;
252b5132 1609
25dbc73a
AM
1610 case 268: /* Linux/PPC. */
1611 /* pr_cursig */
1612 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
deaaf2f3 1613
25dbc73a
AM
1614 /* pr_pid */
1615 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
9abc968f 1616
25dbc73a
AM
1617 /* pr_reg */
1618 offset = 72;
1619 size = 192;
deaaf2f3 1620
25dbc73a
AM
1621 break;
1622 }
deaaf2f3 1623
25dbc73a
AM
1624 /* Make a ".reg/999" section. */
1625 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1626 size, note->descpos + offset);
1627}
252b5132 1628
25dbc73a
AM
1629static bfd_boolean
1630ppc_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1631{
1632 switch (note->descsz)
deaaf2f3 1633 {
25dbc73a
AM
1634 default:
1635 return FALSE;
deaaf2f3 1636
25dbc73a
AM
1637 case 128: /* Linux/PPC elf_prpsinfo. */
1638 elf_tdata (abfd)->core_program
1639 = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
1640 elf_tdata (abfd)->core_command
1641 = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
1642 }
9abc968f 1643
25dbc73a
AM
1644 /* Note that for some reason, a spurious space is tacked
1645 onto the end of the args in some (at least one anyway)
1646 implementations, so strip it off if it exists. */
70bccea4 1647
25dbc73a
AM
1648 {
1649 char *command = elf_tdata (abfd)->core_command;
1650 int n = strlen (command);
70bccea4 1651
25dbc73a
AM
1652 if (0 < n && command[n - 1] == ' ')
1653 command[n - 1] = '\0';
1654 }
deaaf2f3 1655
25dbc73a
AM
1656 return TRUE;
1657}
deaaf2f3 1658
25dbc73a
AM
1659/* Return address for Ith PLT stub in section PLT, for relocation REL
1660 or (bfd_vma) -1 if it should not be included. */
deaaf2f3 1661
25dbc73a
AM
1662static bfd_vma
1663ppc_elf_plt_sym_val (bfd_vma i ATTRIBUTE_UNUSED,
1664 const asection *plt ATTRIBUTE_UNUSED,
1665 const arelent *rel)
1666{
1667 return rel->address;
1668}
deaaf2f3 1669
25dbc73a 1670/* Handle a PowerPC specific section when reading an object file. This
6dc132d9
L
1671 is called when bfd_section_from_shdr finds a section with an unknown
1672 type. */
deaaf2f3 1673
25dbc73a 1674static bfd_boolean
6dc132d9
L
1675ppc_elf_section_from_shdr (bfd *abfd,
1676 Elf_Internal_Shdr *hdr,
1677 const char *name,
1678 int shindex)
25dbc73a
AM
1679{
1680 asection *newsect;
1681 flagword flags;
d1c6de6f 1682
6dc132d9 1683 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
25dbc73a 1684 return FALSE;
deaaf2f3 1685
25dbc73a
AM
1686 newsect = hdr->bfd_section;
1687 flags = bfd_get_section_flags (abfd, newsect);
1688 if (hdr->sh_flags & SHF_EXCLUDE)
1689 flags |= SEC_EXCLUDE;
9abc968f 1690
25dbc73a
AM
1691 if (hdr->sh_type == SHT_ORDERED)
1692 flags |= SEC_SORT_ENTRIES;
d1c6de6f 1693
25dbc73a
AM
1694 bfd_set_section_flags (abfd, newsect, flags);
1695 return TRUE;
1696}
1697
1698/* Set up any other section flags and such that may be necessary. */
1699
1700static bfd_boolean
1701ppc_elf_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
1702 Elf_Internal_Shdr *shdr,
1703 asection *asect)
1704{
1705 if ((asect->flags & SEC_EXCLUDE) != 0)
1706 shdr->sh_flags |= SHF_EXCLUDE;
1707
1708 if ((asect->flags & SEC_SORT_ENTRIES) != 0)
1709 shdr->sh_type = SHT_ORDERED;
1710
1711 return TRUE;
1712}
1713
1714/* If we have .sbss2 or .PPC.EMB.sbss0 output sections, we
1715 need to bump up the number of section headers. */
1716
1717static int
1718ppc_elf_additional_program_headers (bfd *abfd)
1719{
1720 asection *s;
1721 int ret = 0;
d1c6de6f 1722
25dbc73a
AM
1723 s = bfd_get_section_by_name (abfd, ".sbss2");
1724 if (s != NULL && (s->flags & SEC_ALLOC) != 0)
1725 ++ret;
d1c6de6f 1726
25dbc73a
AM
1727 s = bfd_get_section_by_name (abfd, ".PPC.EMB.sbss0");
1728 if (s != NULL && (s->flags & SEC_ALLOC) != 0)
1729 ++ret;
deaaf2f3 1730
25dbc73a
AM
1731 return ret;
1732}
deaaf2f3 1733
25dbc73a
AM
1734/* Add extra PPC sections -- Note, for now, make .sbss2 and
1735 .PPC.EMB.sbss0 a normal section, and not a bss section so
1736 that the linker doesn't crater when trying to make more than
1737 2 sections. */
e656e369 1738
25dbc73a
AM
1739static struct bfd_elf_special_section const ppc_elf_special_sections[]=
1740{
1741 { ".tags", 5, 0, SHT_ORDERED, SHF_ALLOC },
1742 { ".sdata", 6, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
1743 { ".sbss", 5, -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
1744 { ".sdata2", 7, -2, SHT_PROGBITS, SHF_ALLOC },
1745 { ".sbss2", 6, -2, SHT_PROGBITS, SHF_ALLOC },
1746 { ".PPC.EMB.apuinfo", 16, 0, SHT_NOTE, 0 },
1747 { ".PPC.EMB.sdata0", 15, 0, SHT_PROGBITS, SHF_ALLOC },
1748 { ".PPC.EMB.sbss0", 14, 0, SHT_PROGBITS, SHF_ALLOC },
1749 { ".plt", 4, 0, SHT_NOBITS, SHF_ALLOC + SHF_EXECINSTR },
1750 { NULL, 0, 0, 0, 0 }
1751};
1752\f
1753/* Very simple linked list structure for recording apuinfo values. */
1754typedef struct apuinfo_list
1755{
1756 struct apuinfo_list *next;
1757 unsigned long value;
1758}
1759apuinfo_list;
e656e369 1760
25dbc73a 1761static apuinfo_list *head;
deaaf2f3 1762
deaaf2f3 1763
25dbc73a
AM
1764static void
1765apuinfo_list_init (void)
1766{
1767 head = NULL;
1768}
9abc968f 1769
25dbc73a
AM
1770static void
1771apuinfo_list_add (unsigned long value)
1772{
1773 apuinfo_list *entry = head;
deaaf2f3 1774
25dbc73a
AM
1775 while (entry != NULL)
1776 {
1777 if (entry->value == value)
1778 return;
1779 entry = entry->next;
1780 }
b4a38de6 1781
25dbc73a
AM
1782 entry = bfd_malloc (sizeof (* entry));
1783 if (entry == NULL)
1784 return;
e656e369 1785
25dbc73a
AM
1786 entry->value = value;
1787 entry->next = head;
1788 head = entry;
1789}
9abc968f 1790
25dbc73a
AM
1791static unsigned
1792apuinfo_list_length (void)
1793{
1794 apuinfo_list *entry;
1795 unsigned long count;
9abc968f 1796
25dbc73a
AM
1797 for (entry = head, count = 0;
1798 entry;
1799 entry = entry->next)
1800 ++ count;
e656e369 1801
25dbc73a
AM
1802 return count;
1803}
eea6121a 1804
25dbc73a
AM
1805static inline unsigned long
1806apuinfo_list_element (unsigned long number)
1807{
1808 apuinfo_list * entry;
e656e369 1809
25dbc73a
AM
1810 for (entry = head;
1811 entry && number --;
1812 entry = entry->next)
1813 ;
252b5132 1814
25dbc73a
AM
1815 return entry ? entry->value : 0;
1816}
1817
1818static void
1819apuinfo_list_finish (void)
1820{
1821 apuinfo_list *entry;
1822
1823 for (entry = head; entry;)
252b5132 1824 {
25dbc73a
AM
1825 apuinfo_list *next = entry->next;
1826 free (entry);
1827 entry = next;
1828 }
9abc968f 1829
25dbc73a
AM
1830 head = NULL;
1831}
9abc968f 1832
25dbc73a
AM
1833#define APUINFO_SECTION_NAME ".PPC.EMB.apuinfo"
1834#define APUINFO_LABEL "APUinfo"
9abc968f 1835
25dbc73a
AM
1836/* Scan the input BFDs and create a linked list of
1837 the APUinfo values that will need to be emitted. */
9abc968f 1838
25dbc73a
AM
1839static void
1840ppc_elf_begin_write_processing (bfd *abfd, struct bfd_link_info *link_info)
1841{
1842 bfd *ibfd;
1843 asection *asec;
1844 char *buffer;
1845 unsigned num_input_sections;
1846 bfd_size_type output_section_size;
1847 unsigned i;
1848 unsigned num_entries;
1849 unsigned long offset;
1850 unsigned long length;
1851 const char *error_message = NULL;
9abc968f 1852
25dbc73a
AM
1853 if (link_info == NULL)
1854 return;
9abc968f 1855
25dbc73a
AM
1856 /* Scan the input bfds, looking for apuinfo sections. */
1857 num_input_sections = 0;
1858 output_section_size = 0;
252b5132 1859
25dbc73a 1860 for (ibfd = link_info->input_bfds; ibfd; ibfd = ibfd->link_next)
252b5132 1861 {
25dbc73a
AM
1862 asec = bfd_get_section_by_name (ibfd, APUINFO_SECTION_NAME);
1863 if (asec)
252b5132 1864 {
25dbc73a
AM
1865 ++ num_input_sections;
1866 output_section_size += asec->size;
252b5132 1867 }
252b5132
RH
1868 }
1869
25dbc73a
AM
1870 /* We need at least one input sections
1871 in order to make merging worthwhile. */
1872 if (num_input_sections < 1)
1873 return;
deaaf2f3 1874
25dbc73a
AM
1875 /* Just make sure that the output section exists as well. */
1876 asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
1877 if (asec == NULL)
1878 return;
252b5132 1879
25dbc73a
AM
1880 /* Allocate a buffer for the contents of the input sections. */
1881 buffer = bfd_malloc (output_section_size);
1882 if (buffer == NULL)
1883 return;
252b5132 1884
25dbc73a
AM
1885 offset = 0;
1886 apuinfo_list_init ();
252b5132 1887
25dbc73a
AM
1888 /* Read in the input sections contents. */
1889 for (ibfd = link_info->input_bfds; ibfd; ibfd = ibfd->link_next)
252b5132 1890 {
25dbc73a
AM
1891 unsigned long datum;
1892 char *ptr;
252b5132 1893
25dbc73a
AM
1894 asec = bfd_get_section_by_name (ibfd, APUINFO_SECTION_NAME);
1895 if (asec == NULL)
1896 continue;
252b5132 1897
25dbc73a
AM
1898 length = asec->size;
1899 if (length < 24)
1900 {
1901 error_message = _("corrupt or empty %s section in %B");
1902 goto fail;
1903 }
252b5132 1904
25dbc73a
AM
1905 if (bfd_seek (ibfd, asec->filepos, SEEK_SET) != 0
1906 || (bfd_bread (buffer + offset, length, ibfd) != length))
1907 {
1908 error_message = _("unable to read in %s section from %B");
1909 goto fail;
1910 }
252b5132 1911
25dbc73a
AM
1912 /* Process the contents of the section. */
1913 ptr = buffer + offset;
1914 error_message = _("corrupt %s section in %B");
252b5132 1915
25dbc73a
AM
1916 /* Verify the contents of the header. Note - we have to
1917 extract the values this way in order to allow for a
1918 host whose endian-ness is different from the target. */
1919 datum = bfd_get_32 (ibfd, ptr);
1920 if (datum != sizeof APUINFO_LABEL)
1921 goto fail;
252b5132 1922
25dbc73a
AM
1923 datum = bfd_get_32 (ibfd, ptr + 8);
1924 if (datum != 0x2)
1925 goto fail;
252b5132 1926
25dbc73a
AM
1927 if (strcmp (ptr + 12, APUINFO_LABEL) != 0)
1928 goto fail;
252b5132 1929
25dbc73a
AM
1930 /* Get the number of bytes used for apuinfo entries. */
1931 datum = bfd_get_32 (ibfd, ptr + 4);
1932 if (datum + 20 != length)
1933 goto fail;
1934
1935 /* Make sure that we do not run off the end of the section. */
1936 if (offset + length > output_section_size)
1937 goto fail;
1938
1939 /* Scan the apuinfo section, building a list of apuinfo numbers. */
1940 for (i = 0; i < datum; i += 4)
1941 apuinfo_list_add (bfd_get_32 (ibfd, ptr + 20 + i));
1942
1943 /* Update the offset. */
1944 offset += length;
252b5132
RH
1945 }
1946
25dbc73a 1947 error_message = NULL;
252b5132 1948
25dbc73a
AM
1949 /* Compute the size of the output section. */
1950 num_entries = apuinfo_list_length ();
1951 output_section_size = 20 + num_entries * 4;
252b5132 1952
25dbc73a
AM
1953 asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
1954
1955 if (! bfd_set_section_size (abfd, asec, output_section_size))
1956 ibfd = abfd,
1957 error_message = _("warning: unable to set size of %s section in %B");
1958
1959 fail:
1960 free (buffer);
1961
1962 if (error_message)
1963 (*_bfd_error_handler) (error_message, ibfd, APUINFO_SECTION_NAME);
1964}
252b5132 1965
25dbc73a
AM
1966/* Prevent the output section from accumulating the input sections'
1967 contents. We have already stored this in our linked list structure. */
252b5132 1968
25dbc73a
AM
1969static bfd_boolean
1970ppc_elf_write_section (bfd *abfd ATTRIBUTE_UNUSED,
1971 asection *asec,
1972 bfd_byte *contents ATTRIBUTE_UNUSED)
1973{
1974 return (apuinfo_list_length ()
1975 && strcmp (asec->name, APUINFO_SECTION_NAME) == 0);
252b5132
RH
1976}
1977
25dbc73a
AM
1978/* Finally we can generate the output section. */
1979
1980static void
1981ppc_elf_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
7619e7c7 1982{
25dbc73a
AM
1983 bfd_byte *buffer;
1984 asection *asec;
1985 unsigned i;
1986 unsigned num_entries;
1987 bfd_size_type length;
7619e7c7 1988
25dbc73a
AM
1989 asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
1990 if (asec == NULL)
1991 return;
1992
1993 if (apuinfo_list_length () == 0)
1994 return;
1995
1996 length = asec->size;
1997 if (length < 20)
1998 return;
1999
2000 buffer = bfd_malloc (length);
2001 if (buffer == NULL)
7619e7c7 2002 {
25dbc73a
AM
2003 (*_bfd_error_handler)
2004 (_("failed to allocate space for new APUinfo section."));
2005 return;
7619e7c7 2006 }
7619e7c7 2007
25dbc73a
AM
2008 /* Create the apuinfo header. */
2009 num_entries = apuinfo_list_length ();
2010 bfd_put_32 (abfd, sizeof APUINFO_LABEL, buffer);
2011 bfd_put_32 (abfd, num_entries * 4, buffer + 4);
2012 bfd_put_32 (abfd, 0x2, buffer + 8);
2013 strcpy ((char *) buffer + 12, APUINFO_LABEL);
feee612b 2014
25dbc73a
AM
2015 length = 20;
2016 for (i = 0; i < num_entries; i++)
feee612b 2017 {
25dbc73a
AM
2018 bfd_put_32 (abfd, apuinfo_list_element (i), buffer + length);
2019 length += 4;
feee612b 2020 }
feee612b 2021
25dbc73a
AM
2022 if (length != asec->size)
2023 (*_bfd_error_handler) (_("failed to compute new APUinfo section."));
252b5132 2024
25dbc73a
AM
2025 if (! bfd_set_section_contents (abfd, asec, buffer, (file_ptr) 0, length))
2026 (*_bfd_error_handler) (_("failed to install new APUinfo section."));
252b5132 2027
25dbc73a
AM
2028 free (buffer);
2029
2030 apuinfo_list_finish ();
252b5132 2031}
25dbc73a
AM
2032\f
2033/* The following functions are specific to the ELF linker, while
2034 functions above are used generally. They appear in this file more
2035 or less in the order in which they are called. eg.
2036 ppc_elf_check_relocs is called early in the link process,
2037 ppc_elf_finish_dynamic_sections is one of the last functions
2038 called. */
252b5132 2039
25dbc73a
AM
2040/* The PPC linker needs to keep track of the number of relocs that it
2041 decides to copy as dynamic relocs in check_relocs for each symbol.
2042 This is so that it can later discard them if they are found to be
2043 unnecessary. We store the information in a field extending the
2044 regular ELF linker hash table. */
ae9a127f 2045
25dbc73a 2046struct ppc_elf_dyn_relocs
252b5132 2047{
25dbc73a 2048 struct ppc_elf_dyn_relocs *next;
252b5132 2049
25dbc73a
AM
2050 /* The input section of the reloc. */
2051 asection *sec;
252b5132 2052
25dbc73a
AM
2053 /* Total number of relocs copied for the input section. */
2054 bfd_size_type count;
252b5132 2055
25dbc73a
AM
2056 /* Number of pc-relative relocs copied for the input section. */
2057 bfd_size_type pc_count;
2058};
252b5132 2059
25dbc73a
AM
2060/* Of those relocs that might be copied as dynamic relocs, this macro
2061 selects those that must be copied when linking a shared library,
2062 even when the symbol is local. */
252b5132 2063
25dbc73a
AM
2064#define MUST_BE_DYN_RELOC(RTYPE) \
2065 ((RTYPE) != R_PPC_REL24 \
2066 && (RTYPE) != R_PPC_REL14 \
2067 && (RTYPE) != R_PPC_REL14_BRTAKEN \
2068 && (RTYPE) != R_PPC_REL14_BRNTAKEN \
2069 && (RTYPE) != R_PPC_REL32)
252b5132 2070
25dbc73a
AM
2071/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
2072 copying dynamic variables from a shared lib into an app's dynbss
2073 section, and instead use a dynamic relocation to point into the
2074 shared lib. */
2075#define ELIMINATE_COPY_RELOCS 1
252b5132 2076
25dbc73a 2077/* PPC ELF linker hash entry. */
252b5132 2078
25dbc73a
AM
2079struct ppc_elf_link_hash_entry
2080{
2081 struct elf_link_hash_entry elf;
252b5132 2082
25dbc73a
AM
2083 /* If this symbol is used in the linker created sections, the processor
2084 specific backend uses this field to map the field into the offset
2085 from the beginning of the section. */
2086 elf_linker_section_pointers_t *linker_section_pointer;
252b5132 2087
25dbc73a
AM
2088 /* Track dynamic relocs copied for this symbol. */
2089 struct ppc_elf_dyn_relocs *dyn_relocs;
252b5132 2090
25dbc73a
AM
2091 /* Contexts in which symbol is used in the GOT (or TOC).
2092 TLS_GD .. TLS_TLS bits are or'd into the mask as the
2093 corresponding relocs are encountered during check_relocs.
2094 tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
2095 indicate the corresponding GOT entry type is not needed. */
2096#define TLS_GD 1 /* GD reloc. */
2097#define TLS_LD 2 /* LD reloc. */
2098#define TLS_TPREL 4 /* TPREL reloc, => IE. */
2099#define TLS_DTPREL 8 /* DTPREL reloc, => LD. */
2100#define TLS_TLS 16 /* Any TLS reloc. */
2101#define TLS_TPRELGD 32 /* TPREL reloc resulting from GD->IE. */
2102 char tls_mask;
2103};
252b5132 2104
25dbc73a
AM
2105#define ppc_elf_hash_entry(ent) ((struct ppc_elf_link_hash_entry *) (ent))
2106
2107/* PPC ELF linker hash table. */
2108
2109struct ppc_elf_link_hash_table
2110{
2111 struct elf_link_hash_table elf;
2112
2113 /* Short-cuts to get to dynamic linker sections. */
2114 asection *got;
2115 asection *relgot;
2116 asection *plt;
2117 asection *relplt;
2118 asection *dynbss;
2119 asection *relbss;
2120 asection *dynsbss;
2121 asection *relsbss;
c9a2f333 2122 elf_linker_section_t sdata[2];
25dbc73a
AM
2123 asection *sbss;
2124
2125 /* Shortcut to .__tls_get_addr. */
2126 struct elf_link_hash_entry *tls_get_addr;
252b5132 2127
25dbc73a
AM
2128 /* TLS local dynamic got entry handling. */
2129 union {
2130 bfd_signed_vma refcount;
2131 bfd_vma offset;
2132 } tlsld_got;
252b5132 2133
3b36f7e6
AM
2134 /* Size of reserved GOT entries. */
2135 unsigned int got_header_size;
2136 /* Non-zero if allocating the header left a gap. */
2137 unsigned int got_gap;
2138
25dbc73a
AM
2139 /* Small local sym to section mapping cache. */
2140 struct sym_sec_cache sym_sec;
2141};
252b5132 2142
25dbc73a 2143/* Get the PPC ELF linker hash table from a link_info structure. */
252b5132 2144
25dbc73a
AM
2145#define ppc_elf_hash_table(p) \
2146 ((struct ppc_elf_link_hash_table *) (p)->hash)
252b5132 2147
25dbc73a 2148/* Create an entry in a PPC ELF linker hash table. */
252b5132 2149
25dbc73a
AM
2150static struct bfd_hash_entry *
2151ppc_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
2152 struct bfd_hash_table *table,
2153 const char *string)
252b5132 2154{
25dbc73a
AM
2155 /* Allocate the structure if it has not already been allocated by a
2156 subclass. */
2157 if (entry == NULL)
2158 {
2159 entry = bfd_hash_allocate (table,
2160 sizeof (struct ppc_elf_link_hash_entry));
2161 if (entry == NULL)
2162 return entry;
2163 }
252b5132 2164
25dbc73a
AM
2165 /* Call the allocation method of the superclass. */
2166 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
2167 if (entry != NULL)
2168 {
2169 ppc_elf_hash_entry (entry)->linker_section_pointer = NULL;
2170 ppc_elf_hash_entry (entry)->dyn_relocs = NULL;
2171 ppc_elf_hash_entry (entry)->tls_mask = 0;
2172 }
252b5132 2173
25dbc73a 2174 return entry;
252b5132 2175}
3dab13f6 2176
25dbc73a 2177/* Create a PPC ELF linker hash table. */
3dab13f6 2178
25dbc73a
AM
2179static struct bfd_link_hash_table *
2180ppc_elf_link_hash_table_create (bfd *abfd)
3dab13f6 2181{
25dbc73a 2182 struct ppc_elf_link_hash_table *ret;
3dab13f6 2183
25dbc73a
AM
2184 ret = bfd_zmalloc (sizeof (struct ppc_elf_link_hash_table));
2185 if (ret == NULL)
2186 return NULL;
3dab13f6 2187
25dbc73a
AM
2188 if (! _bfd_elf_link_hash_table_init (&ret->elf, abfd,
2189 ppc_elf_link_hash_newfunc))
3dab13f6 2190 {
25dbc73a
AM
2191 free (ret);
2192 return NULL;
2193 }
58111eb7 2194
c9a2f333
AM
2195 ret->sdata[0].name = ".sdata";
2196 ret->sdata[0].sym_name = "_SDA_BASE_";
2197 ret->sdata[0].bss_name = ".sbss";
2198
2199 ret->sdata[1].name = ".sdata2";
2200 ret->sdata[1].sym_name = "_SDA2_BASE_";
2201 ret->sdata[1].bss_name = ".sbss2";
2202
25dbc73a
AM
2203 return &ret->elf.root;
2204}
3dab13f6 2205
25dbc73a 2206/* The powerpc .got has a blrl instruction in it. Mark it executable. */
3dab13f6 2207
25dbc73a
AM
2208static bfd_boolean
2209ppc_elf_create_got (bfd *abfd, struct bfd_link_info *info)
2210{
2211 struct ppc_elf_link_hash_table *htab;
2212 asection *s;
2213 flagword flags;
3dab13f6 2214
25dbc73a
AM
2215 if (!_bfd_elf_create_got_section (abfd, info))
2216 return FALSE;
3dab13f6 2217
25dbc73a
AM
2218 htab = ppc_elf_hash_table (info);
2219 htab->got = s = bfd_get_section_by_name (abfd, ".got");
2220 if (s == NULL)
2221 abort ();
3dab13f6 2222
25dbc73a
AM
2223 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2224 | SEC_LINKER_CREATED);
2225 if (!bfd_set_section_flags (abfd, s, flags))
2226 return FALSE;
3dab13f6 2227
3b36f7e6
AM
2228 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2229 | SEC_LINKER_CREATED | SEC_READONLY);
2230 htab->relgot = bfd_make_section_with_flags (abfd, ".rela.got", flags);
25dbc73a 2231 if (!htab->relgot
25dbc73a
AM
2232 || ! bfd_set_section_alignment (abfd, htab->relgot, 2))
2233 return FALSE;
3dab13f6 2234
25dbc73a
AM
2235 return TRUE;
2236}
3dab13f6 2237
25dbc73a
AM
2238/* We have to create .dynsbss and .rela.sbss here so that they get mapped
2239 to output sections (just like _bfd_elf_create_dynamic_sections has
2240 to create .dynbss and .rela.bss). */
3dab13f6 2241
25dbc73a
AM
2242static bfd_boolean
2243ppc_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
2244{
2245 struct ppc_elf_link_hash_table *htab;
2246 asection *s;
2247 flagword flags;
3dab13f6 2248
25dbc73a 2249 htab = ppc_elf_hash_table (info);
3dab13f6 2250
25dbc73a
AM
2251 if (htab->got == NULL
2252 && !ppc_elf_create_got (abfd, info))
3dab13f6
AM
2253 return FALSE;
2254
25dbc73a
AM
2255 if (!_bfd_elf_create_dynamic_sections (abfd, info))
2256 return FALSE;
3dab13f6 2257
25dbc73a
AM
2258 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2259 | SEC_LINKER_CREATED);
3dab13f6 2260
25dbc73a 2261 htab->dynbss = bfd_get_section_by_name (abfd, ".dynbss");
3b36f7e6
AM
2262 s = bfd_make_section_with_flags (abfd, ".dynsbss",
2263 SEC_ALLOC | SEC_LINKER_CREATED);
2264 htab->dynsbss = s;
3496cb2a 2265 if (s == NULL)
25dbc73a 2266 return FALSE;
3dab13f6 2267
25dbc73a
AM
2268 if (! info->shared)
2269 {
2270 htab->relbss = bfd_get_section_by_name (abfd, ".rela.bss");
3b36f7e6
AM
2271 s = bfd_make_section_with_flags (abfd, ".rela.sbss",
2272 flags | SEC_READONLY);
2273 htab->relsbss = s;
25dbc73a 2274 if (s == NULL
25dbc73a
AM
2275 || ! bfd_set_section_alignment (abfd, s, 2))
2276 return FALSE;
2277 }
3dab13f6 2278
25dbc73a
AM
2279 htab->relplt = bfd_get_section_by_name (abfd, ".rela.plt");
2280 htab->plt = s = bfd_get_section_by_name (abfd, ".plt");
2281 if (s == NULL)
2282 abort ();
3dab13f6 2283
3b36f7e6 2284 flags = SEC_ALLOC | SEC_CODE | SEC_LINKER_CREATED;
25dbc73a
AM
2285 return bfd_set_section_flags (abfd, s, flags);
2286}
3dab13f6 2287
25dbc73a 2288/* Copy the extra info we tack onto an elf_link_hash_entry. */
58111eb7 2289
25dbc73a
AM
2290static void
2291ppc_elf_copy_indirect_symbol (const struct elf_backend_data *bed,
2292 struct elf_link_hash_entry *dir,
2293 struct elf_link_hash_entry *ind)
2294{
2295 struct ppc_elf_link_hash_entry *edir, *eind;
3dab13f6 2296
25dbc73a
AM
2297 edir = (struct ppc_elf_link_hash_entry *) dir;
2298 eind = (struct ppc_elf_link_hash_entry *) ind;
3dab13f6 2299
25dbc73a
AM
2300 if (eind->dyn_relocs != NULL)
2301 {
2302 if (edir->dyn_relocs != NULL)
3dab13f6 2303 {
25dbc73a
AM
2304 struct ppc_elf_dyn_relocs **pp;
2305 struct ppc_elf_dyn_relocs *p;
3dab13f6 2306
25dbc73a
AM
2307 if (ind->root.type == bfd_link_hash_indirect)
2308 abort ();
2309
2310 /* Add reloc counts against the weak sym to the strong sym
2311 list. Merge any entries against the same section. */
2312 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
3dab13f6 2313 {
25dbc73a
AM
2314 struct ppc_elf_dyn_relocs *q;
2315
2316 for (q = edir->dyn_relocs; q != NULL; q = q->next)
2317 if (q->sec == p->sec)
2318 {
2319 q->pc_count += p->pc_count;
2320 q->count += p->count;
2321 *pp = p->next;
2322 break;
2323 }
2324 if (q == NULL)
2325 pp = &p->next;
3dab13f6 2326 }
25dbc73a 2327 *pp = edir->dyn_relocs;
3dab13f6 2328 }
25dbc73a
AM
2329
2330 edir->dyn_relocs = eind->dyn_relocs;
2331 eind->dyn_relocs = NULL;
3dab13f6 2332 }
3dab13f6 2333
25dbc73a 2334 edir->tls_mask |= eind->tls_mask;
3dab13f6 2335
25dbc73a
AM
2336 if (ELIMINATE_COPY_RELOCS
2337 && ind->root.type != bfd_link_hash_indirect
2338 && dir->dynamic_adjusted)
2339 {
2340 /* If called to transfer flags for a weakdef during processing
2341 of elf_adjust_dynamic_symbol, don't copy non_got_ref.
2342 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
2343 dir->ref_dynamic |= ind->ref_dynamic;
2344 dir->ref_regular |= ind->ref_regular;
2345 dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
2346 dir->needs_plt |= ind->needs_plt;
2347 }
2348 else
2349 _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
2350}
3dab13f6 2351
8853c3d3
AM
2352/* Return 1 if target is one of ours. */
2353
2354static bfd_boolean
2355is_ppc_elf_target (const struct bfd_target *targ)
2356{
2357 extern const bfd_target bfd_elf32_powerpc_vec;
2358 extern const bfd_target bfd_elf32_powerpcle_vec;
2359
2360 return targ == &bfd_elf32_powerpc_vec || targ == &bfd_elf32_powerpcle_vec;
2361}
2362
25dbc73a
AM
2363/* Hook called by the linker routine which adds symbols from an object
2364 file. We use it to put .comm items in .sbss, and not .bss. */
58111eb7 2365
25dbc73a
AM
2366static bfd_boolean
2367ppc_elf_add_symbol_hook (bfd *abfd,
2368 struct bfd_link_info *info,
2369 Elf_Internal_Sym *sym,
2370 const char **namep ATTRIBUTE_UNUSED,
2371 flagword *flagsp ATTRIBUTE_UNUSED,
2372 asection **secp,
2373 bfd_vma *valp)
2374{
2375 if (sym->st_shndx == SHN_COMMON
2376 && !info->relocatable
2377 && sym->st_size <= elf_gp_size (abfd)
d2663f46 2378 && is_ppc_elf_target (info->hash->creator))
25dbc73a
AM
2379 {
2380 /* Common symbols less than or equal to -G nn bytes are automatically
2381 put into .sbss. */
2382 struct ppc_elf_link_hash_table *htab;
3dab13f6 2383
25dbc73a
AM
2384 htab = ppc_elf_hash_table (info);
2385 if (htab->sbss == NULL)
2386 {
644285ef 2387 flagword flags = SEC_IS_COMMON | SEC_LINKER_CREATED;
3dab13f6 2388
644285ef
AM
2389 if (!htab->elf.dynobj)
2390 htab->elf.dynobj = abfd;
2391
3496cb2a
L
2392 htab->sbss = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
2393 ".sbss",
2394 flags);
2395 if (htab->sbss == NULL)
25dbc73a 2396 return FALSE;
3dab13f6 2397 }
3dab13f6 2398
25dbc73a
AM
2399 *secp = htab->sbss;
2400 *valp = sym->st_size;
2401 }
3dab13f6 2402
25dbc73a 2403 return TRUE;
3dab13f6
AM
2404}
2405\f
c9a2f333 2406/* Create a special linker section. */
25dbc73a 2407
c9a2f333 2408static bfd_boolean
55fd94b0
AM
2409ppc_elf_create_linker_section (bfd *abfd,
2410 struct bfd_link_info *info,
c9a2f333
AM
2411 flagword flags,
2412 elf_linker_section_t *lsect)
252b5132 2413{
58111eb7 2414 struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
c9a2f333 2415 asection *s;
58111eb7 2416
c9a2f333
AM
2417 flags |= (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2418 | SEC_LINKER_CREATED);
58111eb7
AM
2419
2420 /* Record the first bfd that needs the special sections. */
2421 if (!htab->elf.dynobj)
2422 htab->elf.dynobj = abfd;
2423
3496cb2a
L
2424 s = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
2425 lsect->name,
2426 flags);
76750a2f 2427 if (s == NULL
76750a2f 2428 || !bfd_set_section_alignment (htab->elf.dynobj, s, 2))
c9a2f333 2429 return FALSE;
76750a2f 2430 lsect->section = s;
58111eb7 2431
c9a2f333 2432 return TRUE;
252b5132 2433}
252b5132 2434
25dbc73a
AM
2435/* Find a linker generated pointer with a given addend and type. */
2436
2437static elf_linker_section_pointers_t *
2438elf_find_pointer_linker_section
2439 (elf_linker_section_pointers_t *linker_pointers,
2440 bfd_vma addend,
2441 elf_linker_section_t *lsect)
252b5132 2442{
25dbc73a
AM
2443 for ( ; linker_pointers != NULL; linker_pointers = linker_pointers->next)
2444 if (lsect == linker_pointers->lsect && addend == linker_pointers->addend)
2445 return linker_pointers;
252b5132 2446
25dbc73a
AM
2447 return NULL;
2448}
2449
2450/* Allocate a pointer to live in a linker created section. */
2451
2452static bfd_boolean
2453elf_create_pointer_linker_section (bfd *abfd,
25dbc73a
AM
2454 elf_linker_section_t *lsect,
2455 struct elf_link_hash_entry *h,
2456 const Elf_Internal_Rela *rel)
2457{
2458 elf_linker_section_pointers_t **ptr_linker_section_ptr = NULL;
2459 elf_linker_section_pointers_t *linker_section_ptr;
2460 unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
2461 bfd_size_type amt;
2462
2463 BFD_ASSERT (lsect != NULL);
2464
2465 /* Is this a global symbol? */
2466 if (h != NULL)
2467 {
2468 struct ppc_elf_link_hash_entry *eh;
2469
2470 /* Has this symbol already been allocated? If so, our work is done. */
2471 eh = (struct ppc_elf_link_hash_entry *) h;
2472 if (elf_find_pointer_linker_section (eh->linker_section_pointer,
2473 rel->r_addend,
2474 lsect))
2475 return TRUE;
2476
2477 ptr_linker_section_ptr = &eh->linker_section_pointer;
25dbc73a
AM
2478 }
2479 else
2480 {
2481 /* Allocation of a pointer to a local symbol. */
2482 elf_linker_section_pointers_t **ptr = elf_local_ptr_offsets (abfd);
2483
2484 /* Allocate a table to hold the local symbols if first time. */
2485 if (!ptr)
2486 {
2487 unsigned int num_symbols = elf_tdata (abfd)->symtab_hdr.sh_info;
2488
2489 amt = num_symbols;
2490 amt *= sizeof (elf_linker_section_pointers_t *);
2491 ptr = bfd_zalloc (abfd, amt);
2492
2493 if (!ptr)
2494 return FALSE;
2495
2496 elf_local_ptr_offsets (abfd) = ptr;
2497 }
2498
2499 /* Has this symbol already been allocated? If so, our work is done. */
2500 if (elf_find_pointer_linker_section (ptr[r_symndx],
2501 rel->r_addend,
2502 lsect))
2503 return TRUE;
252b5132 2504
25dbc73a 2505 ptr_linker_section_ptr = &ptr[r_symndx];
25dbc73a 2506 }
41fcb14e 2507
25dbc73a
AM
2508 /* Allocate space for a pointer in the linker section, and allocate
2509 a new pointer record from internal memory. */
2510 BFD_ASSERT (ptr_linker_section_ptr != NULL);
2511 amt = sizeof (elf_linker_section_pointers_t);
2512 linker_section_ptr = bfd_alloc (abfd, amt);
41fcb14e 2513
25dbc73a 2514 if (!linker_section_ptr)
7619e7c7 2515 return FALSE;
41fcb14e 2516
25dbc73a
AM
2517 linker_section_ptr->next = *ptr_linker_section_ptr;
2518 linker_section_ptr->addend = rel->r_addend;
2519 linker_section_ptr->lsect = lsect;
25dbc73a 2520 *ptr_linker_section_ptr = linker_section_ptr;
41fcb14e 2521
25dbc73a
AM
2522 linker_section_ptr->offset = lsect->section->size;
2523 lsect->section->size += 4;
7619e7c7 2524
25dbc73a
AM
2525#ifdef DEBUG
2526 fprintf (stderr,
2527 "Create pointer in linker section %s, offset = %ld, section size = %ld\n",
2528 lsect->name, (long) linker_section_ptr->offset,
2529 (long) lsect->section->size);
2530#endif
7619e7c7
AM
2531
2532 return TRUE;
41fcb14e
AM
2533}
2534
b34976b6 2535static bfd_boolean
25dbc73a
AM
2536update_local_sym_info (bfd *abfd,
2537 Elf_Internal_Shdr *symtab_hdr,
2538 unsigned long r_symndx,
2539 int tls_type)
252b5132 2540{
25dbc73a
AM
2541 bfd_signed_vma *local_got_refcounts = elf_local_got_refcounts (abfd);
2542 char *local_got_tls_masks;
252b5132 2543
25dbc73a 2544 if (local_got_refcounts == NULL)
252b5132 2545 {
25dbc73a
AM
2546 bfd_size_type size = symtab_hdr->sh_info;
2547
2548 size *= sizeof (*local_got_refcounts) + sizeof (*local_got_tls_masks);
2549 local_got_refcounts = bfd_zalloc (abfd, size);
2550 if (local_got_refcounts == NULL)
b34976b6 2551 return FALSE;
25dbc73a 2552 elf_local_got_refcounts (abfd) = local_got_refcounts;
252b5132 2553 }
41fcb14e 2554
25dbc73a
AM
2555 local_got_refcounts[r_symndx] += 1;
2556 local_got_tls_masks = (char *) (local_got_refcounts + symtab_hdr->sh_info);
2557 local_got_tls_masks[r_symndx] |= tls_type;
2558 return TRUE;
2559}
41fcb14e 2560
25dbc73a
AM
2561static void
2562bad_shared_reloc (bfd *abfd, enum elf_ppc_reloc_type r_type)
2563{
2564 (*_bfd_error_handler)
2565 (_("%B: relocation %s cannot be used when making a shared object"),
2566 abfd,
2567 ppc_elf_howto_table[r_type]->name);
2568 bfd_set_error (bfd_error_bad_value);
252b5132
RH
2569}
2570
25dbc73a
AM
2571/* Look through the relocs for a section during the first phase, and
2572 allocate space in the global offset table or procedure linkage
2573 table. */
252b5132 2574
b34976b6 2575static bfd_boolean
25dbc73a
AM
2576ppc_elf_check_relocs (bfd *abfd,
2577 struct bfd_link_info *info,
2578 asection *sec,
2579 const Elf_Internal_Rela *relocs)
252b5132 2580{
7619e7c7 2581 struct ppc_elf_link_hash_table *htab;
25dbc73a
AM
2582 Elf_Internal_Shdr *symtab_hdr;
2583 struct elf_link_hash_entry **sym_hashes;
2584 const Elf_Internal_Rela *rel;
2585 const Elf_Internal_Rela *rel_end;
2586 asection *sreloc;
2587
2588 if (info->relocatable)
2589 return TRUE;
252b5132 2590
c87b5a93
AM
2591 /* Don't do anything special with non-loaded, non-alloced sections.
2592 In particular, any relocs in such sections should not affect GOT
2593 and PLT reference counting (ie. we don't allow them to create GOT
2594 or PLT entries), there's no possibility or desire to optimize TLS
2595 relocs, and there's not much point in propagating relocs to shared
2596 libs that the dynamic linker won't relocate. */
2597 if ((sec->flags & SEC_ALLOC) == 0)
2598 return TRUE;
2599
252b5132 2600#ifdef DEBUG
25dbc73a
AM
2601 _bfd_error_handler ("ppc_elf_check_relocs called for section %A in %B",
2602 sec, abfd);
252b5132
RH
2603#endif
2604
25dbc73a
AM
2605 /* Initialize howto table if not already done. */
2606 if (!ppc_elf_howto_table[R_PPC_ADDR32])
2607 ppc_elf_howto_init ();
2608
7619e7c7 2609 htab = ppc_elf_hash_table (info);
25dbc73a
AM
2610 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2611 sym_hashes = elf_sym_hashes (abfd);
2612 sreloc = NULL;
2613
2614 rel_end = relocs + sec->reloc_count;
2615 for (rel = relocs; rel < rel_end; rel++)
2616 {
2617 unsigned long r_symndx;
2618 enum elf_ppc_reloc_type r_type;
2619 struct elf_link_hash_entry *h;
2620 int tls_type = 0;
2621
2622 r_symndx = ELF32_R_SYM (rel->r_info);
2623 if (r_symndx < symtab_hdr->sh_info)
2624 h = NULL;
2625 else
2626 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2627
2628 /* If a relocation refers to _GLOBAL_OFFSET_TABLE_, create the .got.
2629 This shows up in particular in an R_PPC_ADDR32 in the eabi
2630 startup code. */
3b36f7e6
AM
2631 if (h != NULL
2632 && htab->got == NULL
2633 && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
252b5132 2634 {
3b36f7e6
AM
2635 if (htab->elf.dynobj == NULL)
2636 htab->elf.dynobj = abfd;
2637 if (!ppc_elf_create_got (htab->elf.dynobj, info))
2638 return FALSE;
2639 BFD_ASSERT (h == htab->elf.hgot);
25dbc73a 2640 }
252b5132 2641
25dbc73a
AM
2642 r_type = ELF32_R_TYPE (rel->r_info);
2643 switch (r_type)
2644 {
2645 case R_PPC_GOT_TLSLD16:
2646 case R_PPC_GOT_TLSLD16_LO:
2647 case R_PPC_GOT_TLSLD16_HI:
2648 case R_PPC_GOT_TLSLD16_HA:
2649 htab->tlsld_got.refcount += 1;
2650 tls_type = TLS_TLS | TLS_LD;
2651 goto dogottls;
252b5132 2652
25dbc73a
AM
2653 case R_PPC_GOT_TLSGD16:
2654 case R_PPC_GOT_TLSGD16_LO:
2655 case R_PPC_GOT_TLSGD16_HI:
2656 case R_PPC_GOT_TLSGD16_HA:
2657 tls_type = TLS_TLS | TLS_GD;
2658 goto dogottls;
2659
2660 case R_PPC_GOT_TPREL16:
2661 case R_PPC_GOT_TPREL16_LO:
2662 case R_PPC_GOT_TPREL16_HI:
2663 case R_PPC_GOT_TPREL16_HA:
2664 if (info->shared)
2665 info->flags |= DF_STATIC_TLS;
2666 tls_type = TLS_TLS | TLS_TPREL;
2667 goto dogottls;
2668
2669 case R_PPC_GOT_DTPREL16:
2670 case R_PPC_GOT_DTPREL16_LO:
2671 case R_PPC_GOT_DTPREL16_HI:
2672 case R_PPC_GOT_DTPREL16_HA:
2673 tls_type = TLS_TLS | TLS_DTPREL;
2674 dogottls:
2675 sec->has_tls_reloc = 1;
2676 /* Fall thru */
252b5132 2677
25dbc73a
AM
2678 /* GOT16 relocations */
2679 case R_PPC_GOT16:
2680 case R_PPC_GOT16_LO:
2681 case R_PPC_GOT16_HI:
2682 case R_PPC_GOT16_HA:
2683 /* This symbol requires a global offset table entry. */
2684 if (htab->got == NULL)
2685 {
2686 if (htab->elf.dynobj == NULL)
2687 htab->elf.dynobj = abfd;
2688 if (!ppc_elf_create_got (htab->elf.dynobj, info))
2689 return FALSE;
2690 }
2691 if (h != NULL)
2692 {
2693 h->got.refcount += 1;
2694 ppc_elf_hash_entry (h)->tls_mask |= tls_type;
2695 }
2696 else
2697 /* This is a global offset table entry for a local symbol. */
2698 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx, tls_type))
2699 return FALSE;
2700 break;
252b5132 2701
25dbc73a
AM
2702 /* Indirect .sdata relocation. */
2703 case R_PPC_EMB_SDAI16:
2704 if (info->shared)
2705 {
2706 bad_shared_reloc (abfd, r_type);
2707 return FALSE;
2708 }
c9a2f333
AM
2709 if (htab->sdata[0].section == NULL
2710 && !ppc_elf_create_linker_section (abfd, info, 0,
2711 &htab->sdata[0]))
2712 return FALSE;
76750a2f
AM
2713 if (!elf_create_pointer_linker_section (abfd, &htab->sdata[0],
2714 h, rel))
25dbc73a
AM
2715 return FALSE;
2716 break;
252b5132 2717
25dbc73a
AM
2718 /* Indirect .sdata2 relocation. */
2719 case R_PPC_EMB_SDA2I16:
2720 if (info->shared)
2721 {
2722 bad_shared_reloc (abfd, r_type);
2723 return FALSE;
2724 }
c9a2f333
AM
2725 if (htab->sdata[1].section == NULL
2726 && !ppc_elf_create_linker_section (abfd, info, SEC_READONLY,
2727 &htab->sdata[1]))
2728 return FALSE;
76750a2f
AM
2729 if (!elf_create_pointer_linker_section (abfd, &htab->sdata[1],
2730 h, rel))
25dbc73a
AM
2731 return FALSE;
2732 break;
252b5132 2733
25dbc73a
AM
2734 case R_PPC_SDAREL16:
2735 case R_PPC_EMB_SDA2REL:
2736 case R_PPC_EMB_SDA21:
2737 case R_PPC_EMB_RELSDA:
2738 case R_PPC_EMB_NADDR32:
2739 case R_PPC_EMB_NADDR16:
2740 case R_PPC_EMB_NADDR16_LO:
2741 case R_PPC_EMB_NADDR16_HI:
2742 case R_PPC_EMB_NADDR16_HA:
2743 if (info->shared)
2744 {
2745 bad_shared_reloc (abfd, r_type);
2746 return FALSE;
2747 }
2748 break;
252b5132 2749
25dbc73a
AM
2750 case R_PPC_PLT32:
2751 case R_PPC_PLTREL24:
2752 case R_PPC_PLTREL32:
2753 case R_PPC_PLT16_LO:
2754 case R_PPC_PLT16_HI:
2755 case R_PPC_PLT16_HA:
2756#ifdef DEBUG
2757 fprintf (stderr, "Reloc requires a PLT entry\n");
2758#endif
2759 /* This symbol requires a procedure linkage table entry. We
2760 actually build the entry in finish_dynamic_symbol,
2761 because this might be a case of linking PIC code without
2762 linking in any dynamic objects, in which case we don't
2763 need to generate a procedure linkage table after all. */
7619e7c7 2764
25dbc73a
AM
2765 if (h == NULL)
2766 {
2767 /* It does not make sense to have a procedure linkage
2768 table entry for a local symbol. */
2769 (*_bfd_error_handler) (_("%B(%A+0x%lx): %s reloc against "
2770 "local symbol"),
2771 abfd,
2772 sec,
2773 (long) rel->r_offset,
2774 ppc_elf_howto_table[r_type]->name);
2775 bfd_set_error (bfd_error_bad_value);
2776 return FALSE;
2777 }
ee05f2fe 2778
25dbc73a
AM
2779 h->needs_plt = 1;
2780 h->plt.refcount++;
2781 break;
ee05f2fe 2782
25dbc73a
AM
2783 /* The following relocations don't need to propagate the
2784 relocation if linking a shared object since they are
2785 section relative. */
2786 case R_PPC_SECTOFF:
2787 case R_PPC_SECTOFF_LO:
2788 case R_PPC_SECTOFF_HI:
2789 case R_PPC_SECTOFF_HA:
2790 case R_PPC_DTPREL16:
2791 case R_PPC_DTPREL16_LO:
2792 case R_PPC_DTPREL16_HI:
2793 case R_PPC_DTPREL16_HA:
2794 case R_PPC_TOC16:
2795 break;
252b5132 2796
25dbc73a
AM
2797 /* This are just markers. */
2798 case R_PPC_TLS:
2799 case R_PPC_EMB_MRKREF:
2800 case R_PPC_NONE:
2801 case R_PPC_max:
2802 break;
252b5132 2803
25dbc73a
AM
2804 /* These should only appear in dynamic objects. */
2805 case R_PPC_COPY:
2806 case R_PPC_GLOB_DAT:
2807 case R_PPC_JMP_SLOT:
2808 case R_PPC_RELATIVE:
2809 break;
252b5132 2810
25dbc73a
AM
2811 /* These aren't handled yet. We'll report an error later. */
2812 case R_PPC_ADDR30:
2813 case R_PPC_EMB_RELSEC16:
2814 case R_PPC_EMB_RELST_LO:
2815 case R_PPC_EMB_RELST_HI:
2816 case R_PPC_EMB_RELST_HA:
2817 case R_PPC_EMB_BIT_FLD:
2818 break;
252b5132 2819
25dbc73a
AM
2820 /* This refers only to functions defined in the shared library. */
2821 case R_PPC_LOCAL24PC:
2822 break;
252b5132 2823
25dbc73a
AM
2824 /* This relocation describes the C++ object vtable hierarchy.
2825 Reconstruct it for later use during GC. */
2826 case R_PPC_GNU_VTINHERIT:
2827 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2828 return FALSE;
2829 break;
252b5132 2830
25dbc73a
AM
2831 /* This relocation describes which C++ vtable entries are actually
2832 used. Record for later use during GC. */
2833 case R_PPC_GNU_VTENTRY:
2834 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2835 return FALSE;
2836 break;
252b5132 2837
25dbc73a
AM
2838 /* We shouldn't really be seeing these. */
2839 case R_PPC_TPREL32:
2840 if (info->shared)
2841 info->flags |= DF_STATIC_TLS;
2842 goto dodyn;
252b5132 2843
25dbc73a
AM
2844 /* Nor these. */
2845 case R_PPC_DTPMOD32:
2846 case R_PPC_DTPREL32:
2847 goto dodyn;
252b5132 2848
25dbc73a
AM
2849 case R_PPC_TPREL16:
2850 case R_PPC_TPREL16_LO:
2851 case R_PPC_TPREL16_HI:
2852 case R_PPC_TPREL16_HA:
2853 if (info->shared)
2854 info->flags |= DF_STATIC_TLS;
2855 goto dodyn;
ee05f2fe 2856
25dbc73a
AM
2857 /* When creating a shared object, we must copy these
2858 relocs into the output file. We create a reloc
2859 section in dynobj and make room for the reloc. */
2860 case R_PPC_REL24:
2861 case R_PPC_REL14:
2862 case R_PPC_REL14_BRTAKEN:
2863 case R_PPC_REL14_BRNTAKEN:
2864 case R_PPC_REL32:
3b36f7e6 2865 if (h == NULL || h == htab->elf.hgot)
25dbc73a
AM
2866 break;
2867 /* fall through */
ee05f2fe 2868
25dbc73a
AM
2869 case R_PPC_ADDR32:
2870 case R_PPC_ADDR24:
2871 case R_PPC_ADDR16:
2872 case R_PPC_ADDR16_LO:
2873 case R_PPC_ADDR16_HI:
2874 case R_PPC_ADDR16_HA:
2875 case R_PPC_ADDR14:
2876 case R_PPC_ADDR14_BRTAKEN:
2877 case R_PPC_ADDR14_BRNTAKEN:
2878 case R_PPC_UADDR32:
2879 case R_PPC_UADDR16:
2880 if (h != NULL && !info->shared)
2881 {
2882 /* We may need a plt entry if the symbol turns out to be
2883 a function defined in a dynamic object. */
2884 h->plt.refcount++;
7fce784e 2885
25dbc73a
AM
2886 /* We may need a copy reloc too. */
2887 h->non_got_ref = 1;
2888 }
7619e7c7 2889
25dbc73a
AM
2890 dodyn:
2891 /* If we are creating a shared library, and this is a reloc
2892 against a global symbol, or a non PC relative reloc
2893 against a local symbol, then we need to copy the reloc
2894 into the shared library. However, if we are linking with
2895 -Bsymbolic, we do not need to copy a reloc against a
2896 global symbol which is defined in an object we are
2897 including in the link (i.e., DEF_REGULAR is set). At
2898 this point we have not seen all the input files, so it is
2899 possible that DEF_REGULAR is not set now but will be set
2900 later (it is never cleared). In case of a weak definition,
2901 DEF_REGULAR may be cleared later by a strong definition in
2902 a shared library. We account for that possibility below by
2903 storing information in the dyn_relocs field of the hash
2904 table entry. A similar situation occurs when creating
2905 shared libraries and symbol visibility changes render the
2906 symbol local.
7619e7c7 2907
25dbc73a
AM
2908 If on the other hand, we are creating an executable, we
2909 may need to keep relocations for symbols satisfied by a
2910 dynamic library if we manage to avoid copy relocs for the
2911 symbol. */
2912 if ((info->shared
2913 && (MUST_BE_DYN_RELOC (r_type)
2914 || (h != NULL
2915 && (! info->symbolic
2916 || h->root.type == bfd_link_hash_defweak
2917 || !h->def_regular))))
2918 || (ELIMINATE_COPY_RELOCS
2919 && !info->shared
25dbc73a
AM
2920 && h != NULL
2921 && (h->root.type == bfd_link_hash_defweak
2922 || !h->def_regular)))
2923 {
2924 struct ppc_elf_dyn_relocs *p;
2925 struct ppc_elf_dyn_relocs **head;
7619e7c7 2926
25dbc73a
AM
2927#ifdef DEBUG
2928 fprintf (stderr,
2929 "ppc_elf_check_relocs needs to "
2930 "create relocation for %s\n",
2931 (h && h->root.root.string
2932 ? h->root.root.string : "<unknown>"));
2933#endif
2934 if (sreloc == NULL)
2935 {
2936 const char *name;
7619e7c7 2937
25dbc73a
AM
2938 name = (bfd_elf_string_from_elf_section
2939 (abfd,
2940 elf_elfheader (abfd)->e_shstrndx,
2941 elf_section_data (sec)->rel_hdr.sh_name));
2942 if (name == NULL)
2943 return FALSE;
7619e7c7 2944
25dbc73a
AM
2945 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
2946 && strcmp (bfd_get_section_name (abfd, sec),
2947 name + 5) == 0);
7619e7c7 2948
c9a2f333
AM
2949 if (htab->elf.dynobj == NULL)
2950 htab->elf.dynobj = abfd;
25dbc73a
AM
2951 sreloc = bfd_get_section_by_name (htab->elf.dynobj, name);
2952 if (sreloc == NULL)
2953 {
2954 flagword flags;
7619e7c7 2955
25dbc73a 2956 flags = (SEC_HAS_CONTENTS | SEC_READONLY
c87b5a93
AM
2957 | SEC_IN_MEMORY | SEC_LINKER_CREATED
2958 | SEC_ALLOC | SEC_LOAD);
3496cb2a
L
2959 sreloc = bfd_make_section_with_flags (htab->elf.dynobj,
2960 name,
2961 flags);
25dbc73a 2962 if (sreloc == NULL
25dbc73a
AM
2963 || ! bfd_set_section_alignment (htab->elf.dynobj,
2964 sreloc, 2))
2965 return FALSE;
2966 }
2967 elf_section_data (sec)->sreloc = sreloc;
2968 }
7619e7c7 2969
25dbc73a
AM
2970 /* If this is a global symbol, we count the number of
2971 relocations we need for this symbol. */
2972 if (h != NULL)
2973 {
2974 head = &ppc_elf_hash_entry (h)->dyn_relocs;
2975 }
2976 else
2977 {
2978 /* Track dynamic relocs needed for local syms too.
2979 We really need local syms available to do this
2980 easily. Oh well. */
7619e7c7 2981
25dbc73a
AM
2982 asection *s;
2983 s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
2984 sec, r_symndx);
2985 if (s == NULL)
2986 return FALSE;
7fce784e 2987
25dbc73a
AM
2988 head = ((struct ppc_elf_dyn_relocs **)
2989 &elf_section_data (s)->local_dynrel);
2990 }
7fce784e 2991
25dbc73a
AM
2992 p = *head;
2993 if (p == NULL || p->sec != sec)
2994 {
2995 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
2996 if (p == NULL)
2997 return FALSE;
2998 p->next = *head;
2999 *head = p;
3000 p->sec = sec;
3001 p->count = 0;
3002 p->pc_count = 0;
3003 }
3004
3005 p->count += 1;
3006 if (!MUST_BE_DYN_RELOC (r_type))
3007 p->pc_count += 1;
7619e7c7 3008 }
25dbc73a
AM
3009
3010 break;
7619e7c7
AM
3011 }
3012 }
ee05f2fe 3013
25dbc73a
AM
3014 return TRUE;
3015}
3016\f
8853c3d3
AM
3017/* Merge backend specific data from an object file to the output
3018 object file when linking. */
3019
3020static bfd_boolean
3021ppc_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
3022{
3023 flagword old_flags;
3024 flagword new_flags;
3025 bfd_boolean error;
3026
3027 if (!is_ppc_elf_target (ibfd->xvec)
3028 || !is_ppc_elf_target (obfd->xvec))
3029 return TRUE;
3030
3031 /* Check if we have the same endianess. */
3032 if (! _bfd_generic_verify_endian_match (ibfd, obfd))
3033 return FALSE;
3034
3035 new_flags = elf_elfheader (ibfd)->e_flags;
3036 old_flags = elf_elfheader (obfd)->e_flags;
3037 if (!elf_flags_init (obfd))
3038 {
3039 /* First call, no flags set. */
3040 elf_flags_init (obfd) = TRUE;
3041 elf_elfheader (obfd)->e_flags = new_flags;
3042 }
3043
3044 /* Compatible flags are ok. */
3045 else if (new_flags == old_flags)
3046 ;
3047
3048 /* Incompatible flags. */
3049 else
3050 {
3051 /* Warn about -mrelocatable mismatch. Allow -mrelocatable-lib
3052 to be linked with either. */
3053 error = FALSE;
3054 if ((new_flags & EF_PPC_RELOCATABLE) != 0
3055 && (old_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0)
3056 {
3057 error = TRUE;
3058 (*_bfd_error_handler)
3059 (_("%B: compiled with -mrelocatable and linked with "
3060 "modules compiled normally"), ibfd);
3061 }
3062 else if ((new_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0
3063 && (old_flags & EF_PPC_RELOCATABLE) != 0)
3064 {
3065 error = TRUE;
3066 (*_bfd_error_handler)
3067 (_("%B: compiled normally and linked with "
3068 "modules compiled with -mrelocatable"), ibfd);
3069 }
3070
3071 /* The output is -mrelocatable-lib iff both the input files are. */
3072 if (! (new_flags & EF_PPC_RELOCATABLE_LIB))
3073 elf_elfheader (obfd)->e_flags &= ~EF_PPC_RELOCATABLE_LIB;
3074
3075 /* The output is -mrelocatable iff it can't be -mrelocatable-lib,
3076 but each input file is either -mrelocatable or -mrelocatable-lib. */
3077 if (! (elf_elfheader (obfd)->e_flags & EF_PPC_RELOCATABLE_LIB)
3078 && (new_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE))
3079 && (old_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE)))
3080 elf_elfheader (obfd)->e_flags |= EF_PPC_RELOCATABLE;
3081
3082 /* Do not warn about eabi vs. V.4 mismatch, just or in the bit if
3083 any module uses it. */
3084 elf_elfheader (obfd)->e_flags |= (new_flags & EF_PPC_EMB);
3085
3086 new_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
3087 old_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
3088
3089 /* Warn about any other mismatches. */
3090 if (new_flags != old_flags)
3091 {
3092 error = TRUE;
3093 (*_bfd_error_handler)
3094 (_("%B: uses different e_flags (0x%lx) fields "
3095 "than previous modules (0x%lx)"),
3096 ibfd, (long) new_flags, (long) old_flags);
3097 }
3098
3099 if (error)
3100 {
3101 bfd_set_error (bfd_error_bad_value);
3102 return FALSE;
3103 }
3104 }
3105
3106 return TRUE;
3107}
3108\f
25dbc73a
AM
3109/* Return the section that should be marked against GC for a given
3110 relocation. */
586119b3 3111
25dbc73a
AM
3112static asection *
3113ppc_elf_gc_mark_hook (asection *sec,
3114 struct bfd_link_info *info ATTRIBUTE_UNUSED,
3115 Elf_Internal_Rela *rel,
3116 struct elf_link_hash_entry *h,
3117 Elf_Internal_Sym *sym)
3118{
3119 if (h != NULL)
ee05f2fe 3120 {
25dbc73a 3121 switch (ELF32_R_TYPE (rel->r_info))
ee05f2fe 3122 {
25dbc73a
AM
3123 case R_PPC_GNU_VTINHERIT:
3124 case R_PPC_GNU_VTENTRY:
3125 break;
ee05f2fe 3126
25dbc73a
AM
3127 default:
3128 switch (h->root.type)
ee05f2fe 3129 {
25dbc73a
AM
3130 case bfd_link_hash_defined:
3131 case bfd_link_hash_defweak:
3132 return h->root.u.def.section;
3133
3134 case bfd_link_hash_common:
3135 return h->root.u.c.p->section;
3136
3137 default:
3138 break;
ee05f2fe
AM
3139 }
3140 }
25dbc73a
AM
3141 }
3142 else
3143 return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
4e795f50 3144
25dbc73a
AM
3145 return NULL;
3146}
a876ecf9 3147
25dbc73a
AM
3148/* Update the got, plt and dynamic reloc reference counts for the
3149 section being removed. */
3150
3151static bfd_boolean
3152ppc_elf_gc_sweep_hook (bfd *abfd,
3153 struct bfd_link_info *info,
3154 asection *sec,
3155 const Elf_Internal_Rela *relocs)
3156{
3157 struct ppc_elf_link_hash_table *htab;
3158 Elf_Internal_Shdr *symtab_hdr;
3159 struct elf_link_hash_entry **sym_hashes;
3160 bfd_signed_vma *local_got_refcounts;
3161 const Elf_Internal_Rela *rel, *relend;
3162
c87b5a93
AM
3163 if ((sec->flags & SEC_ALLOC) == 0)
3164 return TRUE;
3165
25dbc73a
AM
3166 elf_section_data (sec)->local_dynrel = NULL;
3167
3168 htab = ppc_elf_hash_table (info);
3169 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3170 sym_hashes = elf_sym_hashes (abfd);
3171 local_got_refcounts = elf_local_got_refcounts (abfd);
3172
3173 relend = relocs + sec->reloc_count;
3174 for (rel = relocs; rel < relend; rel++)
3175 {
3176 unsigned long r_symndx;
3177 enum elf_ppc_reloc_type r_type;
3178 struct elf_link_hash_entry *h = NULL;
3179
3180 r_symndx = ELF32_R_SYM (rel->r_info);
3181 if (r_symndx >= symtab_hdr->sh_info)
a876ecf9 3182 {
25dbc73a
AM
3183 struct ppc_elf_dyn_relocs **pp, *p;
3184 struct ppc_elf_link_hash_entry *eh;
3185
3186 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3187 while (h->root.type == bfd_link_hash_indirect
3188 || h->root.type == bfd_link_hash_warning)
3189 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3190 eh = (struct ppc_elf_link_hash_entry *) h;
3191
3192 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
3193 if (p->sec == sec)
3194 {
3195 /* Everything must go for SEC. */
3196 *pp = p->next;
3197 break;
3198 }
a876ecf9 3199 }
ee05f2fe 3200
25dbc73a
AM
3201 r_type = ELF32_R_TYPE (rel->r_info);
3202 switch (r_type)
ee05f2fe 3203 {
25dbc73a
AM
3204 case R_PPC_GOT_TLSLD16:
3205 case R_PPC_GOT_TLSLD16_LO:
3206 case R_PPC_GOT_TLSLD16_HI:
3207 case R_PPC_GOT_TLSLD16_HA:
3208 htab->tlsld_got.refcount -= 1;
3209 /* Fall thru */
3210
3211 case R_PPC_GOT_TLSGD16:
3212 case R_PPC_GOT_TLSGD16_LO:
3213 case R_PPC_GOT_TLSGD16_HI:
3214 case R_PPC_GOT_TLSGD16_HA:
3215 case R_PPC_GOT_TPREL16:
3216 case R_PPC_GOT_TPREL16_LO:
3217 case R_PPC_GOT_TPREL16_HI:
3218 case R_PPC_GOT_TPREL16_HA:
3219 case R_PPC_GOT_DTPREL16:
3220 case R_PPC_GOT_DTPREL16_LO:
3221 case R_PPC_GOT_DTPREL16_HI:
3222 case R_PPC_GOT_DTPREL16_HA:
3223 case R_PPC_GOT16:
3224 case R_PPC_GOT16_LO:
3225 case R_PPC_GOT16_HI:
3226 case R_PPC_GOT16_HA:
3227 if (h != NULL)
ee05f2fe 3228 {
25dbc73a
AM
3229 if (h->got.refcount > 0)
3230 h->got.refcount--;
ee05f2fe 3231 }
25dbc73a
AM
3232 else if (local_got_refcounts != NULL)
3233 {
3234 if (local_got_refcounts[r_symndx] > 0)
3235 local_got_refcounts[r_symndx]--;
3236 }
3237 break;
ee05f2fe 3238
25dbc73a
AM
3239 case R_PPC_REL24:
3240 case R_PPC_REL14:
3241 case R_PPC_REL14_BRTAKEN:
3242 case R_PPC_REL14_BRNTAKEN:
3243 case R_PPC_REL32:
3b36f7e6 3244 if (h == NULL || h == htab->elf.hgot)
25dbc73a
AM
3245 break;
3246 /* Fall thru */
ee05f2fe 3247
25dbc73a
AM
3248 case R_PPC_ADDR32:
3249 case R_PPC_ADDR24:
3250 case R_PPC_ADDR16:
3251 case R_PPC_ADDR16_LO:
3252 case R_PPC_ADDR16_HI:
3253 case R_PPC_ADDR16_HA:
3254 case R_PPC_ADDR14:
3255 case R_PPC_ADDR14_BRTAKEN:
3256 case R_PPC_ADDR14_BRNTAKEN:
3257 case R_PPC_UADDR32:
3258 case R_PPC_UADDR16:
3259 case R_PPC_PLT32:
3260 case R_PPC_PLTREL24:
3261 case R_PPC_PLT16_LO:
3262 case R_PPC_PLT16_HI:
3263 case R_PPC_PLT16_HA:
3264 if (h != NULL)
3265 {
3266 if (h->plt.refcount > 0)
3267 h->plt.refcount--;
3268 }
3269 break;
ee05f2fe 3270
25dbc73a
AM
3271 default:
3272 break;
3273 }
7fce784e 3274 }
7fce784e
AS
3275 return TRUE;
3276}
25dbc73a
AM
3277\f
3278/* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
7fce784e 3279
25dbc73a
AM
3280asection *
3281ppc_elf_tls_setup (bfd *obfd, struct bfd_link_info *info)
7fce784e 3282{
25dbc73a 3283 struct ppc_elf_link_hash_table *htab;
7fce784e 3284
25dbc73a
AM
3285 htab = ppc_elf_hash_table (info);
3286 htab->tls_get_addr = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
3287 FALSE, FALSE, TRUE);
7fce784e 3288
25dbc73a 3289 return _bfd_elf_tls_setup (obfd, info);
7fce784e
AS
3290}
3291
25dbc73a
AM
3292/* Run through all the TLS relocs looking for optimization
3293 opportunities. */
252b5132 3294
25dbc73a
AM
3295bfd_boolean
3296ppc_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED,
3297 struct bfd_link_info *info)
252b5132 3298{
7fce784e 3299 bfd *ibfd;
25dbc73a
AM
3300 asection *sec;
3301 struct ppc_elf_link_hash_table *htab;
252b5132 3302
25dbc73a
AM
3303 if (info->relocatable || info->shared)
3304 return TRUE;
252b5132 3305
7619e7c7 3306 htab = ppc_elf_hash_table (info);
25dbc73a 3307 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
252b5132 3308 {
25dbc73a
AM
3309 Elf_Internal_Sym *locsyms = NULL;
3310 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
7619e7c7 3311
25dbc73a
AM
3312 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
3313 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
3314 {
3315 Elf_Internal_Rela *relstart, *rel, *relend;
3316 int expecting_tls_get_addr;
252b5132 3317
25dbc73a
AM
3318 /* Read the relocations. */
3319 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
3320 info->keep_memory);
3321 if (relstart == NULL)
3322 return FALSE;
7619e7c7 3323
25dbc73a
AM
3324 expecting_tls_get_addr = 0;
3325 relend = relstart + sec->reloc_count;
3326 for (rel = relstart; rel < relend; rel++)
3327 {
3328 enum elf_ppc_reloc_type r_type;
3329 unsigned long r_symndx;
3330 struct elf_link_hash_entry *h = NULL;
3331 char *tls_mask;
3332 char tls_set, tls_clear;
3333 bfd_boolean is_local;
7fce784e 3334
25dbc73a
AM
3335 r_symndx = ELF32_R_SYM (rel->r_info);
3336 if (r_symndx >= symtab_hdr->sh_info)
3337 {
3338 struct elf_link_hash_entry **sym_hashes;
7fce784e 3339
25dbc73a
AM
3340 sym_hashes = elf_sym_hashes (ibfd);
3341 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3342 while (h->root.type == bfd_link_hash_indirect
3343 || h->root.type == bfd_link_hash_warning)
3344 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3345 }
7619e7c7 3346
25dbc73a
AM
3347 is_local = FALSE;
3348 if (h == NULL
3349 || !h->def_dynamic)
3350 is_local = TRUE;
7619e7c7 3351
25dbc73a
AM
3352 r_type = ELF32_R_TYPE (rel->r_info);
3353 switch (r_type)
7619e7c7 3354 {
25dbc73a
AM
3355 case R_PPC_GOT_TLSLD16:
3356 case R_PPC_GOT_TLSLD16_LO:
3357 case R_PPC_GOT_TLSLD16_HI:
3358 case R_PPC_GOT_TLSLD16_HA:
3359 /* These relocs should never be against a symbol
3360 defined in a shared lib. Leave them alone if
3361 that turns out to be the case. */
3362 expecting_tls_get_addr = 0;
3363 htab->tlsld_got.refcount -= 1;
3364 if (!is_local)
3365 continue;
3366
3367 /* LD -> LE */
3368 tls_set = 0;
3369 tls_clear = TLS_LD;
3370 expecting_tls_get_addr = 1;
3371 break;
3372
3373 case R_PPC_GOT_TLSGD16:
3374 case R_PPC_GOT_TLSGD16_LO:
3375 case R_PPC_GOT_TLSGD16_HI:
3376 case R_PPC_GOT_TLSGD16_HA:
3377 if (is_local)
3378 /* GD -> LE */
3379 tls_set = 0;
3380 else
3381 /* GD -> IE */
3382 tls_set = TLS_TLS | TLS_TPRELGD;
3383 tls_clear = TLS_GD;
3384 expecting_tls_get_addr = 1;
3385 break;
3386
3387 case R_PPC_GOT_TPREL16:
3388 case R_PPC_GOT_TPREL16_LO:
3389 case R_PPC_GOT_TPREL16_HI:
3390 case R_PPC_GOT_TPREL16_HA:
3391 expecting_tls_get_addr = 0;
3392 if (is_local)
3393 {
3394 /* IE -> LE */
3395 tls_set = 0;
3396 tls_clear = TLS_TPREL;
3397 break;
3398 }
3399 else
3400 continue;
3401
3402 case R_PPC_REL14:
3403 case R_PPC_REL14_BRTAKEN:
3404 case R_PPC_REL14_BRNTAKEN:
3405 case R_PPC_REL24:
3406 if (expecting_tls_get_addr
3407 && h != NULL
3408 && h == htab->tls_get_addr)
3409 {
3410 if (h->plt.refcount > 0)
3411 h->plt.refcount -= 1;
3412 }
3413 expecting_tls_get_addr = 0;
3414 continue;
3415
3416 default:
3417 expecting_tls_get_addr = 0;
3418 continue;
7619e7c7 3419 }
25dbc73a
AM
3420
3421 if (h != NULL)
7619e7c7 3422 {
25dbc73a
AM
3423 if (tls_set == 0)
3424 {
3425 /* We managed to get rid of a got entry. */
3426 if (h->got.refcount > 0)
3427 h->got.refcount -= 1;
3428 }
3429 tls_mask = &ppc_elf_hash_entry (h)->tls_mask;
3430 }
3431 else
3432 {
3433 Elf_Internal_Sym *sym;
3434 bfd_signed_vma *lgot_refs;
3435 char *lgot_masks;
3436
3437 if (locsyms == NULL)
3438 {
3439 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
3440 if (locsyms == NULL)
3441 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
3442 symtab_hdr->sh_info,
3443 0, NULL, NULL, NULL);
3444 if (locsyms == NULL)
3445 {
3446 if (elf_section_data (sec)->relocs != relstart)
3447 free (relstart);
3448 return FALSE;
3449 }
3450 }
3451 sym = locsyms + r_symndx;
3452 lgot_refs = elf_local_got_refcounts (ibfd);
3453 if (lgot_refs == NULL)
3454 abort ();
3455 if (tls_set == 0)
3456 {
3457 /* We managed to get rid of a got entry. */
3458 if (lgot_refs[r_symndx] > 0)
3459 lgot_refs[r_symndx] -= 1;
3460 }
3461 lgot_masks = (char *) (lgot_refs + symtab_hdr->sh_info);
3462 tls_mask = &lgot_masks[r_symndx];
7619e7c7 3463 }
25dbc73a
AM
3464
3465 *tls_mask |= tls_set;
3466 *tls_mask &= ~tls_clear;
7619e7c7 3467 }
25dbc73a
AM
3468
3469 if (elf_section_data (sec)->relocs != relstart)
3470 free (relstart);
7619e7c7 3471 }
25dbc73a
AM
3472
3473 if (locsyms != NULL
3474 && (symtab_hdr->contents != (unsigned char *) locsyms))
3475 {
3476 if (!info->keep_memory)
3477 free (locsyms);
3478 else
3479 symtab_hdr->contents = (unsigned char *) locsyms;
3480 }
7fce784e 3481 }
25dbc73a
AM
3482 return TRUE;
3483}
3484\f
3485/* Adjust a symbol defined by a dynamic object and referenced by a
3486 regular object. The current definition is in some section of the
3487 dynamic object, but we're not including those sections. We have to
3488 change the definition to something the rest of the link can
3489 understand. */
7fce784e 3490
25dbc73a
AM
3491static bfd_boolean
3492ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
3493 struct elf_link_hash_entry *h)
3494{
3495 struct ppc_elf_link_hash_table *htab;
3496 asection *s;
3497 unsigned int power_of_two;
7fce784e 3498
25dbc73a
AM
3499#ifdef DEBUG
3500 fprintf (stderr, "ppc_elf_adjust_dynamic_symbol called for %s\n",
3501 h->root.root.string);
3502#endif
252b5132 3503
25dbc73a
AM
3504 /* Make sure we know what is going on here. */
3505 htab = ppc_elf_hash_table (info);
3506 BFD_ASSERT (htab->elf.dynobj != NULL
3507 && (h->needs_plt
3508 || h->u.weakdef != NULL
3509 || (h->def_dynamic
3510 && h->ref_regular
3511 && !h->def_regular)));
252b5132 3512
25dbc73a
AM
3513 /* Deal with function syms. */
3514 if (h->type == STT_FUNC
3515 || h->needs_plt)
3516 {
3517 /* Clear procedure linkage table information for any symbol that
3518 won't need a .plt entry. */
3519 if (h->plt.refcount <= 0
3520 || SYMBOL_CALLS_LOCAL (info, h)
3521 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
3522 && h->root.type == bfd_link_hash_undefweak))
252b5132 3523 {
25dbc73a 3524 /* A PLT entry is not required/allowed when:
252b5132 3525
25dbc73a
AM
3526 1. We are not using ld.so; because then the PLT entry
3527 can't be set up, so we can't use one. In this case,
3528 ppc_elf_adjust_dynamic_symbol won't even be called.
252b5132 3529
25dbc73a
AM
3530 2. GC has rendered the entry unused.
3531
3532 3. We know for certain that a call to this symbol
3533 will go to this object, or will remain undefined. */
3534 h->plt.offset = (bfd_vma) -1;
3535 h->needs_plt = 0;
3536 }
3537 return TRUE;
252b5132 3538 }
25dbc73a
AM
3539 else
3540 h->plt.offset = (bfd_vma) -1;
252b5132 3541
25dbc73a
AM
3542 /* If this is a weak symbol, and there is a real definition, the
3543 processor independent code will have arranged for us to see the
3544 real definition first, and we can just use the same value. */
3545 if (h->u.weakdef != NULL)
252b5132 3546 {
25dbc73a
AM
3547 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
3548 || h->u.weakdef->root.type == bfd_link_hash_defweak);
3549 h->root.u.def.section = h->u.weakdef->root.u.def.section;
3550 h->root.u.def.value = h->u.weakdef->root.u.def.value;
3551 if (ELIMINATE_COPY_RELOCS)
3552 h->non_got_ref = h->u.weakdef->non_got_ref;
3553 return TRUE;
3554 }
dc810e39 3555
25dbc73a
AM
3556 /* This is a reference to a symbol defined by a dynamic object which
3557 is not a function. */
252b5132 3558
25dbc73a
AM
3559 /* If we are creating a shared library, we must presume that the
3560 only references to the symbol are via the global offset table.
3561 For such cases we need not do anything here; the relocations will
3562 be handled correctly by relocate_section. */
3563 if (info->shared)
3564 return TRUE;
252b5132 3565
25dbc73a
AM
3566 /* If there are no references to this symbol that do not use the
3567 GOT, we don't need to generate a copy reloc. */
3568 if (!h->non_got_ref)
3569 return TRUE;
3570
3571 if (ELIMINATE_COPY_RELOCS)
3572 {
3573 struct ppc_elf_dyn_relocs *p;
3574 for (p = ppc_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
252b5132 3575 {
25dbc73a
AM
3576 s = p->sec->output_section;
3577 if (s != NULL && (s->flags & SEC_READONLY) != 0)
3578 break;
252b5132
RH
3579 }
3580
25dbc73a
AM
3581 /* If we didn't find any dynamic relocs in read-only sections, then
3582 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
3583 if (p == NULL)
252b5132 3584 {
25dbc73a
AM
3585 h->non_got_ref = 0;
3586 return TRUE;
252b5132
RH
3587 }
3588 }
3589
25dbc73a
AM
3590 /* We must allocate the symbol in our .dynbss section, which will
3591 become part of the .bss section of the executable. There will be
3592 an entry for this symbol in the .dynsym section. The dynamic
3593 object will contain position independent code, so all references
3594 from the dynamic object to this symbol will go through the global
3595 offset table. The dynamic linker will use the .dynsym entry to
3596 determine the address it must put in the global offset table, so
3597 both the dynamic object and the regular object will refer to the
3598 same memory location for the variable.
3599
3600 Of course, if the symbol is sufficiently small, we must instead
3601 allocate it in .sbss. FIXME: It would be better to do this if and
3602 only if there were actually SDAREL relocs for that symbol. */
3603
3604 if (h->size <= elf_gp_size (htab->elf.dynobj))
3605 s = htab->dynsbss;
3606 else
3607 s = htab->dynbss;
3608 BFD_ASSERT (s != NULL);
3609
3610 /* We must generate a R_PPC_COPY reloc to tell the dynamic linker to
3611 copy the initial value out of the dynamic object and into the
3612 runtime process image. We need to remember the offset into the
3613 .rela.bss section we are going to use. */
3614 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
3615 {
3616 asection *srel;
3617
3618 if (h->size <= elf_gp_size (htab->elf.dynobj))
3619 srel = htab->relsbss;
3620 else
3621 srel = htab->relbss;
3622 BFD_ASSERT (srel != NULL);
3623 srel->size += sizeof (Elf32_External_Rela);
3624 h->needs_copy = 1;
3625 }
7619e7c7 3626
25dbc73a
AM
3627 /* We need to figure out the alignment required for this symbol. I
3628 have no idea how ELF linkers handle this. */
3629 power_of_two = bfd_log2 (h->size);
3630 if (power_of_two > 4)
3631 power_of_two = 4;
7619e7c7 3632
25dbc73a
AM
3633 /* Apply the required alignment. */
3634 s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
3635 if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
3636 {
3637 if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
7619e7c7 3638 return FALSE;
7619e7c7
AM
3639 }
3640
25dbc73a
AM
3641 /* Define the symbol as being at this point in the section. */
3642 h->root.u.def.section = s;
3643 h->root.u.def.value = s->size;
7619e7c7 3644
25dbc73a
AM
3645 /* Increment the section size to make room for the symbol. */
3646 s->size += h->size;
7619e7c7 3647
25dbc73a
AM
3648 return TRUE;
3649}
3650\f
3b36f7e6
AM
3651/* Allocate NEED contiguous space in .got, and return the offset.
3652 Handles allocation of the got header when crossing 32k. */
3653
3654static bfd_vma
3655allocate_got (struct ppc_elf_link_hash_table *htab, unsigned int need)
3656{
3657 bfd_vma where;
3658 unsigned int max_before_header = 32764;
3659
3660 if (need <= htab->got_gap)
3661 {
3662 where = max_before_header - htab->got_gap;
3663 htab->got_gap -= need;
3664 }
3665 else
3666 {
3667 if (htab->got->size + need > max_before_header
3668 && htab->got->size <= max_before_header)
3669 {
3670 htab->got_gap = max_before_header - htab->got->size;
3671 htab->got->size = max_before_header + htab->got_header_size;
3672 }
3673 where = htab->got->size;
3674 htab->got->size += need;
3675 }
3676 return where;
3677}
3678
25dbc73a 3679/* Allocate space in associated reloc sections for dynamic relocs. */
252b5132 3680
b34976b6 3681static bfd_boolean
25dbc73a 3682allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
252b5132 3683{
25dbc73a
AM
3684 struct bfd_link_info *info = inf;
3685 struct ppc_elf_link_hash_entry *eh;
7619e7c7 3686 struct ppc_elf_link_hash_table *htab;
25dbc73a 3687 struct ppc_elf_dyn_relocs *p;
252b5132 3688
25dbc73a 3689 if (h->root.type == bfd_link_hash_indirect)
b34976b6 3690 return TRUE;
252b5132 3691
25dbc73a
AM
3692 if (h->root.type == bfd_link_hash_warning)
3693 /* When warning symbols are created, they **replace** the "real"
3694 entry in the hash table, thus we never get to see the real
3695 symbol in a hash traversal. So look at it now. */
3696 h = (struct elf_link_hash_entry *) h->root.u.i.link;
e47cd125 3697
7619e7c7 3698 htab = ppc_elf_hash_table (info);
25dbc73a
AM
3699 if (htab->elf.dynamic_sections_created
3700 && h->plt.refcount > 0)
252b5132 3701 {
25dbc73a
AM
3702 /* Make sure this symbol is output as a dynamic symbol. */
3703 if (h->dynindx == -1
3704 && !h->forced_local)
252b5132 3705 {
25dbc73a
AM
3706 if (! bfd_elf_link_record_dynamic_symbol (info, h))
3707 return FALSE;
252b5132
RH
3708 }
3709
25dbc73a
AM
3710 if (info->shared
3711 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
252b5132 3712 {
25dbc73a 3713 asection *s = htab->plt;
7619e7c7 3714
25dbc73a
AM
3715 /* If this is the first .plt entry, make room for the special
3716 first entry. */
3717 if (s->size == 0)
3718 s->size += PLT_INITIAL_ENTRY_SIZE;
7619e7c7 3719
25dbc73a
AM
3720 /* The PowerPC PLT is actually composed of two parts, the
3721 first part is 2 words (for a load and a jump), and then
3722 there is a remaining word available at the end. */
3723 h->plt.offset = (PLT_INITIAL_ENTRY_SIZE
3724 + (PLT_SLOT_SIZE
3725 * ((s->size - PLT_INITIAL_ENTRY_SIZE)
3726 / PLT_ENTRY_SIZE)));
7619e7c7 3727
25dbc73a
AM
3728 /* If this symbol is not defined in a regular file, and we
3729 are not generating a shared library, then set the symbol
3730 to this location in the .plt. This is required to make
3731 function pointers compare as equal between the normal
3732 executable and the shared library. */
3733 if (! info->shared
3734 && !h->def_regular)
252b5132 3735 {
25dbc73a
AM
3736 h->root.u.def.section = s;
3737 h->root.u.def.value = h->plt.offset;
252b5132 3738 }
252b5132 3739
25dbc73a
AM
3740 /* Make room for this entry. After the 8192nd entry, room
3741 for two entries is allocated. */
3742 s->size += PLT_ENTRY_SIZE;
3743 if ((s->size - PLT_INITIAL_ENTRY_SIZE) / PLT_ENTRY_SIZE
3744 > PLT_NUM_SINGLE_ENTRIES)
3745 s->size += PLT_ENTRY_SIZE;
3746
3747 /* We also need to make an entry in the .rela.plt section. */
3748 htab->relplt->size += sizeof (Elf32_External_Rela);
3749 }
3750 else
3751 {
3752 h->plt.offset = (bfd_vma) -1;
3753 h->needs_plt = 0;
3754 }
3755 }
3756 else
3757 {
3758 h->plt.offset = (bfd_vma) -1;
3759 h->needs_plt = 0;
3760 }
3761
3762 eh = (struct ppc_elf_link_hash_entry *) h;
3763 if (eh->elf.got.refcount > 0)
3764 {
3765 /* Make sure this symbol is output as a dynamic symbol. */
3766 if (eh->elf.dynindx == -1
3767 && !eh->elf.forced_local)
3768 {
3769 if (!bfd_elf_link_record_dynamic_symbol (info, &eh->elf))
b34976b6 3770 return FALSE;
25dbc73a 3771 }
252b5132 3772
25dbc73a
AM
3773 if (eh->tls_mask == (TLS_TLS | TLS_LD)
3774 && !eh->elf.def_dynamic)
3775 /* If just an LD reloc, we'll just use htab->tlsld_got.offset. */
3776 eh->elf.got.offset = (bfd_vma) -1;
3777 else
3778 {
3779 bfd_boolean dyn;
3b36f7e6 3780 unsigned int need = 0;
25dbc73a 3781 if ((eh->tls_mask & TLS_TLS) != 0)
252b5132 3782 {
25dbc73a 3783 if ((eh->tls_mask & TLS_LD) != 0)
3b36f7e6 3784 need += 8;
25dbc73a 3785 if ((eh->tls_mask & TLS_GD) != 0)
3b36f7e6 3786 need += 8;
25dbc73a 3787 if ((eh->tls_mask & (TLS_TPREL | TLS_TPRELGD)) != 0)
3b36f7e6 3788 need += 4;
25dbc73a 3789 if ((eh->tls_mask & TLS_DTPREL) != 0)
3b36f7e6 3790 need += 4;
252b5132 3791 }
25dbc73a 3792 else
3b36f7e6
AM
3793 need += 4;
3794 eh->elf.got.offset = allocate_got (htab, need);
25dbc73a
AM
3795 dyn = htab->elf.dynamic_sections_created;
3796 if ((info->shared
3797 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, &eh->elf))
3798 && (ELF_ST_VISIBILITY (eh->elf.other) == STV_DEFAULT
3799 || eh->elf.root.type != bfd_link_hash_undefweak))
252b5132 3800 {
3b36f7e6
AM
3801 /* All the entries we allocated need relocs.
3802 Except LD only needs one. */
25dbc73a 3803 if ((eh->tls_mask & TLS_LD) != 0)
3b36f7e6
AM
3804 need -= 4;
3805 htab->relgot->size += need * (sizeof (Elf32_External_Rela) / 4);
252b5132 3806 }
25dbc73a
AM
3807 }
3808 }
3809 else
3810 eh->elf.got.offset = (bfd_vma) -1;
252b5132 3811
25dbc73a
AM
3812 if (eh->dyn_relocs == NULL)
3813 return TRUE;
252b5132 3814
25dbc73a
AM
3815 /* In the shared -Bsymbolic case, discard space allocated for
3816 dynamic pc-relative relocs against symbols which turn out to be
3817 defined in regular objects. For the normal shared case, discard
3818 space for relocs that have become local due to symbol visibility
3819 changes. */
3820
3821 if (info->shared)
3822 {
3823 /* Relocs that use pc_count are those that appear on a call insn,
3824 or certain REL relocs (see MUST_BE_DYN_RELOC) that can be
3825 generated via assembly. We want calls to protected symbols to
3826 resolve directly to the function rather than going via the plt.
3827 If people want function pointer comparisons to work as expected
3828 then they should avoid writing weird assembly. */
3829 if (SYMBOL_CALLS_LOCAL (info, h))
3830 {
3831 struct ppc_elf_dyn_relocs **pp;
3832
3833 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
252b5132 3834 {
25dbc73a
AM
3835 p->count -= p->pc_count;
3836 p->pc_count = 0;
3837 if (p->count == 0)
3838 *pp = p->next;
3839 else
3840 pp = &p->next;
252b5132 3841 }
25dbc73a 3842 }
252b5132 3843
25dbc73a
AM
3844 /* Also discard relocs on undefined weak syms with non-default
3845 visibility. */
3846 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
3847 && h->root.type == bfd_link_hash_undefweak)
3848 eh->dyn_relocs = NULL;
7619e7c7 3849
25dbc73a
AM
3850 /* Make sure undefined weak symbols are output as a dynamic symbol
3851 in PIEs. */
3852 if (info->pie
3853 && eh->dyn_relocs != NULL
3854 && h->dynindx == -1
3855 && h->root.type == bfd_link_hash_undefweak
3856 && !h->forced_local)
3857 {
3858 if (! bfd_elf_link_record_dynamic_symbol (info, h))
3859 return FALSE;
3860 }
3861 }
3862 else if (ELIMINATE_COPY_RELOCS)
3863 {
3864 /* For the non-shared case, discard space for relocs against
3865 symbols which turn out to need copy relocs or are not
3866 dynamic. */
7619e7c7 3867
25dbc73a
AM
3868 if (!h->non_got_ref
3869 && h->def_dynamic
3870 && !h->def_regular)
3871 {
3872 /* Make sure this symbol is output as a dynamic symbol.
3873 Undefined weak syms won't yet be marked as dynamic. */
3874 if (h->dynindx == -1
3875 && !h->forced_local)
3876 {
3877 if (! bfd_elf_link_record_dynamic_symbol (info, h))
3878 return FALSE;
3879 }
7619e7c7 3880
25dbc73a
AM
3881 /* If that succeeded, we know we'll be keeping all the
3882 relocs. */
3883 if (h->dynindx != -1)
3884 goto keep;
3885 }
252b5132 3886
25dbc73a 3887 eh->dyn_relocs = NULL;
252b5132 3888
25dbc73a
AM
3889 keep: ;
3890 }
252b5132 3891
25dbc73a
AM
3892 /* Finally, allocate space. */
3893 for (p = eh->dyn_relocs; p != NULL; p = p->next)
3894 {
3895 asection *sreloc = elf_section_data (p->sec)->sreloc;
3896 sreloc->size += p->count * sizeof (Elf32_External_Rela);
3897 }
252b5132 3898
25dbc73a
AM
3899 return TRUE;
3900}
7619e7c7 3901
25dbc73a 3902/* Find any dynamic relocs that apply to read-only sections. */
7619e7c7 3903
25dbc73a
AM
3904static bfd_boolean
3905readonly_dynrelocs (struct elf_link_hash_entry *h, void *info)
3906{
3907 struct ppc_elf_dyn_relocs *p;
7619e7c7 3908
25dbc73a
AM
3909 if (h->root.type == bfd_link_hash_indirect)
3910 return TRUE;
252b5132 3911
25dbc73a
AM
3912 if (h->root.type == bfd_link_hash_warning)
3913 h = (struct elf_link_hash_entry *) h->root.u.i.link;
7619e7c7 3914
25dbc73a
AM
3915 for (p = ppc_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
3916 {
3917 asection *s = p->sec->output_section;
ee05f2fe 3918
25dbc73a
AM
3919 if (s != NULL
3920 && ((s->flags & (SEC_READONLY | SEC_ALLOC))
3921 == (SEC_READONLY | SEC_ALLOC)))
3922 {
3923 ((struct bfd_link_info *) info)->flags |= DF_TEXTREL;
ee05f2fe 3924
25dbc73a
AM
3925 /* Not an error, just cut short the traversal. */
3926 return FALSE;
3927 }
3928 }
3929 return TRUE;
3930}
3931
3932/* Set the sizes of the dynamic sections. */
3933
3934static bfd_boolean
3935ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
3936 struct bfd_link_info *info)
3937{
3938 struct ppc_elf_link_hash_table *htab;
3939 asection *s;
3940 bfd_boolean relocs;
3941 bfd *ibfd;
7fce784e 3942
252b5132 3943#ifdef DEBUG
25dbc73a 3944 fprintf (stderr, "ppc_elf_size_dynamic_sections called\n");
252b5132 3945#endif
252b5132 3946
25dbc73a
AM
3947 htab = ppc_elf_hash_table (info);
3948 BFD_ASSERT (htab->elf.dynobj != NULL);
252b5132 3949
25dbc73a
AM
3950 if (elf_hash_table (info)->dynamic_sections_created)
3951 {
3952 /* Set the contents of the .interp section to the interpreter. */
3953 if (info->executable)
3954 {
3955 s = bfd_get_section_by_name (htab->elf.dynobj, ".interp");
3956 BFD_ASSERT (s != NULL);
3957 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
3958 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3959 }
3960 }
252b5132 3961
3b36f7e6 3962 htab->got_header_size = 16;
252b5132 3963
25dbc73a
AM
3964 /* Set up .got offsets for local syms, and space for local dynamic
3965 relocs. */
3966 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3967 {
3968 bfd_signed_vma *local_got;
3969 bfd_signed_vma *end_local_got;
3970 char *lgot_masks;
3971 bfd_size_type locsymcount;
3972 Elf_Internal_Shdr *symtab_hdr;
7fce784e 3973
d2663f46 3974 if (!is_ppc_elf_target (ibfd->xvec))
25dbc73a 3975 continue;
7fce784e 3976
25dbc73a
AM
3977 for (s = ibfd->sections; s != NULL; s = s->next)
3978 {
3979 struct ppc_elf_dyn_relocs *p;
252b5132 3980
25dbc73a
AM
3981 for (p = ((struct ppc_elf_dyn_relocs *)
3982 elf_section_data (s)->local_dynrel);
3983 p != NULL;
3984 p = p->next)
3985 {
3986 if (!bfd_is_abs_section (p->sec)
3987 && bfd_is_abs_section (p->sec->output_section))
3988 {
3989 /* Input section has been discarded, either because
3990 it is a copy of a linkonce section or due to
3991 linker script /DISCARD/, so we'll be discarding
3992 the relocs too. */
7fce784e 3993 }
25dbc73a 3994 else if (p->count != 0)
7fce784e 3995 {
25dbc73a
AM
3996 elf_section_data (p->sec)->sreloc->size
3997 += p->count * sizeof (Elf32_External_Rela);
3998 if ((p->sec->output_section->flags
3999 & (SEC_READONLY | SEC_ALLOC))
4000 == (SEC_READONLY | SEC_ALLOC))
4001 info->flags |= DF_TEXTREL;
7fce784e 4002 }
252b5132 4003 }
252b5132 4004 }
252b5132 4005
25dbc73a
AM
4006 local_got = elf_local_got_refcounts (ibfd);
4007 if (!local_got)
4008 continue;
252b5132 4009
25dbc73a
AM
4010 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
4011 locsymcount = symtab_hdr->sh_info;
4012 end_local_got = local_got + locsymcount;
4013 lgot_masks = (char *) end_local_got;
25dbc73a
AM
4014 for (; local_got < end_local_got; ++local_got, ++lgot_masks)
4015 if (*local_got > 0)
4016 {
4017 if (*lgot_masks == (TLS_TLS | TLS_LD))
4018 {
4019 /* If just an LD reloc, we'll just use
4020 htab->tlsld_got.offset. */
3b36f7e6 4021 htab->tlsld_got.refcount += 1;
25dbc73a
AM
4022 *local_got = (bfd_vma) -1;
4023 }
4024 else
4025 {
3b36f7e6 4026 unsigned int need = 0;
25dbc73a
AM
4027 if ((*lgot_masks & TLS_TLS) != 0)
4028 {
4029 if ((*lgot_masks & TLS_GD) != 0)
3b36f7e6 4030 need += 8;
25dbc73a 4031 if ((*lgot_masks & (TLS_TPREL | TLS_TPRELGD)) != 0)
3b36f7e6 4032 need += 4;
25dbc73a 4033 if ((*lgot_masks & TLS_DTPREL) != 0)
3b36f7e6 4034 need += 4;
25dbc73a
AM
4035 }
4036 else
3b36f7e6
AM
4037 need += 4;
4038 *local_got = allocate_got (htab, need);
25dbc73a 4039 if (info->shared)
3b36f7e6
AM
4040 htab->relgot->size += (need
4041 * (sizeof (Elf32_External_Rela) / 4));
25dbc73a
AM
4042 }
4043 }
4044 else
4045 *local_got = (bfd_vma) -1;
4046 }
252b5132 4047
3b36f7e6
AM
4048 if (htab->tlsld_got.refcount > 0)
4049 {
4050 htab->tlsld_got.offset = allocate_got (htab, 8);
4051 if (info->shared)
4052 htab->relgot->size += sizeof (Elf32_External_Rela);
4053 }
4054 else
4055 htab->tlsld_got.offset = (bfd_vma) -1;
4056
25dbc73a
AM
4057 /* Allocate space for global sym dynamic relocs. */
4058 elf_link_hash_traverse (elf_hash_table (info), allocate_dynrelocs, info);
4059
3b36f7e6
AM
4060 if (htab->got != NULL)
4061 {
4062 unsigned int g_o_t = 32768;
4063
4064 /* If we haven't allocated the header, do so now. */
4065 if (htab->got->size <= 32768)
4066 {
4067 g_o_t = htab->got->size;
4068 htab->got->size += htab->got_header_size;
4069 }
4070 g_o_t += 4;
4071
4072 htab->elf.hgot->root.u.def.value = g_o_t;
4073 }
4074
25dbc73a
AM
4075 /* We've now determined the sizes of the various dynamic sections.
4076 Allocate memory for them. */
4077 relocs = FALSE;
4078 for (s = htab->elf.dynobj->sections; s != NULL; s = s->next)
252b5132 4079 {
25dbc73a
AM
4080 if ((s->flags & SEC_LINKER_CREATED) == 0)
4081 continue;
252b5132 4082
25dbc73a 4083 if (s == htab->plt
644285ef
AM
4084 || s == htab->got
4085 || s == htab->sbss)
25dbc73a
AM
4086 {
4087 /* Strip this section if we don't need it; see the
4088 comment below. */
4089 }
c9a2f333
AM
4090 else if (s == htab->sdata[0].section
4091 || s == htab->sdata[1].section)
25dbc73a 4092 {
c9a2f333 4093 /* Strip these too. */
25dbc73a
AM
4094 }
4095 else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
4096 {
4097 if (s->size == 0)
252b5132 4098 {
25dbc73a
AM
4099 /* If we don't need this section, strip it from the
4100 output file. This is mostly to handle .rela.bss and
4101 .rela.plt. We must create both sections in
4102 create_dynamic_sections, because they must be created
4103 before the linker maps input sections to output
4104 sections. The linker does that before
4105 adjust_dynamic_symbol is called, and it is that
4106 function which decides whether anything needs to go
4107 into these sections. */
4108 }
4109 else
4110 {
4111 /* Remember whether there are any relocation sections. */
4112 relocs = TRUE;
252b5132 4113
25dbc73a
AM
4114 /* We use the reloc_count field as a counter if we need
4115 to copy relocs into the output file. */
4116 s->reloc_count = 0;
252b5132
RH
4117 }
4118 }
25dbc73a
AM
4119 else
4120 {
4121 /* It's not one of our sections, so don't allocate space. */
4122 continue;
4123 }
252b5132 4124
25dbc73a
AM
4125 if (s->size == 0)
4126 {
8423293d 4127 s->flags |= SEC_EXCLUDE;
25dbc73a
AM
4128 continue;
4129 }
7fce784e 4130
644285ef
AM
4131 if (s == htab->sbss)
4132 continue;
4133
25dbc73a
AM
4134 /* Allocate memory for the section contents. */
4135 s->contents = bfd_zalloc (htab->elf.dynobj, s->size);
4136 if (s->contents == NULL)
4137 return FALSE;
4138 }
252b5132 4139
25dbc73a 4140 if (htab->elf.dynamic_sections_created)
7619e7c7 4141 {
25dbc73a
AM
4142 /* Add some entries to the .dynamic section. We fill in the
4143 values later, in ppc_elf_finish_dynamic_sections, but we
4144 must add the entries now so that we get the correct size for
4145 the .dynamic section. The DT_DEBUG entry is filled in by the
4146 dynamic linker and used by the debugger. */
4147#define add_dynamic_entry(TAG, VAL) \
4148 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
252b5132 4149
25dbc73a 4150 if (info->executable)
7619e7c7 4151 {
25dbc73a
AM
4152 if (!add_dynamic_entry (DT_DEBUG, 0))
4153 return FALSE;
7619e7c7
AM
4154 }
4155
25dbc73a 4156 if (htab->plt != NULL && htab->plt->size != 0)
7619e7c7 4157 {
25dbc73a
AM
4158 if (!add_dynamic_entry (DT_PLTGOT, 0)
4159 || !add_dynamic_entry (DT_PLTRELSZ, 0)
4160 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
4161 || !add_dynamic_entry (DT_JMPREL, 0))
4162 return FALSE;
4163 }
7619e7c7 4164
25dbc73a
AM
4165 if (relocs)
4166 {
4167 if (!add_dynamic_entry (DT_RELA, 0)
4168 || !add_dynamic_entry (DT_RELASZ, 0)
4169 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
4170 return FALSE;
4171 }
7619e7c7 4172
25dbc73a
AM
4173 /* If any dynamic relocs apply to a read-only section, then we
4174 need a DT_TEXTREL entry. */
4175 if ((info->flags & DF_TEXTREL) == 0)
4176 elf_link_hash_traverse (elf_hash_table (info), readonly_dynrelocs,
4177 info);
7619e7c7 4178
25dbc73a
AM
4179 if ((info->flags & DF_TEXTREL) != 0)
4180 {
4181 if (!add_dynamic_entry (DT_TEXTREL, 0))
4182 return FALSE;
7619e7c7
AM
4183 }
4184 }
25dbc73a
AM
4185#undef add_dynamic_entry
4186
7619e7c7
AM
4187 return TRUE;
4188}
25dbc73a
AM
4189\f
4190#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
4191
4192static const int shared_stub_entry[] =
4193 {
4194 0x7c0802a6, /* mflr 0 */
4195 0x429f0005, /* bcl 20, 31, .Lxxx */
4196 0x7d6802a6, /* mflr 11 */
4197 0x3d6b0000, /* addis 11, 11, (xxx-.Lxxx)@ha */
4198 0x396b0018, /* addi 11, 11, (xxx-.Lxxx)@l */
4199 0x7c0803a6, /* mtlr 0 */
4200 0x7d6903a6, /* mtctr 11 */
4201 0x4e800420, /* bctr */
4202 };
4203
4204static const int stub_entry[] =
4205 {
4206 0x3d600000, /* lis 11,xxx@ha */
4207 0x396b0000, /* addi 11,11,xxx@l */
4208 0x7d6903a6, /* mtctr 11 */
4209 0x4e800420, /* bctr */
4210 };
4211
4212static bfd_boolean
4213ppc_elf_relax_section (bfd *abfd,
4214 asection *isec,
4215 struct bfd_link_info *link_info,
4216 bfd_boolean *again)
4217{
4218 struct one_fixup
4219 {
4220 struct one_fixup *next;
4221 asection *tsec;
4222 bfd_vma toff;
4223 bfd_vma trampoff;
4224 };
7619e7c7 4225
25dbc73a
AM
4226 Elf_Internal_Shdr *symtab_hdr;
4227 bfd_byte *contents = NULL;
4228 Elf_Internal_Sym *isymbuf = NULL;
4229 Elf_Internal_Rela *internal_relocs = NULL;
4230 Elf_Internal_Rela *irel, *irelend;
4231 struct one_fixup *fixups = NULL;
4232 bfd_boolean changed;
4233 struct ppc_elf_link_hash_table *ppc_info;
4234 bfd_size_type trampoff;
7619e7c7 4235
25dbc73a 4236 *again = FALSE;
7619e7c7 4237
c87b5a93
AM
4238 /* Nothing to do if there are no relocations, and no need to do
4239 anything with non-alloc sections. */
4240 if ((isec->flags & SEC_ALLOC) == 0
4241 || (isec->flags & SEC_RELOC) == 0
4242 || isec->reloc_count == 0)
25dbc73a 4243 return TRUE;
7619e7c7 4244
25dbc73a
AM
4245 trampoff = (isec->size + 3) & (bfd_vma) -4;
4246 /* Space for a branch around any trampolines. */
4247 trampoff += 4;
7619e7c7 4248
25dbc73a 4249 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
7619e7c7 4250
25dbc73a
AM
4251 /* Get a copy of the native relocations. */
4252 internal_relocs = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL,
4253 link_info->keep_memory);
4254 if (internal_relocs == NULL)
4255 goto error_return;
7619e7c7 4256
25dbc73a
AM
4257 ppc_info = ppc_elf_hash_table (link_info);
4258 irelend = internal_relocs + isec->reloc_count;
7619e7c7 4259
25dbc73a 4260 for (irel = internal_relocs; irel < irelend; irel++)
7619e7c7 4261 {
25dbc73a
AM
4262 unsigned long r_type = ELF32_R_TYPE (irel->r_info);
4263 bfd_vma symaddr, reladdr, toff, roff;
4264 asection *tsec;
4265 struct one_fixup *f;
4266 size_t insn_offset = 0;
4267 bfd_vma max_branch_offset, val;
4268 bfd_byte *hit_addr;
4269 unsigned long t0;
4270 unsigned char sym_type;
7619e7c7 4271
25dbc73a
AM
4272 switch (r_type)
4273 {
4274 case R_PPC_REL24:
4275 case R_PPC_LOCAL24PC:
4276 case R_PPC_PLTREL24:
4277 max_branch_offset = 1 << 25;
4278 break;
7619e7c7 4279
25dbc73a
AM
4280 case R_PPC_REL14:
4281 case R_PPC_REL14_BRTAKEN:
4282 case R_PPC_REL14_BRNTAKEN:
4283 max_branch_offset = 1 << 15;
4284 break;
7619e7c7 4285
25dbc73a
AM
4286 default:
4287 continue;
4288 }
7619e7c7 4289
25dbc73a
AM
4290 /* Get the value of the symbol referred to by the reloc. */
4291 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
4292 {
4293 /* A local symbol. */
4294 Elf_Internal_Sym *isym;
7fce784e 4295
25dbc73a
AM
4296 /* Read this BFD's local symbols. */
4297 if (isymbuf == NULL)
4298 {
4299 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
4300 if (isymbuf == NULL)
4301 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
4302 symtab_hdr->sh_info, 0,
4303 NULL, NULL, NULL);
4304 if (isymbuf == 0)
4305 goto error_return;
4306 }
4307 isym = isymbuf + ELF32_R_SYM (irel->r_info);
4308 if (isym->st_shndx == SHN_UNDEF)
4309 continue; /* We can't do anything with undefined symbols. */
4310 else if (isym->st_shndx == SHN_ABS)
4311 tsec = bfd_abs_section_ptr;
4312 else if (isym->st_shndx == SHN_COMMON)
4313 tsec = bfd_com_section_ptr;
4314 else
4315 tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
7fce784e 4316
25dbc73a
AM
4317 toff = isym->st_value;
4318 sym_type = ELF_ST_TYPE (isym->st_info);
4319 }
4320 else
4321 {
4322 /* Global symbol handling. */
4323 unsigned long indx;
4324 struct elf_link_hash_entry *h;
7619e7c7 4325
25dbc73a
AM
4326 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
4327 h = elf_sym_hashes (abfd)[indx];
7619e7c7 4328
25dbc73a
AM
4329 while (h->root.type == bfd_link_hash_indirect
4330 || h->root.type == bfd_link_hash_warning)
4331 h = (struct elf_link_hash_entry *) h->root.u.i.link;
7619e7c7 4332
25dbc73a
AM
4333 if (r_type == R_PPC_PLTREL24
4334 && ppc_info->plt != NULL
4335 && h->plt.offset != (bfd_vma) -1)
4336 {
4337 tsec = ppc_info->plt;
4338 toff = h->plt.offset;
4339 }
4340 else if (h->root.type == bfd_link_hash_defined
4341 || h->root.type == bfd_link_hash_defweak)
4342 {
4343 tsec = h->root.u.def.section;
4344 toff = h->root.u.def.value;
4345 }
4346 else
4347 continue;
7619e7c7 4348
25dbc73a
AM
4349 sym_type = h->type;
4350 }
7619e7c7 4351
25dbc73a
AM
4352 /* If the branch and target are in the same section, you have
4353 no hope of adding stubs. We'll error out later should the
4354 branch overflow. */
4355 if (tsec == isec)
4356 continue;
4357
4358 /* There probably isn't any reason to handle symbols in
4359 SEC_MERGE sections; SEC_MERGE doesn't seem a likely
4360 attribute for a code section, and we are only looking at
4361 branches. However, implement it correctly here as a
4362 reference for other target relax_section functions. */
4363 if (0 && tsec->sec_info_type == ELF_INFO_TYPE_MERGE)
4364 {
4365 /* At this stage in linking, no SEC_MERGE symbol has been
4366 adjusted, so all references to such symbols need to be
4367 passed through _bfd_merged_section_offset. (Later, in
4368 relocate_section, all SEC_MERGE symbols *except* for
4369 section symbols have been adjusted.)
4370
4371 gas may reduce relocations against symbols in SEC_MERGE
4372 sections to a relocation against the section symbol when
4373 the original addend was zero. When the reloc is against
4374 a section symbol we should include the addend in the
4375 offset passed to _bfd_merged_section_offset, since the
4376 location of interest is the original symbol. On the
4377 other hand, an access to "sym+addend" where "sym" is not
4378 a section symbol should not include the addend; Such an
4379 access is presumed to be an offset from "sym"; The
4380 location of interest is just "sym". */
4381 if (sym_type == STT_SECTION)
4382 toff += irel->r_addend;
7619e7c7 4383
25dbc73a
AM
4384 toff = _bfd_merged_section_offset (abfd, &tsec,
4385 elf_section_data (tsec)->sec_info,
4386 toff);
7619e7c7 4387
25dbc73a
AM
4388 if (sym_type != STT_SECTION)
4389 toff += irel->r_addend;
4390 }
4391 else
4392 toff += irel->r_addend;
7619e7c7 4393
25dbc73a 4394 symaddr = tsec->output_section->vma + tsec->output_offset + toff;
7619e7c7 4395
25dbc73a
AM
4396 roff = irel->r_offset;
4397 reladdr = isec->output_section->vma + isec->output_offset + roff;
7619e7c7 4398
25dbc73a
AM
4399 /* If the branch is in range, no need to do anything. */
4400 if (symaddr - reladdr + max_branch_offset < 2 * max_branch_offset)
4401 continue;
252b5132 4402
25dbc73a
AM
4403 /* Look for an existing fixup to this address. */
4404 for (f = fixups; f ; f = f->next)
4405 if (f->tsec == tsec && f->toff == toff)
4406 break;
4407
4408 if (f == NULL)
7619e7c7 4409 {
25dbc73a
AM
4410 size_t size;
4411 unsigned long stub_rtype;
252b5132 4412
25dbc73a
AM
4413 val = trampoff - roff;
4414 if (val >= max_branch_offset)
4415 /* Oh dear, we can't reach a trampoline. Don't try to add
4416 one. We'll report an error later. */
4417 continue;
252b5132 4418
25dbc73a
AM
4419 if (link_info->shared)
4420 {
4421 size = 4 * ARRAY_SIZE (shared_stub_entry);
4422 insn_offset = 12;
4423 stub_rtype = R_PPC_RELAX32PC;
4424 }
4425 else
4426 {
4427 size = 4 * ARRAY_SIZE (stub_entry);
4428 insn_offset = 0;
4429 stub_rtype = R_PPC_RELAX32;
4430 }
dc810e39 4431
25dbc73a
AM
4432 if (R_PPC_RELAX32_PLT - R_PPC_RELAX32
4433 != R_PPC_RELAX32PC_PLT - R_PPC_RELAX32PC)
4434 abort ();
4435 if (tsec == ppc_info->plt)
4436 stub_rtype += R_PPC_RELAX32_PLT - R_PPC_RELAX32;
252b5132 4437
25dbc73a
AM
4438 /* Hijack the old relocation. Since we need two
4439 relocations for this use a "composite" reloc. */
4440 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
4441 stub_rtype);
4442 irel->r_offset = trampoff + insn_offset;
252b5132 4443
25dbc73a
AM
4444 /* Record the fixup so we don't do it again this section. */
4445 f = bfd_malloc (sizeof (*f));
4446 f->next = fixups;
4447 f->tsec = tsec;
4448 f->toff = toff;
4449 f->trampoff = trampoff;
4450 fixups = f;
252b5132 4451
25dbc73a
AM
4452 trampoff += size;
4453 }
4454 else
4455 {
4456 val = f->trampoff - roff;
4457 if (val >= max_branch_offset)
4458 continue;
252b5132 4459
25dbc73a
AM
4460 /* Nop out the reloc, since we're finalizing things here. */
4461 irel->r_info = ELF32_R_INFO (0, R_PPC_NONE);
4462 }
252b5132 4463
25dbc73a
AM
4464 /* Get the section contents. */
4465 if (contents == NULL)
4466 {
4467 /* Get cached copy if it exists. */
4468 if (elf_section_data (isec)->this_hdr.contents != NULL)
4469 contents = elf_section_data (isec)->this_hdr.contents;
4470 else
4471 {
4472 /* Go get them off disk. */
4473 if (!bfd_malloc_and_get_section (abfd, isec, &contents))
4474 goto error_return;
4475 }
4476 }
252b5132 4477
25dbc73a
AM
4478 /* Fix up the existing branch to hit the trampoline. */
4479 hit_addr = contents + roff;
4480 switch (r_type)
4481 {
4482 case R_PPC_REL24:
4483 case R_PPC_LOCAL24PC:
4484 case R_PPC_PLTREL24:
4485 t0 = bfd_get_32 (abfd, hit_addr);
4486 t0 &= ~0x3fffffc;
4487 t0 |= val & 0x3fffffc;
4488 bfd_put_32 (abfd, t0, hit_addr);
4489 break;
252b5132 4490
25dbc73a
AM
4491 case R_PPC_REL14:
4492 case R_PPC_REL14_BRTAKEN:
4493 case R_PPC_REL14_BRNTAKEN:
4494 t0 = bfd_get_32 (abfd, hit_addr);
4495 t0 &= ~0xfffc;
4496 t0 |= val & 0xfffc;
4497 bfd_put_32 (abfd, t0, hit_addr);
4498 break;
4499 }
4500 }
252b5132 4501
25dbc73a
AM
4502 /* Write out the trampolines. */
4503 changed = fixups != NULL;
4504 if (fixups != NULL)
4505 {
4506 const int *stub;
4507 bfd_byte *dest;
4508 bfd_vma val;
4509 int i, size;
252b5132 4510
25dbc73a
AM
4511 do
4512 {
4513 struct one_fixup *f = fixups;
4514 fixups = fixups->next;
4515 free (f);
4516 }
4517 while (fixups);
252b5132 4518
25dbc73a
AM
4519 contents = bfd_realloc (contents, trampoff);
4520 if (contents == NULL)
4521 goto error_return;
252b5132 4522
25dbc73a
AM
4523 isec->size = (isec->size + 3) & (bfd_vma) -4;
4524 /* Branch around the trampolines. */
4525 val = trampoff - isec->size + 0x48000000;
4526 dest = contents + isec->size;
4527 isec->size = trampoff;
4528 bfd_put_32 (abfd, val, dest);
4529 dest += 4;
252b5132 4530
25dbc73a
AM
4531 if (link_info->shared)
4532 {
4533 stub = shared_stub_entry;
4534 size = ARRAY_SIZE (shared_stub_entry);
4535 }
4536 else
4537 {
4538 stub = stub_entry;
4539 size = ARRAY_SIZE (stub_entry);
4540 }
252b5132 4541
25dbc73a
AM
4542 i = 0;
4543 while (dest < contents + trampoff)
252b5132 4544 {
25dbc73a
AM
4545 bfd_put_32 (abfd, stub[i], dest);
4546 i++;
4547 if (i == size)
4548 i = 0;
4549 dest += 4;
252b5132 4550 }
25dbc73a 4551 BFD_ASSERT (i == 0);
252b5132
RH
4552 }
4553
25dbc73a
AM
4554 if (isymbuf != NULL
4555 && symtab_hdr->contents != (unsigned char *) isymbuf)
252b5132 4556 {
25dbc73a
AM
4557 if (! link_info->keep_memory)
4558 free (isymbuf);
252b5132 4559 else
25dbc73a
AM
4560 {
4561 /* Cache the symbols for elf_link_input_bfd. */
4562 symtab_hdr->contents = (unsigned char *) isymbuf;
4563 }
252b5132
RH
4564 }
4565
25dbc73a
AM
4566 if (contents != NULL
4567 && elf_section_data (isec)->this_hdr.contents != contents)
4568 {
4569 if (!changed && !link_info->keep_memory)
4570 free (contents);
4571 else
4572 {
4573 /* Cache the section contents for elf_link_input_bfd. */
4574 elf_section_data (isec)->this_hdr.contents = contents;
4575 }
4576 }
252b5132 4577
25dbc73a
AM
4578 if (elf_section_data (isec)->relocs != internal_relocs)
4579 {
4580 if (!changed)
4581 free (internal_relocs);
4582 else
4583 elf_section_data (isec)->relocs = internal_relocs;
4584 }
252b5132 4585
25dbc73a 4586 *again = changed;
b34976b6 4587 return TRUE;
25dbc73a
AM
4588
4589 error_return:
4590 if (isymbuf != NULL && (unsigned char *) isymbuf != symtab_hdr->contents)
4591 free (isymbuf);
4592 if (contents != NULL
4593 && elf_section_data (isec)->this_hdr.contents != contents)
4594 free (contents);
4595 if (internal_relocs != NULL
4596 && elf_section_data (isec)->relocs != internal_relocs)
4597 free (internal_relocs);
4598 return FALSE;
252b5132 4599}
252b5132 4600\f
f85f57ad
AM
4601/* Set _SDA_BASE_, _SDA2_BASE, and sbss start and end syms. They are
4602 set here rather than via PROVIDE in the default linker script,
4603 because using PROVIDE inside an output section statement results in
4604 unnecessary output sections. Using PROVIDE outside an output section
4605 statement runs the risk of section alignment affecting where the
4606 section starts. */
c9a2f333
AM
4607
4608bfd_boolean
4609ppc_elf_set_sdata_syms (bfd *obfd, struct bfd_link_info *info)
4610{
4611 struct ppc_elf_link_hash_table *htab;
4612 unsigned i;
f85f57ad
AM
4613 asection *s;
4614 bfd_vma val;
c9a2f333
AM
4615
4616 htab = ppc_elf_hash_table (info);
4617
4618 for (i = 0; i < 2; i++)
4619 {
4620 elf_linker_section_t *lsect = &htab->sdata[i];
c9a2f333
AM
4621
4622 s = lsect->section;
4623 if (s != NULL)
4624 s = s->output_section;
4625 if (s == NULL)
4626 s = bfd_get_section_by_name (obfd, lsect->name);
4627 if (s == NULL)
4628 s = bfd_get_section_by_name (obfd, lsect->bss_name);
4629
4630 val = 0;
4631 if (s != NULL)
4632 val = s->vma + 32768;
4633 lsect->sym_val = val;
4634
81e1b023 4635 _bfd_elf_provide_symbol (info, lsect->sym_name, val);
c9a2f333 4636 }
f85f57ad
AM
4637
4638 s = bfd_get_section_by_name (obfd, ".sbss");
4639 val = 0;
4640 if (s != NULL)
4641 val = s->vma;
81e1b023
L
4642 _bfd_elf_provide_symbol (info, "__sbss_start", val);
4643 _bfd_elf_provide_symbol (info, "___sbss_start", val);
f85f57ad
AM
4644 if (s != NULL)
4645 val += s->size;
81e1b023
L
4646 _bfd_elf_provide_symbol (info, "__sbss_end", val);
4647 _bfd_elf_provide_symbol (info, "___sbss_end", val);
c9a2f333
AM
4648 return TRUE;
4649}
4650\f
25dbc73a 4651/* Fill in the address for a pointer generated in a linker section. */
252b5132 4652
25dbc73a 4653static bfd_vma
76750a2f 4654elf_finish_pointer_linker_section (bfd *input_bfd,
25dbc73a
AM
4655 elf_linker_section_t *lsect,
4656 struct elf_link_hash_entry *h,
4657 bfd_vma relocation,
2bb04cf2 4658 const Elf_Internal_Rela *rel)
25dbc73a
AM
4659{
4660 elf_linker_section_pointers_t *linker_section_ptr;
252b5132 4661
25dbc73a 4662 BFD_ASSERT (lsect != NULL);
252b5132 4663
25dbc73a 4664 if (h != NULL)
252b5132 4665 {
25dbc73a
AM
4666 /* Handle global symbol. */
4667 struct ppc_elf_link_hash_entry *eh;
252b5132 4668
25dbc73a 4669 eh = (struct ppc_elf_link_hash_entry *) h;
76750a2f
AM
4670 BFD_ASSERT (eh->elf.def_regular);
4671 linker_section_ptr = eh->linker_section_pointer;
25dbc73a
AM
4672 }
4673 else
4674 {
4675 /* Handle local symbol. */
4676 unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
76750a2f 4677
25dbc73a 4678 BFD_ASSERT (elf_local_ptr_offsets (input_bfd) != NULL);
76750a2f
AM
4679 linker_section_ptr = elf_local_ptr_offsets (input_bfd)[r_symndx];
4680 }
252b5132 4681
76750a2f
AM
4682 linker_section_ptr = elf_find_pointer_linker_section (linker_section_ptr,
4683 rel->r_addend,
4684 lsect);
4685 BFD_ASSERT (linker_section_ptr != NULL);
25dbc73a 4686
76750a2f
AM
4687 /* Offset will always be a multiple of four, so use the bottom bit
4688 as a "written" flag. */
4689 if ((linker_section_ptr->offset & 1) == 0)
4690 {
4691 bfd_put_32 (lsect->section->owner,
4692 relocation + linker_section_ptr->addend,
4693 lsect->section->contents + linker_section_ptr->offset);
4694 linker_section_ptr->offset += 1;
252b5132
RH
4695 }
4696
25dbc73a 4697 relocation = (lsect->section->output_offset
76750a2f 4698 + linker_section_ptr->offset - 1
c9a2f333 4699 - 0x8000);
252b5132 4700
25dbc73a
AM
4701#ifdef DEBUG
4702 fprintf (stderr,
4703 "Finish pointer in linker section %s, offset = %ld (0x%lx)\n",
4704 lsect->name, (long) relocation, (long) relocation);
4705#endif
252b5132 4706
25dbc73a
AM
4707 /* Subtract out the addend, because it will get added back in by the normal
4708 processing. */
4709 return relocation - linker_section_ptr->addend;
252b5132 4710}
25dbc73a 4711
252b5132
RH
4712/* The RELOCATE_SECTION function is called by the ELF backend linker
4713 to handle the relocations for a section.
4714
4715 The relocs are always passed as Rela structures; if the section
4716 actually uses Rel structures, the r_addend field will always be
4717 zero.
4718
4719 This function is responsible for adjust the section contents as
4720 necessary, and (if using Rela relocs and generating a
1049f94e 4721 relocatable output file) adjusting the reloc addend as
252b5132
RH
4722 necessary.
4723
4724 This function does not have to worry about setting the reloc
4725 address or the reloc symbol index.
4726
4727 LOCAL_SYMS is a pointer to the swapped in local symbols.
4728
4729 LOCAL_SECTIONS is an array giving the section in the input file
4730 corresponding to the st_shndx field of each local symbol.
4731
4732 The global hash table entry for the global symbols can be found
4733 via elf_sym_hashes (input_bfd).
4734
1049f94e 4735 When generating relocatable output, this function must handle
252b5132
RH
4736 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
4737 going to be the section symbol corresponding to the output
4738 section, which means that the addend must be adjusted
4739 accordingly. */
4740
b34976b6 4741static bfd_boolean
55fd94b0
AM
4742ppc_elf_relocate_section (bfd *output_bfd,
4743 struct bfd_link_info *info,
4744 bfd *input_bfd,
4745 asection *input_section,
4746 bfd_byte *contents,
4747 Elf_Internal_Rela *relocs,
4748 Elf_Internal_Sym *local_syms,
4749 asection **local_sections)
252b5132 4750{
7619e7c7
AM
4751 Elf_Internal_Shdr *symtab_hdr;
4752 struct elf_link_hash_entry **sym_hashes;
4753 struct ppc_elf_link_hash_table *htab;
4754 Elf_Internal_Rela *rel;
4755 Elf_Internal_Rela *relend;
4756 Elf_Internal_Rela outrel;
4757 bfd_byte *loc;
b34976b6 4758 asection *sreloc = NULL;
252b5132 4759 bfd_vma *local_got_offsets;
b34976b6 4760 bfd_boolean ret = TRUE;
b34976b6 4761
252b5132 4762#ifdef DEBUG
d003868e
AM
4763 _bfd_error_handler ("ppc_elf_relocate_section called for %B section %A, "
4764 "%ld relocations%s",
4765 input_bfd, input_section,
4766 (long) input_section->reloc_count,
4767 (info->relocatable) ? " (relocatable)" : "");
252b5132
RH
4768#endif
4769
1049f94e 4770 if (info->relocatable)
b34976b6 4771 return TRUE;
b491616a 4772
e47cd125 4773 /* Initialize howto table if not already done. */
8da6118f 4774 if (!ppc_elf_howto_table[R_PPC_ADDR32])
252b5132
RH
4775 ppc_elf_howto_init ();
4776
7619e7c7 4777 htab = ppc_elf_hash_table (info);
252b5132 4778 local_got_offsets = elf_local_got_offsets (input_bfd);
7619e7c7
AM
4779 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4780 sym_hashes = elf_sym_hashes (input_bfd);
4781 rel = relocs;
4782 relend = relocs + input_section->reloc_count;
252b5132
RH
4783 for (; rel < relend; rel++)
4784 {
7619e7c7
AM
4785 enum elf_ppc_reloc_type r_type;
4786 bfd_vma addend;
4787 bfd_reloc_status_type r;
4788 Elf_Internal_Sym *sym;
4789 asection *sec;
4790 struct elf_link_hash_entry *h;
4791 const char *sym_name;
252b5132
RH
4792 reloc_howto_type *howto;
4793 unsigned long r_symndx;
4794 bfd_vma relocation;
7619e7c7 4795 bfd_vma branch_bit, insn, from;
7619e7c7
AM
4796 bfd_boolean unresolved_reloc;
4797 bfd_boolean warned;
4798 unsigned int tls_type, tls_mask, tls_gd;
4799
55fd94b0
AM
4800 r_type = ELF32_R_TYPE (rel->r_info);
4801 sym = NULL;
4802 sec = NULL;
4803 h = NULL;
7619e7c7
AM
4804 unresolved_reloc = FALSE;
4805 warned = FALSE;
252b5132 4806 r_symndx = ELF32_R_SYM (rel->r_info);
560e09e9 4807
252b5132
RH
4808 if (r_symndx < symtab_hdr->sh_info)
4809 {
4810 sym = local_syms + r_symndx;
4811 sec = local_sections[r_symndx];
26c61ae5 4812 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
252b5132 4813
8517fae7 4814 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
252b5132
RH
4815 }
4816 else
4817 {
b2a8e766
AM
4818 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
4819 r_symndx, symtab_hdr, sym_hashes,
4820 h, sec, relocation,
4821 unresolved_reloc, warned);
9abc968f 4822
252b5132 4823 sym_name = h->root.root.string;
7619e7c7
AM
4824 }
4825
4826 /* TLS optimizations. Replace instruction sequences and relocs
4827 based on information we collected in tls_optimize. We edit
4828 RELOCS so that --emit-relocs will output something sensible
4829 for the final instruction stream. */
4830 tls_mask = 0;
4831 tls_gd = 0;
4832 if (IS_PPC_TLS_RELOC (r_type))
4833 {
4834 if (h != NULL)
4835 tls_mask = ((struct ppc_elf_link_hash_entry *) h)->tls_mask;
4836 else if (local_got_offsets != NULL)
4837 {
4838 char *lgot_masks;
4839 lgot_masks = (char *) (local_got_offsets + symtab_hdr->sh_info);
4840 tls_mask = lgot_masks[r_symndx];
4841 }
4842 }
4843
4844 /* Ensure reloc mapping code below stays sane. */
4845 if ((R_PPC_GOT_TLSLD16 & 3) != (R_PPC_GOT_TLSGD16 & 3)
4846 || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TLSGD16_LO & 3)
4847 || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TLSGD16_HI & 3)
4848 || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TLSGD16_HA & 3)
4849 || (R_PPC_GOT_TLSLD16 & 3) != (R_PPC_GOT_TPREL16 & 3)
4850 || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TPREL16_LO & 3)
4851 || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TPREL16_HI & 3)
4852 || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TPREL16_HA & 3))
4853 abort ();
4854 switch (r_type)
4855 {
4856 default:
4857 break;
4858
4859 case R_PPC_GOT_TPREL16:
4860 case R_PPC_GOT_TPREL16_LO:
4861 if (tls_mask != 0
4862 && (tls_mask & TLS_TPREL) == 0)
4863 {
4864 bfd_vma insn;
4865 insn = bfd_get_32 (output_bfd, contents + rel->r_offset - 2);
4866 insn &= 31 << 21;
4867 insn |= 0x3c020000; /* addis 0,2,0 */
4868 bfd_put_32 (output_bfd, insn, contents + rel->r_offset - 2);
4869 r_type = R_PPC_TPREL16_HA;
4870 rel->r_info = ELF32_R_INFO (r_symndx, r_type);
4871 }
4872 break;
4873
4874 case R_PPC_TLS:
4875 if (tls_mask != 0
4876 && (tls_mask & TLS_TPREL) == 0)
4877 {
4878 bfd_vma insn, rtra;
4879 insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
4880 if ((insn & ((31 << 26) | (31 << 11)))
4881 == ((31 << 26) | (2 << 11)))
4882 rtra = insn & ((1 << 26) - (1 << 16));
4883 else if ((insn & ((31 << 26) | (31 << 16)))
4884 == ((31 << 26) | (2 << 16)))
4885 rtra = (insn & (31 << 21)) | ((insn & (31 << 11)) << 5);
4886 else
4887 abort ();
4888 if ((insn & ((1 << 11) - (1 << 1))) == 266 << 1)
4889 /* add -> addi. */
4890 insn = 14 << 26;
4891 else if ((insn & (31 << 1)) == 23 << 1
4892 && ((insn & (31 << 6)) < 14 << 6
4893 || ((insn & (31 << 6)) >= 16 << 6
4894 && (insn & (31 << 6)) < 24 << 6)))
4895 /* load and store indexed -> dform. */
4896 insn = (32 | ((insn >> 6) & 31)) << 26;
4897 else if ((insn & (31 << 1)) == 21 << 1
4898 && (insn & (0x1a << 6)) == 0)
4899 /* ldx, ldux, stdx, stdux -> ld, ldu, std, stdu. */
4900 insn = (((58 | ((insn >> 6) & 4)) << 26)
4901 | ((insn >> 6) & 1));
4902 else if ((insn & (31 << 1)) == 21 << 1
4903 && (insn & ((1 << 11) - (1 << 1))) == 341 << 1)
4904 /* lwax -> lwa. */
4905 insn = (58 << 26) | 2;
4906 else
4907 abort ();
4908 insn |= rtra;
4909 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
4910 r_type = R_PPC_TPREL16_LO;
4911 rel->r_info = ELF32_R_INFO (r_symndx, r_type);
4912 /* Was PPC_TLS which sits on insn boundary, now
4913 PPC_TPREL16_LO which is at insn+2. */
4914 rel->r_offset += 2;
4915 }
4916 break;
4917
4918 case R_PPC_GOT_TLSGD16_HI:
4919 case R_PPC_GOT_TLSGD16_HA:
4920 tls_gd = TLS_TPRELGD;
4921 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
4922 goto tls_gdld_hi;
4923 break;
4924
4925 case R_PPC_GOT_TLSLD16_HI:
4926 case R_PPC_GOT_TLSLD16_HA:
4927 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
4928 {
4929 tls_gdld_hi:
4930 if ((tls_mask & tls_gd) != 0)
4931 r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
4932 + R_PPC_GOT_TPREL16);
4933 else
4934 {
4935 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
4936 rel->r_offset -= 2;
4937 r_type = R_PPC_NONE;
4938 }
4939 rel->r_info = ELF32_R_INFO (r_symndx, r_type);
4940 }
4941 break;
4942
4943 case R_PPC_GOT_TLSGD16:
4944 case R_PPC_GOT_TLSGD16_LO:
4945 tls_gd = TLS_TPRELGD;
4946 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
4947 goto tls_get_addr_check;
4948 break;
4949
4950 case R_PPC_GOT_TLSLD16:
4951 case R_PPC_GOT_TLSLD16_LO:
4952 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
4953 {
4954 tls_get_addr_check:
4955 if (rel + 1 < relend)
4956 {
4957 enum elf_ppc_reloc_type r_type2;
4958 unsigned long r_symndx2;
4959 struct elf_link_hash_entry *h2;
87d243f1 4960 bfd_vma insn1, insn2;
7619e7c7
AM
4961 bfd_vma offset;
4962
4963 /* The next instruction should be a call to
4964 __tls_get_addr. Peek at the reloc to be sure. */
55fd94b0 4965 r_type2 = ELF32_R_TYPE (rel[1].r_info);
7619e7c7
AM
4966 r_symndx2 = ELF32_R_SYM (rel[1].r_info);
4967 if (r_symndx2 < symtab_hdr->sh_info
4968 || (r_type2 != R_PPC_REL14
4969 && r_type2 != R_PPC_REL14_BRTAKEN
4970 && r_type2 != R_PPC_REL14_BRNTAKEN
4971 && r_type2 != R_PPC_REL24
4972 && r_type2 != R_PPC_PLTREL24))
4973 break;
4974
4975 h2 = sym_hashes[r_symndx2 - symtab_hdr->sh_info];
4976 while (h2->root.type == bfd_link_hash_indirect
4977 || h2->root.type == bfd_link_hash_warning)
4978 h2 = (struct elf_link_hash_entry *) h2->root.u.i.link;
4979 if (h2 == NULL || h2 != htab->tls_get_addr)
4980 break;
4981
4982 /* OK, it checks out. Replace the call. */
4983 offset = rel[1].r_offset;
4984 insn1 = bfd_get_32 (output_bfd,
4985 contents + rel->r_offset - 2);
7619e7c7
AM
4986 if ((tls_mask & tls_gd) != 0)
4987 {
4988 /* IE */
4989 insn1 &= (1 << 26) - 1;
4990 insn1 |= 32 << 26; /* lwz */
4991 insn2 = 0x7c631214; /* add 3,3,2 */
4992 rel[1].r_info = ELF32_R_INFO (r_symndx2, R_PPC_NONE);
4993 r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
4994 + R_PPC_GOT_TPREL16);
4995 rel->r_info = ELF32_R_INFO (r_symndx, r_type);
4996 }
4997 else
4998 {
4999 /* LE */
5000 insn1 = 0x3c620000; /* addis 3,2,0 */
5001 insn2 = 0x38630000; /* addi 3,3,0 */
5002 if (tls_gd == 0)
5003 {
5004 /* Was an LD reloc. */
5005 r_symndx = 0;
e1918d23
AM
5006 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
5007 rel[1].r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
7619e7c7
AM
5008 }
5009 r_type = R_PPC_TPREL16_HA;
5010 rel->r_info = ELF32_R_INFO (r_symndx, r_type);
5011 rel[1].r_info = ELF32_R_INFO (r_symndx,
5012 R_PPC_TPREL16_LO);
5013 rel[1].r_offset += 2;
5014 }
7619e7c7
AM
5015 bfd_put_32 (output_bfd, insn1, contents + rel->r_offset - 2);
5016 bfd_put_32 (output_bfd, insn2, contents + offset);
7619e7c7
AM
5017 if (tls_gd == 0)
5018 {
5019 /* We changed the symbol on an LD reloc. Start over
70bccea4 5020 in order to get h, sym, sec etc. right. */
7619e7c7
AM
5021 rel--;
5022 continue;
5023 }
5024 }
252b5132 5025 }
7619e7c7
AM
5026 break;
5027 }
5028
5029 /* Handle other relocations that tweak non-addend part of insn. */
5030 branch_bit = 0;
5031 switch (r_type)
5032 {
5033 default:
5034 break;
5035
5036 /* Branch taken prediction relocations. */
5037 case R_PPC_ADDR14_BRTAKEN:
5038 case R_PPC_REL14_BRTAKEN:
5039 branch_bit = BRANCH_PREDICT_BIT;
5040 /* Fall thru */
5041
4cc11e76 5042 /* Branch not taken prediction relocations. */
7619e7c7
AM
5043 case R_PPC_ADDR14_BRNTAKEN:
5044 case R_PPC_REL14_BRNTAKEN:
5045 insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
5046 insn &= ~BRANCH_PREDICT_BIT;
5047 insn |= branch_bit;
5048
5049 from = (rel->r_offset
5050 + input_section->output_offset
5051 + input_section->output_section->vma);
5052
5053 /* Invert 'y' bit if not the default. */
5054 if ((bfd_signed_vma) (relocation + rel->r_addend - from) < 0)
5055 insn ^= BRANCH_PREDICT_BIT;
5056
5057 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
5058 break;
252b5132
RH
5059 }
5060
7619e7c7
AM
5061 addend = rel->r_addend;
5062 tls_type = 0;
5063 howto = NULL;
55fd94b0
AM
5064 if (r_type < R_PPC_max)
5065 howto = ppc_elf_howto_table[r_type];
7619e7c7 5066 switch (r_type)
252b5132
RH
5067 {
5068 default:
7619e7c7 5069 (*_bfd_error_handler)
d003868e
AM
5070 (_("%B: unknown relocation type %d for symbol %s"),
5071 input_bfd, (int) r_type, sym_name);
252b5132
RH
5072
5073 bfd_set_error (bfd_error_bad_value);
b34976b6 5074 ret = FALSE;
252b5132
RH
5075 continue;
5076
7619e7c7
AM
5077 case R_PPC_NONE:
5078 case R_PPC_TLS:
5079 case R_PPC_EMB_MRKREF:
5080 case R_PPC_GNU_VTINHERIT:
5081 case R_PPC_GNU_VTENTRY:
7595d193
L
5082 continue;
5083
7619e7c7
AM
5084 /* GOT16 relocations. Like an ADDR16 using the symbol's
5085 address in the GOT as relocation value instead of the
5086 symbol's value itself. Also, create a GOT entry for the
5087 symbol and put the symbol value there. */
5088 case R_PPC_GOT_TLSGD16:
5089 case R_PPC_GOT_TLSGD16_LO:
5090 case R_PPC_GOT_TLSGD16_HI:
5091 case R_PPC_GOT_TLSGD16_HA:
5092 tls_type = TLS_TLS | TLS_GD;
5093 goto dogot;
5094
5095 case R_PPC_GOT_TLSLD16:
5096 case R_PPC_GOT_TLSLD16_LO:
5097 case R_PPC_GOT_TLSLD16_HI:
5098 case R_PPC_GOT_TLSLD16_HA:
5099 tls_type = TLS_TLS | TLS_LD;
5100 goto dogot;
5101
5102 case R_PPC_GOT_TPREL16:
5103 case R_PPC_GOT_TPREL16_LO:
5104 case R_PPC_GOT_TPREL16_HI:
5105 case R_PPC_GOT_TPREL16_HA:
5106 tls_type = TLS_TLS | TLS_TPREL;
5107 goto dogot;
5108
5109 case R_PPC_GOT_DTPREL16:
5110 case R_PPC_GOT_DTPREL16_LO:
5111 case R_PPC_GOT_DTPREL16_HI:
5112 case R_PPC_GOT_DTPREL16_HA:
5113 tls_type = TLS_TLS | TLS_DTPREL;
5114 goto dogot;
5115
5116 case R_PPC_GOT16:
5117 case R_PPC_GOT16_LO:
5118 case R_PPC_GOT16_HI:
5119 case R_PPC_GOT16_HA:
5120 dogot:
5121 {
5122 /* Relocation is to the entry for this symbol in the global
5123 offset table. */
5124 bfd_vma off;
5125 bfd_vma *offp;
5126 unsigned long indx;
5127
5128 if (htab->got == NULL)
5129 abort ();
5130
5131 indx = 0;
5132 if (tls_type == (TLS_TLS | TLS_LD)
d881513a 5133 && (h == NULL
f5385ebf 5134 || !h->def_dynamic))
7619e7c7
AM
5135 offp = &htab->tlsld_got.offset;
5136 else if (h != NULL)
5137 {
5138 bfd_boolean dyn;
5139 dyn = htab->elf.dynamic_sections_created;
ee05f2fe 5140 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
7619e7c7
AM
5141 || (info->shared
5142 && SYMBOL_REFERENCES_LOCAL (info, h)))
5143 /* This is actually a static link, or it is a
5144 -Bsymbolic link and the symbol is defined
5145 locally, or the symbol was forced to be local
5146 because of a version file. */
5147 ;
5148 else
5149 {
5150 indx = h->dynindx;
5151 unresolved_reloc = FALSE;
5152 }
5153 offp = &h->got.offset;
5154 }
5155 else
5156 {
5157 if (local_got_offsets == NULL)
5158 abort ();
5159 offp = &local_got_offsets[r_symndx];
5160 }
5161
5162 /* The offset must always be a multiple of 4. We use the
5163 least significant bit to record whether we have already
5164 processed this entry. */
5165 off = *offp;
5166 if ((off & 1) != 0)
5167 off &= ~1;
5168 else
5169 {
70bccea4
AM
5170 unsigned int tls_m = (tls_mask
5171 & (TLS_LD | TLS_GD | TLS_DTPREL
5172 | TLS_TPREL | TLS_TPRELGD));
5173
5174 if (offp == &htab->tlsld_got.offset)
5175 tls_m = TLS_LD;
5176 else if (h == NULL
f5385ebf 5177 || !h->def_dynamic)
70bccea4
AM
5178 tls_m &= ~TLS_LD;
5179
5180 /* We might have multiple got entries for this sym.
5181 Initialize them all. */
5182 do
7619e7c7 5183 {
70bccea4
AM
5184 int tls_ty = 0;
5185
5186 if ((tls_m & TLS_LD) != 0)
7619e7c7 5187 {
70bccea4
AM
5188 tls_ty = TLS_TLS | TLS_LD;
5189 tls_m &= ~TLS_LD;
5190 }
5191 else if ((tls_m & TLS_GD) != 0)
5192 {
5193 tls_ty = TLS_TLS | TLS_GD;
5194 tls_m &= ~TLS_GD;
5195 }
5196 else if ((tls_m & TLS_DTPREL) != 0)
5197 {
5198 tls_ty = TLS_TLS | TLS_DTPREL;
5199 tls_m &= ~TLS_DTPREL;
5200 }
5201 else if ((tls_m & (TLS_TPREL | TLS_TPRELGD)) != 0)
5202 {
5203 tls_ty = TLS_TLS | TLS_TPREL;
5204 tls_m = 0;
7619e7c7 5205 }
7619e7c7 5206
70bccea4 5207 /* Generate relocs for the dynamic linker. */
4e795f50
AM
5208 if ((info->shared || indx != 0)
5209 && (h == NULL
5210 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5211 || h->root.type != bfd_link_hash_undefweak))
7619e7c7 5212 {
70bccea4
AM
5213 outrel.r_offset = (htab->got->output_section->vma
5214 + htab->got->output_offset
5215 + off);
e515b051 5216 outrel.r_addend = 0;
70bccea4
AM
5217 if (tls_ty & (TLS_LD | TLS_GD))
5218 {
5219 outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPMOD32);
70bccea4
AM
5220 if (tls_ty == (TLS_TLS | TLS_GD))
5221 {
5222 loc = htab->relgot->contents;
5223 loc += (htab->relgot->reloc_count++
5224 * sizeof (Elf32_External_Rela));
5225 bfd_elf32_swap_reloca_out (output_bfd,
5226 &outrel, loc);
e515b051 5227 outrel.r_offset += 4;
70bccea4
AM
5228 outrel.r_info
5229 = ELF32_R_INFO (indx, R_PPC_DTPREL32);
70bccea4
AM
5230 }
5231 }
5232 else if (tls_ty == (TLS_TLS | TLS_DTPREL))
5233 outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPREL32);
5234 else if (tls_ty == (TLS_TLS | TLS_TPREL))
5235 outrel.r_info = ELF32_R_INFO (indx, R_PPC_TPREL32);
5236 else if (indx == 0)
5237 outrel.r_info = ELF32_R_INFO (indx, R_PPC_RELATIVE);
5238 else
5239 outrel.r_info = ELF32_R_INFO (indx, R_PPC_GLOB_DAT);
70bccea4 5240 if (indx == 0)
e515b051
AM
5241 {
5242 outrel.r_addend += relocation;
5243 if (tls_ty & (TLS_GD | TLS_DTPREL | TLS_TPREL))
e1918d23 5244 outrel.r_addend -= htab->elf.tls_sec->vma;
e515b051 5245 }
70bccea4
AM
5246 loc = htab->relgot->contents;
5247 loc += (htab->relgot->reloc_count++
5248 * sizeof (Elf32_External_Rela));
5249 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
7619e7c7
AM
5250 }
5251
70bccea4
AM
5252 /* Init the .got section contents if we're not
5253 emitting a reloc. */
5254 else
7619e7c7 5255 {
70bccea4
AM
5256 bfd_vma value = relocation;
5257
7b609f53
AM
5258 if (tls_ty == (TLS_TLS | TLS_LD))
5259 value = 1;
5260 else if (tls_ty != 0)
70bccea4 5261 {
e1918d23 5262 value -= htab->elf.tls_sec->vma + DTP_OFFSET;
7b609f53 5263 if (tls_ty == (TLS_TLS | TLS_TPREL))
70bccea4 5264 value += DTP_OFFSET - TP_OFFSET;
70bccea4 5265
7b609f53
AM
5266 if (tls_ty == (TLS_TLS | TLS_GD))
5267 {
5268 bfd_put_32 (output_bfd, value,
5269 htab->got->contents + off + 4);
5270 value = 1;
5271 }
70bccea4 5272 }
70bccea4
AM
5273 bfd_put_32 (output_bfd, value,
5274 htab->got->contents + off);
7619e7c7 5275 }
70bccea4
AM
5276
5277 off += 4;
5278 if (tls_ty & (TLS_LD | TLS_GD))
5279 off += 4;
7619e7c7 5280 }
70bccea4
AM
5281 while (tls_m != 0);
5282
5283 off = *offp;
5284 *offp = off | 1;
7619e7c7
AM
5285 }
5286
5287 if (off >= (bfd_vma) -2)
5288 abort ();
5289
70bccea4
AM
5290 if ((tls_type & TLS_TLS) != 0)
5291 {
5292 if (tls_type != (TLS_TLS | TLS_LD))
5293 {
5294 if ((tls_mask & TLS_LD) != 0
5295 && !(h == NULL
f5385ebf 5296 || !h->def_dynamic))
70bccea4
AM
5297 off += 8;
5298 if (tls_type != (TLS_TLS | TLS_GD))
5299 {
5300 if ((tls_mask & TLS_GD) != 0)
5301 off += 8;
5302 if (tls_type != (TLS_TLS | TLS_DTPREL))
5303 {
5304 if ((tls_mask & TLS_DTPREL) != 0)
5305 off += 4;
5306 }
5307 }
5308 }
5309 }
5310
3b36f7e6
AM
5311 relocation = htab->got->output_offset + off;
5312 relocation -= htab->elf.hgot->root.u.def.value;
7619e7c7
AM
5313
5314 /* Addends on got relocations don't make much sense.
5315 x+off@got is actually x@got+off, and since the got is
5316 generated by a hash table traversal, the value in the
5317 got at entry m+n bears little relation to the entry m. */
5318 if (addend != 0)
5319 (*_bfd_error_handler)
d003868e
AM
5320 (_("%B(%A+0x%lx): non-zero addend on %s reloc against `%s'"),
5321 input_bfd,
5322 input_section,
7619e7c7 5323 (long) rel->r_offset,
7b609f53 5324 howto->name,
7619e7c7
AM
5325 sym_name);
5326 }
70bccea4 5327 break;
7619e7c7 5328
252b5132 5329 /* Relocations that need no special processing. */
7619e7c7 5330 case R_PPC_LOCAL24PC:
252b5132
RH
5331 /* It makes no sense to point a local relocation
5332 at a symbol not in this object. */
7b609f53 5333 if (unresolved_reloc)
252b5132 5334 {
464e1740
ILT
5335 if (! (*info->callbacks->undefined_symbol) (info,
5336 h->root.root.string,
5337 input_bfd,
5338 input_section,
5cc7c785 5339 rel->r_offset,
b34976b6
AM
5340 TRUE))
5341 return FALSE;
252b5132
RH
5342 continue;
5343 }
5344 break;
5345
7619e7c7
AM
5346 case R_PPC_DTPREL16:
5347 case R_PPC_DTPREL16_LO:
5348 case R_PPC_DTPREL16_HI:
5349 case R_PPC_DTPREL16_HA:
e1918d23 5350 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
7619e7c7
AM
5351 break;
5352
70bccea4
AM
5353 /* Relocations that may need to be propagated if this is a shared
5354 object. */
7619e7c7
AM
5355 case R_PPC_TPREL16:
5356 case R_PPC_TPREL16_LO:
5357 case R_PPC_TPREL16_HI:
5358 case R_PPC_TPREL16_HA:
e1918d23 5359 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
7619e7c7
AM
5360 /* The TPREL16 relocs shouldn't really be used in shared
5361 libs as they will result in DT_TEXTREL being set, but
5362 support them anyway. */
5363 goto dodyn;
5364
5365 case R_PPC_TPREL32:
e1918d23 5366 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
7619e7c7
AM
5367 goto dodyn;
5368
5369 case R_PPC_DTPREL32:
e1918d23 5370 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
7619e7c7
AM
5371 goto dodyn;
5372
e515b051
AM
5373 case R_PPC_DTPMOD32:
5374 relocation = 1;
5375 addend = 0;
5376 goto dodyn;
5377
7619e7c7
AM
5378 case R_PPC_REL24:
5379 case R_PPC_REL32:
5380 case R_PPC_REL14:
5381 case R_PPC_REL14_BRTAKEN:
5382 case R_PPC_REL14_BRNTAKEN:
252b5132
RH
5383 /* If these relocations are not to a named symbol, they can be
5384 handled right here, no need to bother the dynamic linker. */
f6c52c13 5385 if (SYMBOL_REFERENCES_LOCAL (info, h)
3b36f7e6 5386 || h == htab->elf.hgot)
252b5132 5387 break;
70bccea4 5388 /* fall through */
252b5132 5389
70bccea4
AM
5390 /* Relocations that always need to be propagated if this is a shared
5391 object. */
7619e7c7
AM
5392 case R_PPC_ADDR32:
5393 case R_PPC_ADDR24:
5394 case R_PPC_ADDR16:
5395 case R_PPC_ADDR16_LO:
5396 case R_PPC_ADDR16_HI:
5397 case R_PPC_ADDR16_HA:
5398 case R_PPC_ADDR14:
5399 case R_PPC_ADDR14_BRTAKEN:
5400 case R_PPC_ADDR14_BRNTAKEN:
5401 case R_PPC_UADDR32:
5402 case R_PPC_UADDR16:
ee05f2fe
AM
5403 /* r_symndx will be zero only for relocs against symbols
5404 from removed linkonce sections, or sections discarded by
5405 a linker script. */
7619e7c7 5406 dodyn:
ee05f2fe
AM
5407 if (r_symndx == 0)
5408 break;
5409 /* Fall thru. */
5410
c87b5a93
AM
5411 if ((input_section->flags & SEC_ALLOC) == 0)
5412 break;
5413 /* Fall thru. */
5414
ee05f2fe 5415 if ((info->shared
4e795f50
AM
5416 && (h == NULL
5417 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5418 || h->root.type != bfd_link_hash_undefweak)
ee05f2fe 5419 && (MUST_BE_DYN_RELOC (r_type)
f6c52c13 5420 || !SYMBOL_CALLS_LOCAL (info, h)))
ee05f2fe
AM
5421 || (ELIMINATE_COPY_RELOCS
5422 && !info->shared
ee05f2fe
AM
5423 && h != NULL
5424 && h->dynindx != -1
f5385ebf
AM
5425 && !h->non_got_ref
5426 && h->def_dynamic
5427 && !h->def_regular))
252b5132 5428 {
0bb2d96a 5429 int skip;
252b5132
RH
5430
5431#ifdef DEBUG
55fd94b0
AM
5432 fprintf (stderr, "ppc_elf_relocate_section needs to "
5433 "create relocation for %s\n",
70bccea4
AM
5434 (h && h->root.root.string
5435 ? h->root.root.string : "<unknown>"));
252b5132
RH
5436#endif
5437
5438 /* When generating a shared object, these relocations
70bccea4
AM
5439 are copied into the output file to be resolved at run
5440 time. */
252b5132
RH
5441 if (sreloc == NULL)
5442 {
5443 const char *name;
5444
5445 name = (bfd_elf_string_from_elf_section
5446 (input_bfd,
5447 elf_elfheader (input_bfd)->e_shstrndx,
5448 elf_section_data (input_section)->rel_hdr.sh_name));
5449 if (name == NULL)
b34976b6 5450 return FALSE;
252b5132
RH
5451
5452 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
5453 && strcmp (bfd_get_section_name (input_bfd,
5454 input_section),
5455 name + 5) == 0);
5456
7619e7c7 5457 sreloc = bfd_get_section_by_name (htab->elf.dynobj, name);
252b5132
RH
5458 BFD_ASSERT (sreloc != NULL);
5459 }
5460
0bb2d96a 5461 skip = 0;
252b5132 5462
c629eae0
JJ
5463 outrel.r_offset =
5464 _bfd_elf_section_offset (output_bfd, info, input_section,
5465 rel->r_offset);
0bb2d96a
JJ
5466 if (outrel.r_offset == (bfd_vma) -1
5467 || outrel.r_offset == (bfd_vma) -2)
5468 skip = (int) outrel.r_offset;
252b5132
RH
5469 outrel.r_offset += (input_section->output_section->vma
5470 + input_section->output_offset);
5471
5472 if (skip)
5473 memset (&outrel, 0, sizeof outrel);
f6c52c13 5474 else if (!SYMBOL_REFERENCES_LOCAL (info, h))
252b5132 5475 {
7619e7c7 5476 unresolved_reloc = FALSE;
252b5132
RH
5477 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
5478 outrel.r_addend = rel->r_addend;
5479 }
5480 else
5481 {
47388f4c
AM
5482 outrel.r_addend = relocation + rel->r_addend;
5483
252b5132 5484 if (r_type == R_PPC_ADDR32)
47388f4c 5485 outrel.r_info = ELF32_R_INFO (0, R_PPC_RELATIVE);
252b5132
RH
5486 else
5487 {
5488 long indx;
5489
47388f4c 5490 if (bfd_is_abs_section (sec))
252b5132
RH
5491 indx = 0;
5492 else if (sec == NULL || sec->owner == NULL)
5493 {
5494 bfd_set_error (bfd_error_bad_value);
b34976b6 5495 return FALSE;
252b5132
RH
5496 }
5497 else
5498 {
5499 asection *osec;
5500
47388f4c
AM
5501 /* We are turning this relocation into one
5502 against a section symbol. It would be
5503 proper to subtract the symbol's value,
5504 osec->vma, from the emitted reloc addend,
5505 but ld.so expects buggy relocs. */
252b5132
RH
5506 osec = sec->output_section;
5507 indx = elf_section_data (osec)->dynindx;
8da6118f 5508 BFD_ASSERT (indx > 0);
252b5132
RH
5509#ifdef DEBUG
5510 if (indx <= 0)
55fd94b0
AM
5511 printf ("indx=%d section=%s flags=%08x name=%s\n",
5512 indx, osec->name, osec->flags,
5513 h->root.root.string);
252b5132
RH
5514#endif
5515 }
5516
5517 outrel.r_info = ELF32_R_INFO (indx, r_type);
252b5132
RH
5518 }
5519 }
5520
947216bf
AM
5521 loc = sreloc->contents;
5522 loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
5523 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
252b5132 5524
2243deae 5525 if (skip == -1)
252b5132 5526 continue;
2243deae
L
5527
5528 /* This reloc will be computed at runtime. We clear the memory
5529 so that it contains predictable value. */
5530 if (! skip
5531 && ((input_section->flags & SEC_ALLOC) != 0
5532 || ELF32_R_TYPE (outrel.r_info) != R_PPC_RELATIVE))
5533 {
5534 relocation = howto->pc_relative ? outrel.r_offset : 0;
5535 addend = 0;
5536 break;
5537 }
252b5132 5538 }
252b5132
RH
5539 break;
5540
b4a38de6
AM
5541 case R_PPC_RELAX32PC_PLT:
5542 case R_PPC_RELAX32_PLT:
5543 BFD_ASSERT (h != NULL
5544 && h->plt.offset != (bfd_vma) -1
5545 && htab->plt != NULL);
5546
5547 relocation = (htab->plt->output_section->vma
5548 + htab->plt->output_offset
5549 + h->plt.offset);
5550 if (r_type == R_PPC_RELAX32_PLT)
5551 goto relax32;
5552 /* Fall thru */
5553
f31a141e
AM
5554 case R_PPC_RELAX32PC:
5555 relocation -= (input_section->output_section->vma
5556 + input_section->output_offset
5557 + rel->r_offset - 4);
5558 /* Fall thru */
b4a38de6 5559
deaaf2f3 5560 case R_PPC_RELAX32:
b4a38de6 5561 relax32:
9abc968f
AM
5562 {
5563 unsigned long t0;
5564 unsigned long t1;
5565
5566 t0 = bfd_get_32 (output_bfd, contents + rel->r_offset);
5567 t1 = bfd_get_32 (output_bfd, contents + rel->r_offset + 4);
5568
5569 /* We're clearing the bits for R_PPC_ADDR16_HA
5570 and R_PPC_ADDR16_LO here. */
5571 t0 &= ~0xffff;
5572 t1 &= ~0xffff;
5573
5574 /* t0 is HA, t1 is LO */
5575 relocation += addend;
5576 t0 |= ((relocation + 0x8000) >> 16) & 0xffff;
5577 t1 |= relocation & 0xffff;
5578
5579 bfd_put_32 (output_bfd, t0, contents + rel->r_offset);
5580 bfd_put_32 (output_bfd, t1, contents + rel->r_offset + 4);
5581 }
8517fae7 5582 continue;
deaaf2f3 5583
70bccea4 5584 /* Indirect .sdata relocation. */
7619e7c7 5585 case R_PPC_EMB_SDAI16:
c9a2f333 5586 BFD_ASSERT (htab->sdata[0].section != NULL);
7619e7c7 5587 relocation
76750a2f
AM
5588 = elf_finish_pointer_linker_section (input_bfd, &htab->sdata[0],
5589 h, relocation, rel);
252b5132
RH
5590 break;
5591
70bccea4 5592 /* Indirect .sdata2 relocation. */
7619e7c7 5593 case R_PPC_EMB_SDA2I16:
c9a2f333 5594 BFD_ASSERT (htab->sdata[1].section != NULL);
7619e7c7 5595 relocation
76750a2f
AM
5596 = elf_finish_pointer_linker_section (input_bfd, &htab->sdata[1],
5597 h, relocation, rel);
252b5132
RH
5598 break;
5599
70bccea4
AM
5600 /* Handle the TOC16 reloc. We want to use the offset within the .got
5601 section, not the actual VMA. This is appropriate when generating
5602 an embedded ELF object, for which the .got section acts like the
5603 AIX .toc section. */
7619e7c7 5604 case R_PPC_TOC16: /* phony GOT16 relocations */
55fd94b0 5605 BFD_ASSERT (sec != NULL);
252b5132
RH
5606 BFD_ASSERT (bfd_is_und_section (sec)
5607 || strcmp (bfd_get_section_name (abfd, sec), ".got") == 0
f12123c0 5608 || strcmp (bfd_get_section_name (abfd, sec), ".cgot") == 0);
252b5132 5609
70bccea4 5610 addend -= sec->output_section->vma + sec->output_offset + 0x8000;
252b5132
RH
5611 break;
5612
7619e7c7 5613 case R_PPC_PLTREL24:
252b5132 5614 /* Relocation is to the entry for this symbol in the
70bccea4 5615 procedure linkage table. */
252b5132
RH
5616 BFD_ASSERT (h != NULL);
5617
5618 if (h->plt.offset == (bfd_vma) -1
7619e7c7 5619 || htab->plt == NULL)
252b5132
RH
5620 {
5621 /* We didn't make a PLT entry for this symbol. This
70bccea4
AM
5622 happens when statically linking PIC code, or when
5623 using -Bsymbolic. */
252b5132
RH
5624 break;
5625 }
5626
7619e7c7
AM
5627 unresolved_reloc = FALSE;
5628 relocation = (htab->plt->output_section->vma
5629 + htab->plt->output_offset
252b5132 5630 + h->plt.offset);
8da6118f 5631 break;
252b5132 5632
70bccea4 5633 /* Relocate against _SDA_BASE_. */
7619e7c7 5634 case R_PPC_SDAREL16:
252b5132
RH
5635 {
5636 const char *name;
5637
55fd94b0 5638 BFD_ASSERT (sec != NULL);
252b5132 5639 name = bfd_get_section_name (abfd, sec->output_section);
5f819128
AM
5640 if (! ((strncmp (name, ".sdata", 6) == 0
5641 && (name[6] == 0 || name[6] == '.'))
5642 || (strncmp (name, ".sbss", 5) == 0
5643 && (name[5] == 0 || name[5] == '.'))))
252b5132 5644 {
55fd94b0 5645 (*_bfd_error_handler)
d003868e 5646 (_("%B: the target (%s) of a %s relocation is "
55fd94b0 5647 "in the wrong output section (%s)"),
d003868e 5648 input_bfd,
55fd94b0
AM
5649 sym_name,
5650 howto->name,
5651 name);
252b5132 5652 }
c9a2f333 5653 addend -= htab->sdata[0].sym_val;
252b5132
RH
5654 }
5655 break;
5656
70bccea4 5657 /* Relocate against _SDA2_BASE_. */
7619e7c7 5658 case R_PPC_EMB_SDA2REL:
252b5132
RH
5659 {
5660 const char *name;
5661
55fd94b0 5662 BFD_ASSERT (sec != NULL);
252b5132 5663 name = bfd_get_section_name (abfd, sec->output_section);
5f819128
AM
5664 if (! (strncmp (name, ".sdata2", 7) == 0
5665 || strncmp (name, ".sbss2", 6) == 0))
252b5132 5666 {
55fd94b0 5667 (*_bfd_error_handler)
d003868e 5668 (_("%B: the target (%s) of a %s relocation is "
55fd94b0 5669 "in the wrong output section (%s)"),
d003868e 5670 input_bfd,
55fd94b0
AM
5671 sym_name,
5672 howto->name,
5673 name);
c3668558 5674
252b5132 5675 bfd_set_error (bfd_error_bad_value);
b34976b6 5676 ret = FALSE;
252b5132
RH
5677 continue;
5678 }
c9a2f333 5679 addend -= htab->sdata[1].sym_val;
252b5132
RH
5680 }
5681 break;
5682
70bccea4 5683 /* Relocate against either _SDA_BASE_, _SDA2_BASE_, or 0. */
7619e7c7
AM
5684 case R_PPC_EMB_SDA21:
5685 case R_PPC_EMB_RELSDA:
252b5132
RH
5686 {
5687 const char *name;
5688 int reg;
5689
55fd94b0 5690 BFD_ASSERT (sec != NULL);
252b5132 5691 name = bfd_get_section_name (abfd, sec->output_section);
b34976b6 5692 if (((strncmp (name, ".sdata", 6) == 0
5f819128
AM
5693 && (name[6] == 0 || name[6] == '.'))
5694 || (strncmp (name, ".sbss", 5) == 0
5695 && (name[5] == 0 || name[5] == '.'))))
252b5132
RH
5696 {
5697 reg = 13;
c9a2f333 5698 addend -= htab->sdata[0].sym_val;
252b5132
RH
5699 }
5700
5f819128
AM
5701 else if (strncmp (name, ".sdata2", 7) == 0
5702 || strncmp (name, ".sbss2", 6) == 0)
252b5132
RH
5703 {
5704 reg = 2;
c9a2f333 5705 addend -= htab->sdata[1].sym_val;
252b5132
RH
5706 }
5707
8da6118f
KH
5708 else if (strcmp (name, ".PPC.EMB.sdata0") == 0
5709 || strcmp (name, ".PPC.EMB.sbss0") == 0)
252b5132
RH
5710 {
5711 reg = 0;
5712 }
5713
5714 else
5715 {
55fd94b0 5716 (*_bfd_error_handler)
d003868e 5717 (_("%B: the target (%s) of a %s relocation is "
55fd94b0 5718 "in the wrong output section (%s)"),
d003868e 5719 input_bfd,
55fd94b0
AM
5720 sym_name,
5721 howto->name,
5722 name);
252b5132
RH
5723
5724 bfd_set_error (bfd_error_bad_value);
b34976b6 5725 ret = FALSE;
252b5132
RH
5726 continue;
5727 }
5728
5729 if (r_type == R_PPC_EMB_SDA21)
5730 { /* fill in register field */
7619e7c7 5731 insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
252b5132 5732 insn = (insn & ~RA_REGISTER_MASK) | (reg << RA_REGISTER_SHIFT);
7619e7c7 5733 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
252b5132
RH
5734 }
5735 }
5736 break;
5737
70bccea4 5738 /* Relocate against the beginning of the section. */
7619e7c7
AM
5739 case R_PPC_SECTOFF:
5740 case R_PPC_SECTOFF_LO:
5741 case R_PPC_SECTOFF_HI:
5742 case R_PPC_SECTOFF_HA:
55fd94b0 5743 BFD_ASSERT (sec != NULL);
252b5132 5744 addend -= sec->output_section->vma;
252b5132
RH
5745 break;
5746
70bccea4 5747 /* Negative relocations. */
7619e7c7
AM
5748 case R_PPC_EMB_NADDR32:
5749 case R_PPC_EMB_NADDR16:
5750 case R_PPC_EMB_NADDR16_LO:
5751 case R_PPC_EMB_NADDR16_HI:
5752 case R_PPC_EMB_NADDR16_HA:
8da6118f 5753 addend -= 2 * relocation;
252b5132
RH
5754 break;
5755
7619e7c7
AM
5756 case R_PPC_COPY:
5757 case R_PPC_GLOB_DAT:
5758 case R_PPC_JMP_SLOT:
5759 case R_PPC_RELATIVE:
5760 case R_PPC_PLT32:
5761 case R_PPC_PLTREL32:
5762 case R_PPC_PLT16_LO:
5763 case R_PPC_PLT16_HI:
5764 case R_PPC_PLT16_HA:
5765 case R_PPC_ADDR30:
5766 case R_PPC_EMB_RELSEC16:
5767 case R_PPC_EMB_RELST_LO:
5768 case R_PPC_EMB_RELST_HI:
5769 case R_PPC_EMB_RELST_HA:
5770 case R_PPC_EMB_BIT_FLD:
5771 (*_bfd_error_handler)
d003868e
AM
5772 (_("%B: relocation %s is not yet supported for symbol %s."),
5773 input_bfd,
7619e7c7
AM
5774 howto->name,
5775 sym_name);
252b5132
RH
5776
5777 bfd_set_error (bfd_error_invalid_operation);
b34976b6 5778 ret = FALSE;
252b5132 5779 continue;
7619e7c7 5780 }
252b5132 5781
7619e7c7
AM
5782 /* Do any further special processing. */
5783 switch (r_type)
5784 {
5785 default:
5786 break;
5787
5788 case R_PPC_ADDR16_HA:
5789 case R_PPC_GOT16_HA:
5790 case R_PPC_PLT16_HA:
5791 case R_PPC_SECTOFF_HA:
5792 case R_PPC_TPREL16_HA:
5793 case R_PPC_DTPREL16_HA:
5794 case R_PPC_GOT_TLSGD16_HA:
5795 case R_PPC_GOT_TLSLD16_HA:
5796 case R_PPC_GOT_TPREL16_HA:
5797 case R_PPC_GOT_DTPREL16_HA:
5798 case R_PPC_EMB_NADDR16_HA:
5799 case R_PPC_EMB_RELST_HA:
5800 /* It's just possible that this symbol is a weak symbol
7b609f53 5801 that's not actually defined anywhere. In that case,
7619e7c7
AM
5802 'sec' would be NULL, and we should leave the symbol
5803 alone (it will be set to zero elsewhere in the link). */
5804 if (sec != NULL)
e515b051
AM
5805 /* Add 0x10000 if sign bit in 0:15 is set.
5806 Bits 0:15 are not used. */
5807 addend += 0x8000;
7619e7c7 5808 break;
252b5132
RH
5809 }
5810
252b5132 5811#ifdef DEBUG
55fd94b0
AM
5812 fprintf (stderr, "\ttype = %s (%d), name = %s, symbol index = %ld, "
5813 "offset = %ld, addend = %ld\n",
252b5132 5814 howto->name,
8da6118f 5815 (int) r_type,
252b5132
RH
5816 sym_name,
5817 r_symndx,
7619e7c7 5818 (long) rel->r_offset,
8da6118f 5819 (long) addend);
252b5132
RH
5820#endif
5821
7619e7c7
AM
5822 if (unresolved_reloc
5823 && !((input_section->flags & SEC_DEBUGGING) != 0
f5385ebf 5824 && h->def_dynamic))
7619e7c7
AM
5825 {
5826 (*_bfd_error_handler)
d003868e
AM
5827 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
5828 input_bfd,
5829 input_section,
7619e7c7 5830 (long) rel->r_offset,
7b609f53 5831 howto->name,
7619e7c7
AM
5832 sym_name);
5833 ret = FALSE;
5834 }
5835
252b5132
RH
5836 r = _bfd_final_link_relocate (howto,
5837 input_bfd,
5838 input_section,
5839 contents,
7619e7c7 5840 rel->r_offset,
252b5132
RH
5841 relocation,
5842 addend);
5843
7619e7c7 5844 if (r != bfd_reloc_ok)
252b5132 5845 {
7619e7c7 5846 if (r == bfd_reloc_overflow)
252b5132 5847 {
7619e7c7
AM
5848 if (warned)
5849 continue;
5850 if (h != NULL
5851 && h->root.type == bfd_link_hash_undefweak
dc1bc0c9
RH
5852 && howto->pc_relative)
5853 {
5854 /* Assume this is a call protected by other code that
5855 detect the symbol is undefined. If this is the case,
5856 we can safely ignore the overflow. If not, the
5857 program is hosed anyway, and a little warning isn't
5858 going to help. */
252b5132 5859
dc1bc0c9
RH
5860 continue;
5861 }
252b5132 5862
7619e7c7 5863 if (! (*info->callbacks->reloc_overflow) (info,
dfeffb9f 5864 (h ? &h->root : NULL),
7619e7c7
AM
5865 sym_name,
5866 howto->name,
5867 rel->r_addend,
5868 input_bfd,
5869 input_section,
5870 rel->r_offset))
5871 return FALSE;
dc1bc0c9
RH
5872 }
5873 else
5874 {
7619e7c7 5875 (*_bfd_error_handler)
d003868e
AM
5876 (_("%B(%A+0x%lx): %s reloc against `%s': error %d"),
5877 input_bfd, input_section,
7b609f53 5878 (long) rel->r_offset, howto->name, sym_name, (int) r);
7619e7c7 5879 ret = FALSE;
252b5132
RH
5880 }
5881 }
5882 }
5883
252b5132
RH
5884#ifdef DEBUG
5885 fprintf (stderr, "\n");
5886#endif
5887
5888 return ret;
5889}
252b5132 5890\f
25dbc73a
AM
5891/* Finish up dynamic symbol handling. We set the contents of various
5892 dynamic sections here. */
c5fccbec 5893
b34976b6 5894static bfd_boolean
25dbc73a
AM
5895ppc_elf_finish_dynamic_symbol (bfd *output_bfd,
5896 struct bfd_link_info *info,
5897 struct elf_link_hash_entry *h,
5898 Elf_Internal_Sym *sym)
e1a9cb8e 5899{
25dbc73a 5900 struct ppc_elf_link_hash_table *htab;
e1a9cb8e 5901
25dbc73a
AM
5902#ifdef DEBUG
5903 fprintf (stderr, "ppc_elf_finish_dynamic_symbol called for %s",
5904 h->root.root.string);
5905#endif
e1a9cb8e 5906
25dbc73a
AM
5907 htab = ppc_elf_hash_table (info);
5908 BFD_ASSERT (htab->elf.dynobj != NULL);
e1a9cb8e 5909
25dbc73a 5910 if (h->plt.offset != (bfd_vma) -1)
e1a9cb8e 5911 {
25dbc73a
AM
5912 Elf_Internal_Rela rela;
5913 bfd_byte *loc;
5914 bfd_vma reloc_index;
e1a9cb8e 5915
25dbc73a
AM
5916#ifdef DEBUG
5917 fprintf (stderr, ", plt_offset = %d", h->plt.offset);
5918#endif
e1a9cb8e 5919
25dbc73a
AM
5920 /* This symbol has an entry in the procedure linkage table. Set
5921 it up. */
e1a9cb8e 5922
25dbc73a
AM
5923 BFD_ASSERT (h->dynindx != -1);
5924 BFD_ASSERT (htab->plt != NULL && htab->relplt != NULL);
e1a9cb8e 5925
25dbc73a
AM
5926 /* We don't need to fill in the .plt. The ppc dynamic linker
5927 will fill it in. */
e1a9cb8e 5928
25dbc73a
AM
5929 /* Fill in the entry in the .rela.plt section. */
5930 rela.r_offset = (htab->plt->output_section->vma
5931 + htab->plt->output_offset
5932 + h->plt.offset);
5933 rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_JMP_SLOT);
5934 rela.r_addend = 0;
e1a9cb8e 5935
25dbc73a
AM
5936 reloc_index = (h->plt.offset - PLT_INITIAL_ENTRY_SIZE) / PLT_SLOT_SIZE;
5937 if (reloc_index > PLT_NUM_SINGLE_ENTRIES)
5938 reloc_index -= (reloc_index - PLT_NUM_SINGLE_ENTRIES) / 2;
5939 loc = (htab->relplt->contents
5940 + reloc_index * sizeof (Elf32_External_Rela));
5941 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
e1a9cb8e 5942
25dbc73a
AM
5943 if (!h->def_regular)
5944 {
5945 /* Mark the symbol as undefined, rather than as defined in
5946 the .plt section. Leave the value alone. */
5947 sym->st_shndx = SHN_UNDEF;
5948 /* If the symbol is weak, we do need to clear the value.
5949 Otherwise, the PLT entry would provide a definition for
5950 the symbol even if the symbol wasn't defined anywhere,
5951 and so the symbol would never be NULL. */
5952 if (!h->ref_regular_nonweak)
5953 sym->st_value = 0;
5954 }
e1a9cb8e
NC
5955 }
5956
25dbc73a
AM
5957 if (h->needs_copy)
5958 {
5959 asection *s;
5960 Elf_Internal_Rela rela;
5961 bfd_byte *loc;
e1a9cb8e 5962
25dbc73a 5963 /* This symbols needs a copy reloc. Set it up. */
e1a9cb8e 5964
25dbc73a
AM
5965#ifdef DEBUG
5966 fprintf (stderr, ", copy");
5967#endif
e1a9cb8e 5968
25dbc73a 5969 BFD_ASSERT (h->dynindx != -1);
86bbe32f 5970
25dbc73a
AM
5971 if (h->size <= elf_gp_size (htab->elf.dynobj))
5972 s = htab->relsbss;
5973 else
5974 s = htab->relbss;
5975 BFD_ASSERT (s != NULL);
e1a9cb8e 5976
25dbc73a
AM
5977 rela.r_offset = (h->root.u.def.value
5978 + h->root.u.def.section->output_section->vma
5979 + h->root.u.def.section->output_offset);
5980 rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_COPY);
5981 rela.r_addend = 0;
5982 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
5983 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
5984 }
e1a9cb8e 5985
25dbc73a
AM
5986#ifdef DEBUG
5987 fprintf (stderr, "\n");
5988#endif
e1a9cb8e 5989
25dbc73a 5990 /* Mark some specially defined symbols as absolute. */
3b36f7e6
AM
5991 if (h == htab->elf.hgot
5992 || strcmp (h->root.root.string, "_DYNAMIC") == 0
25dbc73a
AM
5993 || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0)
5994 sym->st_shndx = SHN_ABS;
e1a9cb8e 5995
25dbc73a
AM
5996 return TRUE;
5997}
5998\f
5999static enum elf_reloc_type_class
6000ppc_elf_reloc_type_class (const Elf_Internal_Rela *rela)
e1a9cb8e 6001{
25dbc73a
AM
6002 switch (ELF32_R_TYPE (rela->r_info))
6003 {
6004 case R_PPC_RELATIVE:
6005 return reloc_class_relative;
6006 case R_PPC_REL24:
6007 case R_PPC_ADDR24:
6008 case R_PPC_JMP_SLOT:
6009 return reloc_class_plt;
6010 case R_PPC_COPY:
6011 return reloc_class_copy;
6012 default:
6013 return reloc_class_normal;
6014 }
e1a9cb8e 6015}
25dbc73a
AM
6016\f
6017/* Finish up the dynamic sections. */
e1a9cb8e 6018
25dbc73a
AM
6019static bfd_boolean
6020ppc_elf_finish_dynamic_sections (bfd *output_bfd,
6021 struct bfd_link_info *info)
e1a9cb8e 6022{
25dbc73a
AM
6023 asection *sdyn;
6024 struct ppc_elf_link_hash_table *htab;
e1a9cb8e 6025
25dbc73a
AM
6026#ifdef DEBUG
6027 fprintf (stderr, "ppc_elf_finish_dynamic_sections called\n");
6028#endif
6b0817e5 6029
25dbc73a
AM
6030 htab = ppc_elf_hash_table (info);
6031 sdyn = bfd_get_section_by_name (htab->elf.dynobj, ".dynamic");
e1a9cb8e 6032
25dbc73a 6033 if (htab->elf.dynamic_sections_created)
e1a9cb8e 6034 {
25dbc73a 6035 Elf32_External_Dyn *dyncon, *dynconend;
e1a9cb8e 6036
25dbc73a 6037 BFD_ASSERT (htab->plt != NULL && sdyn != NULL);
86bbe32f 6038
25dbc73a
AM
6039 dyncon = (Elf32_External_Dyn *) sdyn->contents;
6040 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
6041 for (; dyncon < dynconend; dyncon++)
6042 {
6043 Elf_Internal_Dyn dyn;
6044 asection *s;
e1a9cb8e 6045
25dbc73a 6046 bfd_elf32_swap_dyn_in (htab->elf.dynobj, dyncon, &dyn);
86bbe32f 6047
25dbc73a
AM
6048 switch (dyn.d_tag)
6049 {
6050 case DT_PLTGOT:
6051 s = htab->plt;
6052 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
6053 break;
86bbe32f 6054
25dbc73a
AM
6055 case DT_PLTRELSZ:
6056 dyn.d_un.d_val = htab->relplt->size;
6057 break;
e1a9cb8e 6058
25dbc73a
AM
6059 case DT_JMPREL:
6060 s = htab->relplt;
6061 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
6062 break;
2f89ff8d 6063
25dbc73a
AM
6064 default:
6065 continue;
6066 }
4c45e5c9 6067
25dbc73a
AM
6068 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
6069 }
6070 }
4c45e5c9 6071
25dbc73a
AM
6072 /* Add a blrl instruction at _GLOBAL_OFFSET_TABLE_-4 so that a function can
6073 easily find the address of the _GLOBAL_OFFSET_TABLE_. */
3b36f7e6 6074 if (htab->got != NULL)
25dbc73a 6075 {
3b36f7e6
AM
6076 unsigned char *p = htab->got->contents;
6077 bfd_vma val;
2f89ff8d 6078
3b36f7e6
AM
6079 p += elf_hash_table (info)->hgot->root.u.def.value;
6080 bfd_put_32 (output_bfd, 0x4e800021 /* blrl */, p - 4);
6081
6082 val = 0;
6083 if (sdyn != NULL)
6084 val = sdyn->output_section->vma + sdyn->output_offset;
6085 bfd_put_32 (output_bfd, val, p);
25dbc73a
AM
6086
6087 elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 4;
6088 }
6089
6090 return TRUE;
6091}
e1a9cb8e 6092\f
252b5132
RH
6093#define TARGET_LITTLE_SYM bfd_elf32_powerpcle_vec
6094#define TARGET_LITTLE_NAME "elf32-powerpcle"
6095#define TARGET_BIG_SYM bfd_elf32_powerpc_vec
6096#define TARGET_BIG_NAME "elf32-powerpc"
6097#define ELF_ARCH bfd_arch_powerpc
6098#define ELF_MACHINE_CODE EM_PPC
d0facd1b
NC
6099#ifdef __QNXTARGET__
6100#define ELF_MAXPAGESIZE 0x1000
6101#else
252b5132 6102#define ELF_MAXPAGESIZE 0x10000
d0facd1b 6103#endif
b1342370 6104#define ELF_MINPAGESIZE 0x1000
252b5132
RH
6105#define elf_info_to_howto ppc_elf_info_to_howto
6106
6107#ifdef EM_CYGNUS_POWERPC
6108#define ELF_MACHINE_ALT1 EM_CYGNUS_POWERPC
6109#endif
6110
6111#ifdef EM_PPC_OLD
6112#define ELF_MACHINE_ALT2 EM_PPC_OLD
6113#endif
6114
6115#define elf_backend_plt_not_loaded 1
252b5132 6116#define elf_backend_can_gc_sections 1
51b64d56 6117#define elf_backend_can_refcount 1
b491616a 6118#define elf_backend_rela_normal 1
252b5132 6119
43c40ab2 6120#define bfd_elf32_mkobject ppc_elf_mkobject
252b5132 6121#define bfd_elf32_bfd_merge_private_bfd_data ppc_elf_merge_private_bfd_data
70bccea4 6122#define bfd_elf32_bfd_relax_section ppc_elf_relax_section
252b5132
RH
6123#define bfd_elf32_bfd_reloc_type_lookup ppc_elf_reloc_type_lookup
6124#define bfd_elf32_bfd_set_private_flags ppc_elf_set_private_flags
70bccea4 6125#define bfd_elf32_bfd_link_hash_table_create ppc_elf_link_hash_table_create
252b5132 6126
feee612b 6127#define elf_backend_object_p ppc_elf_object_p
252b5132
RH
6128#define elf_backend_gc_mark_hook ppc_elf_gc_mark_hook
6129#define elf_backend_gc_sweep_hook ppc_elf_gc_sweep_hook
6130#define elf_backend_section_from_shdr ppc_elf_section_from_shdr
6131#define elf_backend_relocate_section ppc_elf_relocate_section
6132#define elf_backend_create_dynamic_sections ppc_elf_create_dynamic_sections
6133#define elf_backend_check_relocs ppc_elf_check_relocs
7fce784e 6134#define elf_backend_copy_indirect_symbol ppc_elf_copy_indirect_symbol
252b5132
RH
6135#define elf_backend_adjust_dynamic_symbol ppc_elf_adjust_dynamic_symbol
6136#define elf_backend_add_symbol_hook ppc_elf_add_symbol_hook
6137#define elf_backend_size_dynamic_sections ppc_elf_size_dynamic_sections
6138#define elf_backend_finish_dynamic_symbol ppc_elf_finish_dynamic_symbol
6139#define elf_backend_finish_dynamic_sections ppc_elf_finish_dynamic_sections
6140#define elf_backend_fake_sections ppc_elf_fake_sections
6141#define elf_backend_additional_program_headers ppc_elf_additional_program_headers
c5fccbec
DJ
6142#define elf_backend_grok_prstatus ppc_elf_grok_prstatus
6143#define elf_backend_grok_psinfo ppc_elf_grok_psinfo
29c2fb7c 6144#define elf_backend_reloc_type_class ppc_elf_reloc_type_class
70bccea4
AM
6145#define elf_backend_begin_write_processing ppc_elf_begin_write_processing
6146#define elf_backend_final_write_processing ppc_elf_final_write_processing
6147#define elf_backend_write_section ppc_elf_write_section
2f89ff8d 6148#define elf_backend_special_sections ppc_elf_special_sections
4c45e5c9 6149#define elf_backend_plt_sym_val ppc_elf_plt_sym_val
252b5132
RH
6150
6151#include "elf32-target.h"