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