Coverage Report

Created: 2026-03-10 08:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/binutils-gdb/bfd/elf32-ppc.c
Line
Count
Source
1
/* PowerPC-specific support for 32-bit ELF
2
   Copyright (C) 1994-2026 Free Software Foundation, Inc.
3
   Written by Ian Lance Taylor, Cygnus Support.
4
5
   This file is part of BFD, the Binary File Descriptor library.
6
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
12
   This program is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
17
   You should have received a copy of the GNU General Public License
18
   along with this program; if not, write to the
19
   Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
20
   Boston, MA 02110-1301, USA.  */
21
22
/* The assembler should generate a full set of section symbols even
23
   when they appear unused.  The linux kernel build tool recordmcount
24
   needs them.  */
25
#define TARGET_KEEP_UNUSED_SECTION_SYMBOLS true
26
27
#include "sysdep.h"
28
#include <stdarg.h>
29
#include "bfd.h"
30
#include "bfdlink.h"
31
#include "libbfd.h"
32
#include "elf-bfd.h"
33
#include "elf/ppc.h"
34
#include "elf32-ppc.h"
35
#include "elf-vxworks.h"
36
#include "dwarf2.h"
37
#include "opcode/ppc.h"
38
39
/* All users of this file have bfd_octets_per_byte (abfd, sec) == 1.  */
40
0
#define OCTETS_PER_BYTE(ABFD, SEC) 1
41
42
typedef enum split16_format_type
43
{
44
  split16a_type = 0,
45
  split16d_type
46
}
47
split16_format_type;
48
49
/* RELA relocations are used here.  */
50
51
static bfd_reloc_status_type ppc_elf_addr16_ha_reloc
52
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
53
static bfd_reloc_status_type ppc_elf_unhandled_reloc
54
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
55
56
#ifndef ARRAY_SIZE
57
563
#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
58
#endif
59
60
/* Branch prediction bit for branch taken relocs.  */
61
0
#define BRANCH_PREDICT_BIT 0x200000
62
/* Mask to set RA in memory instructions.  */
63
0
#define RA_REGISTER_MASK 0x001f0000
64
/* Value to shift register by to insert RA.  */
65
0
#define RA_REGISTER_SHIFT 16
66
67
/* The name of the dynamic interpreter.  This is put in the .interp
68
   section.  */
69
0
#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
70
71
/* For old-style PLT.  */
72
/* The number of single-slot PLT entries (the rest use two slots).  */
73
0
#define PLT_NUM_SINGLE_ENTRIES 8192
74
75
/* For new-style .glink and .plt.  */
76
0
#define GLINK_PLTRESOLVE 16*4
77
#define GLINK_ENTRY_SIZE(htab, h)         \
78
0
  ((4*4                 \
79
0
    + (h != NULL              \
80
0
       && h == htab->tls_get_addr          \
81
0
       && !htab->params->no_tls_get_addr_opt ? 8*4 : 0)     \
82
0
    + (1u << htab->params->plt_stub_align) - 1)       \
83
0
   & -(1u << htab->params->plt_stub_align))
84
85
/* VxWorks uses its own plt layout, filled in by the static linker.  */
86
87
/* The standard VxWorks PLT entry.  */
88
0
#define VXWORKS_PLT_ENTRY_SIZE 32
89
static const bfd_vma ppc_elf_vxworks_plt_entry
90
    [VXWORKS_PLT_ENTRY_SIZE / 4] =
91
  {
92
    0x3d800000, /* lis     r12,0     */
93
    0x818c0000, /* lwz     r12,0(r12)    */
94
    0x7d8903a6, /* mtctr   r12       */
95
    0x4e800420, /* bctr        */
96
    0x39600000, /* li    r11,0     */
97
    0x48000000, /* b     14 <.PLT0resolve+0x4> */
98
    0x60000000, /* nop         */
99
    0x60000000, /* nop         */
100
  };
101
static const bfd_vma ppc_elf_vxworks_pic_plt_entry
102
    [VXWORKS_PLT_ENTRY_SIZE / 4] =
103
  {
104
    0x3d9e0000, /* addis r12,r30,0 */
105
    0x818c0000, /* lwz   r12,0(r12) */
106
    0x7d8903a6, /* mtctr r12 */
107
    0x4e800420, /* bctr */
108
    0x39600000, /* li  r11,0 */
109
    0x48000000, /* b   14 <.PLT0resolve+0x4> 14: R_PPC_REL24 .PLTresolve */
110
    0x60000000, /* nop */
111
    0x60000000, /* nop */
112
  };
113
114
/* The initial VxWorks PLT entry.  */
115
0
#define VXWORKS_PLT_INITIAL_ENTRY_SIZE 32
116
static const bfd_vma ppc_elf_vxworks_plt0_entry
117
    [VXWORKS_PLT_INITIAL_ENTRY_SIZE / 4] =
118
  {
119
    0x3d800000, /* lis     r12,0  */
120
    0x398c0000, /* addi    r12,r12,0  */
121
    0x800c0008, /* lwz     r0,8(r12)  */
122
    0x7c0903a6, /* mtctr   r0   */
123
    0x818c0004, /* lwz     r12,4(r12) */
124
    0x4e800420, /* bctr     */
125
    0x60000000, /* nop      */
126
    0x60000000, /* nop      */
127
  };
128
static const bfd_vma ppc_elf_vxworks_pic_plt0_entry
129
    [VXWORKS_PLT_INITIAL_ENTRY_SIZE / 4] =
130
  {
131
    0x819e0008, /* lwz   r12,8(r30) */
132
    0x7d8903a6, /* mtctr r12      */
133
    0x819e0004, /* lwz   r12,4(r30) */
134
    0x4e800420, /* bctr       */
135
    0x60000000, /* nop        */
136
    0x60000000, /* nop        */
137
    0x60000000, /* nop        */
138
    0x60000000, /* nop        */
139
  };
140
141
/* For executables, we have some additional relocations in
142
   .rela.plt.unloaded, for the kernel loader.  */
143
144
/* The number of non-JMP_SLOT relocations per PLT0 slot. */
145
0
#define VXWORKS_PLT_NON_JMP_SLOT_RELOCS 3
146
/* The number of relocations in the PLTResolve slot. */
147
0
#define VXWORKS_PLTRESOLVE_RELOCS 2
148
/* The number of relocations in the PLTResolve slot when creating
149
   a shared library. */
150
#define VXWORKS_PLTRESOLVE_RELOCS_SHLIB 0
151
152
/* Some instructions.  */
153
#define ADDIS_11_11 0x3d6b0000
154
#define ADDIS_11_30 0x3d7e0000
155
#define ADDIS_12_12 0x3d8c0000
156
#define ADDI_11_11  0x396b0000
157
#define ADD_0_11_11 0x7c0b5a14
158
#define ADD_3_12_2  0x7c6c1214
159
#define ADD_11_0_11 0x7d605a14
160
0
#define B   0x48000000
161
#define BA    0x48000002
162
#define BCL_20_31 0x429f0005
163
0
#define BCTR    0x4e800420
164
#define BEQLR   0x4d820020
165
#define CMPWI_11_0  0x2c0b0000
166
0
#define LIS_11    0x3d600000
167
#define LIS_12    0x3d800000
168
#define LWZU_0_12 0x840c0000
169
#define LWZ_0_12  0x800c0000
170
#define LWZ_11_3  0x81630000
171
0
#define LWZ_11_11 0x816b0000
172
#define LWZ_11_30 0x817e0000
173
#define LWZ_12_3  0x81830000
174
#define LWZ_12_12 0x818c0000
175
#define MR_0_3    0x7c601b78
176
#define MR_3_0    0x7c030378
177
#define MFLR_0    0x7c0802a6
178
#define MFLR_12   0x7d8802a6
179
#define MTCTR_0   0x7c0903a6
180
0
#define MTCTR_11  0x7d6903a6
181
#define MTLR_0    0x7c0803a6
182
0
#define NOP   0x60000000
183
#define SUB_11_11_12  0x7d6c5850
184
185
/* Offset of tp and dtp pointers from start of TLS block.  */
186
0
#define TP_OFFSET 0x7000
187
0
#define DTP_OFFSET  0x8000
188
189
/* The value of a defined global symbol.  */
190
#define SYM_VAL(SYM) \
191
0
  ((SYM)->root.u.def.section->output_section->vma \
192
0
   + (SYM)->root.u.def.section->output_offset   \
193
0
   + (SYM)->root.u.def.value)
194

195
/* Relocation HOWTO's.  */
196
/* Like other ELF RELA targets that don't apply multiple
197
   field-altering relocations to the same localation, src_mask is
198
   always zero and pcrel_offset is the same as pc_relative.
199
   PowerPC can always use a zero bitpos, even when the field is not at
200
   the LSB.  For example, a REL24 could use rightshift=2, bisize=24
201
   and bitpos=2 which matches the ABI description, or as we do here,
202
   rightshift=0, bitsize=26 and bitpos=0.  */
203
#define HOW(type, size, bitsize, mask, rightshift, pc_relative, \
204
      complain, special_func)       \
205
  HOWTO (type, rightshift, size, bitsize, pc_relative, 0, \
206
   complain_overflow_ ## complain, special_func,    \
207
   #type, false, 0, mask, pc_relative)
208
209
static reloc_howto_type *ppc_elf_howto_table[R_PPC_max];
210
211
static reloc_howto_type ppc_elf_howto_raw[] = {
212
  /* This reloc does nothing.  */
213
  HOW (R_PPC_NONE, 0, 0, 0, 0, false, dont,
214
       bfd_elf_generic_reloc),
215
216
  /* A standard 32 bit relocation.  */
217
  HOW (R_PPC_ADDR32, 4, 32, 0xffffffff, 0, false, dont,
218
       bfd_elf_generic_reloc),
219
220
  /* An absolute 26 bit branch; the lower two bits must be zero.
221
     FIXME: we don't check that, we just clear them.  */
222
  HOW (R_PPC_ADDR24, 4, 26, 0x3fffffc, 0, false, signed,
223
       bfd_elf_generic_reloc),
224
225
  /* A standard 16 bit relocation.  */
226
  HOW (R_PPC_ADDR16, 2, 16, 0xffff, 0, false, bitfield,
227
       bfd_elf_generic_reloc),
228
229
  /* A 16 bit relocation without overflow.  */
230
  HOW (R_PPC_ADDR16_LO, 2, 16, 0xffff, 0, false, dont,
231
       bfd_elf_generic_reloc),
232
233
  /* The high order 16 bits of an address.  */
234
  HOW (R_PPC_ADDR16_HI, 2, 16, 0xffff, 16, false, dont,
235
       bfd_elf_generic_reloc),
236
237
  /* The high order 16 bits of an address, plus 1 if the contents of
238
     the low 16 bits, treated as a signed number, is negative.  */
239
  HOW (R_PPC_ADDR16_HA, 2, 16, 0xffff, 16, false, dont,
240
       ppc_elf_addr16_ha_reloc),
241
242
  /* An absolute 16 bit branch; the lower two bits must be zero.
243
     FIXME: we don't check that, we just clear them.  */
244
  HOW (R_PPC_ADDR14, 4, 16, 0xfffc, 0, false, signed,
245
       bfd_elf_generic_reloc),
246
247
  /* An absolute 16 bit branch, for which bit 10 should be set to
248
     indicate that the branch is expected to be taken.  The lower two
249
     bits must be zero.  */
250
  HOW (R_PPC_ADDR14_BRTAKEN, 4, 16, 0xfffc, 0, false, signed,
251
       bfd_elf_generic_reloc),
252
253
  /* An absolute 16 bit branch, for which bit 10 should be set to
254
     indicate that the branch is not expected to be taken.  The lower
255
     two bits must be zero.  */
256
  HOW (R_PPC_ADDR14_BRNTAKEN, 4, 16, 0xfffc, 0, false, signed,
257
       bfd_elf_generic_reloc),
258
259
  /* A relative 26 bit branch; the lower two bits must be zero.  */
260
  HOW (R_PPC_REL24, 4, 26, 0x3fffffc, 0, true, signed,
261
       bfd_elf_generic_reloc),
262
263
  /* A relative 16 bit branch; the lower two bits must be zero.  */
264
  HOW (R_PPC_REL14, 4, 16, 0xfffc, 0, true, signed,
265
       bfd_elf_generic_reloc),
266
267
  /* A relative 16 bit branch.  Bit 10 should be set to indicate that
268
     the branch is expected to be taken.  The lower two bits must be
269
     zero.  */
270
  HOW (R_PPC_REL14_BRTAKEN, 4, 16, 0xfffc, 0, true, signed,
271
       bfd_elf_generic_reloc),
272
273
  /* A relative 16 bit branch.  Bit 10 should be set to indicate that
274
     the branch is not expected to be taken.  The lower two bits must
275
     be zero.  */
276
  HOW (R_PPC_REL14_BRNTAKEN, 4, 16, 0xfffc, 0, true, signed,
277
       bfd_elf_generic_reloc),
278
279
  /* Like R_PPC_ADDR16, but referring to the GOT table entry for the
280
     symbol.  */
281
  HOW (R_PPC_GOT16, 2, 16, 0xffff, 0, false, signed,
282
       ppc_elf_unhandled_reloc),
283
284
  /* Like R_PPC_ADDR16_LO, but referring to the GOT table entry for
285
     the symbol.  */
286
  HOW (R_PPC_GOT16_LO, 2, 16, 0xffff, 0, false, dont,
287
       ppc_elf_unhandled_reloc),
288
289
  /* Like R_PPC_ADDR16_HI, but referring to the GOT table entry for
290
     the symbol.  */
291
  HOW (R_PPC_GOT16_HI, 2, 16, 0xffff, 16, false, dont,
292
       ppc_elf_unhandled_reloc),
293
294
  /* Like R_PPC_ADDR16_HA, but referring to the GOT table entry for
295
     the symbol.  */
296
  HOW (R_PPC_GOT16_HA, 2, 16, 0xffff, 16, false, dont,
297
       ppc_elf_unhandled_reloc),
298
299
  /* Like R_PPC_REL24, but referring to the procedure linkage table
300
     entry for the symbol.  */
301
  HOW (R_PPC_PLTREL24, 4, 26, 0x3fffffc, 0, true, signed,
302
       ppc_elf_unhandled_reloc),
303
304
  /* This is used only by the dynamic linker.  The symbol should exist
305
     both in the object being run and in some shared library.  The
306
     dynamic linker copies the data addressed by the symbol from the
307
     shared library into the object, because the object being
308
     run has to have the data at some particular address.  */
309
  HOW (R_PPC_COPY, 4, 32, 0, 0, false, dont,
310
       ppc_elf_unhandled_reloc),
311
312
  /* Like R_PPC_ADDR32, but used when setting global offset table
313
     entries.  */
314
  HOW (R_PPC_GLOB_DAT, 4, 32, 0xffffffff, 0, false, dont,
315
       ppc_elf_unhandled_reloc),
316
317
  /* Marks a procedure linkage table entry for a symbol.  */
318
  HOW (R_PPC_JMP_SLOT, 4, 32, 0, 0, false, dont,
319
       ppc_elf_unhandled_reloc),
320
321
  /* Used only by the dynamic linker.  When the object is run, this
322
     longword is set to the load address of the object, plus the
323
     addend.  */
324
  HOW (R_PPC_RELATIVE, 4, 32, 0xffffffff, 0, false, dont,
325
       bfd_elf_generic_reloc),
326
327
  /* Like R_PPC_REL24, but uses the value of the symbol within the
328
     object rather than the final value.  Normally used for
329
     _GLOBAL_OFFSET_TABLE_.  */
330
  HOW (R_PPC_LOCAL24PC, 4, 26, 0x3fffffc, 0, true, signed,
331
       bfd_elf_generic_reloc),
332
333
  /* Like R_PPC_ADDR32, but may be unaligned.  */
334
  HOW (R_PPC_UADDR32, 4, 32, 0xffffffff, 0, false, dont,
335
       bfd_elf_generic_reloc),
336
337
  /* Like R_PPC_ADDR16, but may be unaligned.  */
338
  HOW (R_PPC_UADDR16, 2, 16, 0xffff, 0, false, bitfield,
339
       bfd_elf_generic_reloc),
340
341
  /* 32-bit PC relative */
342
  HOW (R_PPC_REL32, 4, 32, 0xffffffff, 0, true, dont,
343
       bfd_elf_generic_reloc),
344
345
  /* 32-bit relocation to the symbol's procedure linkage table.
346
     FIXME: not supported.  */
347
  HOW (R_PPC_PLT32, 4, 32, 0, 0, false, dont,
348
       ppc_elf_unhandled_reloc),
349
350
  /* 32-bit PC relative relocation to the symbol's procedure linkage table.
351
     FIXME: not supported.  */
352
  HOW (R_PPC_PLTREL32, 4, 32, 0, 0, true, dont,
353
       ppc_elf_unhandled_reloc),
354
355
  /* Like R_PPC_ADDR16_LO, but referring to the PLT table entry for
356
     the symbol.  */
357
  HOW (R_PPC_PLT16_LO, 2, 16, 0xffff, 0, false, dont,
358
       ppc_elf_unhandled_reloc),
359
360
  /* Like R_PPC_ADDR16_HI, but referring to the PLT table entry for
361
     the symbol.  */
362
  HOW (R_PPC_PLT16_HI, 2, 16, 0xffff, 16, false, dont,
363
       ppc_elf_unhandled_reloc),
364
365
  /* Like R_PPC_ADDR16_HA, but referring to the PLT table entry for
366
     the symbol.  */
367
  HOW (R_PPC_PLT16_HA, 2, 16, 0xffff, 16, false, dont,
368
       ppc_elf_unhandled_reloc),
369
370
  /* A sign-extended 16 bit value relative to _SDA_BASE_, for use with
371
     small data items.  */
372
  HOW (R_PPC_SDAREL16, 2, 16, 0xffff, 0, false, signed,
373
       ppc_elf_unhandled_reloc),
374
375
  /* 16-bit section relative relocation.  */
376
  HOW (R_PPC_SECTOFF, 2, 16, 0xffff, 0, false, signed,
377
       ppc_elf_unhandled_reloc),
378
379
  /* 16-bit lower half section relative relocation.  */
380
  HOW (R_PPC_SECTOFF_LO, 2, 16, 0xffff, 0, false, dont,
381
       ppc_elf_unhandled_reloc),
382
383
  /* 16-bit upper half section relative relocation.  */
384
  HOW (R_PPC_SECTOFF_HI, 2, 16, 0xffff, 16, false, dont,
385
       ppc_elf_unhandled_reloc),
386
387
  /* 16-bit upper half adjusted section relative relocation.  */
388
  HOW (R_PPC_SECTOFF_HA, 2, 16, 0xffff, 16, false, dont,
389
       ppc_elf_unhandled_reloc),
390
391
  /* Marker relocs for TLS.  */
392
  HOW (R_PPC_TLS, 4, 32, 0, 0, false, dont,
393
       bfd_elf_generic_reloc),
394
395
  HOW (R_PPC_TLSGD, 4, 32, 0, 0, false, dont,
396
       bfd_elf_generic_reloc),
397
398
  HOW (R_PPC_TLSLD, 4, 32, 0, 0, false, dont,
399
       bfd_elf_generic_reloc),
400
401
  /* Marker relocs on inline plt call instructions.  */
402
  HOW (R_PPC_PLTSEQ, 4, 32, 0, 0, false, dont,
403
       bfd_elf_generic_reloc),
404
405
  HOW (R_PPC_PLTCALL, 4, 32, 0, 0, false, dont,
406
       bfd_elf_generic_reloc),
407
408
  /* Computes the load module index of the load module that contains the
409
     definition of its TLS sym.  */
410
  HOW (R_PPC_DTPMOD32, 4, 32, 0xffffffff, 0, false, dont,
411
       ppc_elf_unhandled_reloc),
412
413
  /* Computes a dtv-relative displacement, the difference between the value
414
     of sym+add and the base address of the thread-local storage block that
415
     contains the definition of sym, minus 0x8000.  */
416
  HOW (R_PPC_DTPREL32, 4, 32, 0xffffffff, 0, false, dont,
417
       ppc_elf_unhandled_reloc),
418
419
  /* A 16 bit dtprel reloc.  */
420
  HOW (R_PPC_DTPREL16, 2, 16, 0xffff, 0, false, signed,
421
       ppc_elf_unhandled_reloc),
422
423
  /* Like DTPREL16, but no overflow.  */
424
  HOW (R_PPC_DTPREL16_LO, 2, 16, 0xffff, 0, false, dont,
425
       ppc_elf_unhandled_reloc),
426
427
  /* Like DTPREL16_LO, but next higher group of 16 bits.  */
428
  HOW (R_PPC_DTPREL16_HI, 2, 16, 0xffff, 16, false, dont,
429
       ppc_elf_unhandled_reloc),
430
431
  /* Like DTPREL16_HI, but adjust for low 16 bits.  */
432
  HOW (R_PPC_DTPREL16_HA, 2, 16, 0xffff, 16, false, dont,
433
       ppc_elf_unhandled_reloc),
434
435
  /* Computes a tp-relative displacement, the difference between the value of
436
     sym+add and the value of the thread pointer (r13).  */
437
  HOW (R_PPC_TPREL32, 4, 32, 0xffffffff, 0, false, dont,
438
       ppc_elf_unhandled_reloc),
439
440
  /* A 16 bit tprel reloc.  */
441
  HOW (R_PPC_TPREL16, 2, 16, 0xffff, 0, false, signed,
442
       ppc_elf_unhandled_reloc),
443
444
  /* Like TPREL16, but no overflow.  */
445
  HOW (R_PPC_TPREL16_LO, 2, 16, 0xffff, 0, false, dont,
446
       ppc_elf_unhandled_reloc),
447
448
  /* Like TPREL16_LO, but next higher group of 16 bits.  */
449
  HOW (R_PPC_TPREL16_HI, 2, 16, 0xffff, 16, false, dont,
450
       ppc_elf_unhandled_reloc),
451
452
  /* Like TPREL16_HI, but adjust for low 16 bits.  */
453
  HOW (R_PPC_TPREL16_HA, 2, 16, 0xffff, 16, false, dont,
454
       ppc_elf_unhandled_reloc),
455
456
  /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
457
     with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
458
     to the first entry.  */
459
  HOW (R_PPC_GOT_TLSGD16, 2, 16, 0xffff, 0, false, signed,
460
       ppc_elf_unhandled_reloc),
461
462
  /* Like GOT_TLSGD16, but no overflow.  */
463
  HOW (R_PPC_GOT_TLSGD16_LO, 2, 16, 0xffff, 0, false, dont,
464
       ppc_elf_unhandled_reloc),
465
466
  /* Like GOT_TLSGD16_LO, but next higher group of 16 bits.  */
467
  HOW (R_PPC_GOT_TLSGD16_HI, 2, 16, 0xffff, 16, false, dont,
468
       ppc_elf_unhandled_reloc),
469
470
  /* Like GOT_TLSGD16_HI, but adjust for low 16 bits.  */
471
  HOW (R_PPC_GOT_TLSGD16_HA, 2, 16, 0xffff, 16, false, dont,
472
       ppc_elf_unhandled_reloc),
473
474
  /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
475
     with values (sym+add)@dtpmod and zero, and computes the offset to the
476
     first entry.  */
477
  HOW (R_PPC_GOT_TLSLD16, 2, 16, 0xffff, 0, false, signed,
478
       ppc_elf_unhandled_reloc),
479
480
  /* Like GOT_TLSLD16, but no overflow.  */
481
  HOW (R_PPC_GOT_TLSLD16_LO, 2, 16, 0xffff, 0, false, dont,
482
       ppc_elf_unhandled_reloc),
483
484
  /* Like GOT_TLSLD16_LO, but next higher group of 16 bits.  */
485
  HOW (R_PPC_GOT_TLSLD16_HI, 2, 16, 0xffff, 16, false, dont,
486
       ppc_elf_unhandled_reloc),
487
488
  /* Like GOT_TLSLD16_HI, but adjust for low 16 bits.  */
489
  HOW (R_PPC_GOT_TLSLD16_HA, 2, 16, 0xffff, 16, false, dont,
490
       ppc_elf_unhandled_reloc),
491
492
  /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
493
     the offset to the entry.  */
494
  HOW (R_PPC_GOT_DTPREL16, 2, 16, 0xffff, 0, false, signed,
495
       ppc_elf_unhandled_reloc),
496
497
  /* Like GOT_DTPREL16, but no overflow.  */
498
  HOW (R_PPC_GOT_DTPREL16_LO, 2, 16, 0xffff, 0, false, dont,
499
       ppc_elf_unhandled_reloc),
500
501
  /* Like GOT_DTPREL16_LO, but next higher group of 16 bits.  */
502
  HOW (R_PPC_GOT_DTPREL16_HI, 2, 16, 0xffff, 16, false, dont,
503
       ppc_elf_unhandled_reloc),
504
505
  /* Like GOT_DTPREL16_HI, but adjust for low 16 bits.  */
506
  HOW (R_PPC_GOT_DTPREL16_HA, 2, 16, 0xffff, 16, false, dont,
507
       ppc_elf_unhandled_reloc),
508
509
  /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
510
     offset to the entry.  */
511
  HOW (R_PPC_GOT_TPREL16, 2, 16, 0xffff, 0, false, signed,
512
       ppc_elf_unhandled_reloc),
513
514
  /* Like GOT_TPREL16, but no overflow.  */
515
  HOW (R_PPC_GOT_TPREL16_LO, 2, 16, 0xffff, 0, false, dont,
516
       ppc_elf_unhandled_reloc),
517
518
  /* Like GOT_TPREL16_LO, but next higher group of 16 bits.  */
519
  HOW (R_PPC_GOT_TPREL16_HI, 2, 16, 0xffff, 16, false, dont,
520
       ppc_elf_unhandled_reloc),
521
522
  /* Like GOT_TPREL16_HI, but adjust for low 16 bits.  */
523
  HOW (R_PPC_GOT_TPREL16_HA, 2, 16, 0xffff, 16, false, dont,
524
       ppc_elf_unhandled_reloc),
525
526
  /* The remaining relocs are from the Embedded ELF ABI, and are not
527
     in the SVR4 ELF ABI.  */
528
529
  /* 32 bit value resulting from the addend minus the symbol.  */
530
  HOW (R_PPC_EMB_NADDR32, 4, 32, 0xffffffff, 0, false, dont,
531
       ppc_elf_unhandled_reloc),
532
533
  /* 16 bit value resulting from the addend minus the symbol.  */
534
  HOW (R_PPC_EMB_NADDR16, 2, 16, 0xffff, 0, false, signed,
535
       ppc_elf_unhandled_reloc),
536
537
  /* 16 bit value resulting from the addend minus the symbol.  */
538
  HOW (R_PPC_EMB_NADDR16_LO, 2, 16, 0xffff, 0, false, dont,
539
       ppc_elf_unhandled_reloc),
540
541
  /* The high order 16 bits of the addend minus the symbol.  */
542
  HOW (R_PPC_EMB_NADDR16_HI, 2, 16, 0xffff, 16, false, dont,
543
       ppc_elf_unhandled_reloc),
544
545
  /* The high order 16 bits of the result of the addend minus the address,
546
     plus 1 if the contents of the low 16 bits, treated as a signed number,
547
     is negative.  */
548
  HOW (R_PPC_EMB_NADDR16_HA, 2, 16, 0xffff, 16, false, dont,
549
       ppc_elf_unhandled_reloc),
550
551
  /* 16 bit value resulting from allocating a 4 byte word to hold an
552
     address in the .sdata section, and returning the offset from
553
     _SDA_BASE_ for that relocation.  */
554
  HOW (R_PPC_EMB_SDAI16, 2, 16, 0xffff, 0, false, signed,
555
       ppc_elf_unhandled_reloc),
556
557
  /* 16 bit value resulting from allocating a 4 byte word to hold an
558
     address in the .sdata2 section, and returning the offset from
559
     _SDA2_BASE_ for that relocation.  */
560
  HOW (R_PPC_EMB_SDA2I16, 2, 16, 0xffff, 0, false, signed,
561
       ppc_elf_unhandled_reloc),
562
563
  /* A sign-extended 16 bit value relative to _SDA2_BASE_, for use with
564
     small data items.   */
565
  HOW (R_PPC_EMB_SDA2REL, 2, 16, 0xffff, 0, false, signed,
566
       ppc_elf_unhandled_reloc),
567
568
  /* Relocate against either _SDA_BASE_ or _SDA2_BASE_, filling in the 16 bit
569
     signed offset from the appropriate base, and filling in the register
570
     field with the appropriate register (0, 2, or 13).  */
571
  HOW (R_PPC_EMB_SDA21, 4, 16, 0xffff, 0, false, signed,
572
       ppc_elf_unhandled_reloc),
573
574
  /* Relocation not handled: R_PPC_EMB_MRKREF */
575
  /* Relocation not handled: R_PPC_EMB_RELSEC16 */
576
  /* Relocation not handled: R_PPC_EMB_RELST_LO */
577
  /* Relocation not handled: R_PPC_EMB_RELST_HI */
578
  /* Relocation not handled: R_PPC_EMB_RELST_HA */
579
  /* Relocation not handled: R_PPC_EMB_BIT_FLD */
580
581
  /* PC relative relocation against either _SDA_BASE_ or _SDA2_BASE_, filling
582
     in the 16 bit signed offset from the appropriate base, and filling in the
583
     register field with the appropriate register (0, 2, or 13).  */
584
  HOW (R_PPC_EMB_RELSDA, 2, 16, 0xffff, 0, false, signed,
585
       ppc_elf_unhandled_reloc),
586
587
  /* A relative 8 bit branch.  */
588
  HOW (R_PPC_VLE_REL8, 2, 8, 0xff, 1, true, signed,
589
       bfd_elf_generic_reloc),
590
591
  /* A relative 15 bit branch.  */
592
  HOW (R_PPC_VLE_REL15, 4, 16, 0xfffe, 0, true, signed,
593
       bfd_elf_generic_reloc),
594
595
  /* A relative 24 bit branch.  */
596
  HOW (R_PPC_VLE_REL24, 4, 25, 0x1fffffe, 0, true, signed,
597
       bfd_elf_generic_reloc),
598
599
  /* The 16 LSBS in split16a format.  */
600
  HOW (R_PPC_VLE_LO16A, 4, 16, 0x1f07ff, 0, false, dont,
601
       ppc_elf_unhandled_reloc),
602
603
  /* The 16 LSBS in split16d format.  */
604
  HOW (R_PPC_VLE_LO16D, 4, 16, 0x3e007ff, 0, false, dont,
605
       ppc_elf_unhandled_reloc),
606
607
  /* Bits 16-31 split16a format.  */
608
  HOW (R_PPC_VLE_HI16A, 4, 16, 0x1f07ff, 16, false, dont,
609
       ppc_elf_unhandled_reloc),
610
611
  /* Bits 16-31 split16d format.  */
612
  HOW (R_PPC_VLE_HI16D, 4, 16, 0x3e007ff, 16, false, dont,
613
       ppc_elf_unhandled_reloc),
614
615
  /* Bits 16-31 (High Adjusted) in split16a format.  */
616
  HOW (R_PPC_VLE_HA16A, 4, 16, 0x1f07ff, 16, false, dont,
617
       ppc_elf_unhandled_reloc),
618
619
  /* Bits 16-31 (High Adjusted) in split16d format.  */
620
  HOW (R_PPC_VLE_HA16D, 4, 16, 0x3e007ff, 16, false, dont,
621
       ppc_elf_unhandled_reloc),
622
623
  /* This reloc is like R_PPC_EMB_SDA21 but only applies to e_add16i
624
     instructions.  If the register base is 0 then the linker changes
625
     the e_add16i to an e_li instruction.  */
626
  HOW (R_PPC_VLE_SDA21, 4, 16, 0xffff, 0, false, signed,
627
       ppc_elf_unhandled_reloc),
628
629
  /* Like R_PPC_VLE_SDA21 but ignore overflow.  */
630
  HOW (R_PPC_VLE_SDA21_LO, 4, 16, 0xffff, 0, false, dont,
631
       ppc_elf_unhandled_reloc),
632
633
  /* The 16 LSBS relative to _SDA_BASE_ in split16a format.  */
634
  HOW (R_PPC_VLE_SDAREL_LO16A, 4, 16, 0x1f07ff, 0, false, dont,
635
       ppc_elf_unhandled_reloc),
636
637
  /* The 16 LSBS relative to _SDA_BASE_ in split16d format.  */
638
  HOW (R_PPC_VLE_SDAREL_LO16D, 4, 16, 0x3e007ff, 0, false, dont,
639
       ppc_elf_unhandled_reloc),
640
641
  /* Bits 16-31 relative to _SDA_BASE_ in split16a format.  */
642
  HOW (R_PPC_VLE_SDAREL_HI16A, 4, 16, 0x1f07ff, 16, false, dont,
643
       ppc_elf_unhandled_reloc),
644
645
  /* Bits 16-31 relative to _SDA_BASE_ in split16d format.  */
646
  HOW (R_PPC_VLE_SDAREL_HI16D, 4, 16, 0x3e007ff, 16, false, dont,
647
       ppc_elf_unhandled_reloc),
648
649
  /* Bits 16-31 (HA) relative to _SDA_BASE split16a format.  */
650
  HOW (R_PPC_VLE_SDAREL_HA16A, 4, 16, 0x1f07ff, 16, false, dont,
651
       ppc_elf_unhandled_reloc),
652
653
  /* Bits 16-31 (HA) relative to _SDA_BASE split16d format.  */
654
  HOW (R_PPC_VLE_SDAREL_HA16D, 4, 16, 0x3e007ff, 16, false, dont,
655
       ppc_elf_unhandled_reloc),
656
657
  /* e_li split20 format.  */
658
  HOW (R_PPC_VLE_ADDR20, 4, 20, 0x1f7fff, 0, false, dont,
659
       ppc_elf_unhandled_reloc),
660
661
  HOW (R_PPC_IRELATIVE, 4, 32, 0xffffffff, 0, false, dont,
662
       ppc_elf_unhandled_reloc),
663
664
  /* A 16 bit relative relocation.  */
665
  HOW (R_PPC_REL16, 2, 16, 0xffff, 0, true, signed,
666
       bfd_elf_generic_reloc),
667
668
  /* A 16 bit relative relocation without overflow.  */
669
  HOW (R_PPC_REL16_LO, 2, 16, 0xffff, 0, true, dont,
670
       bfd_elf_generic_reloc),
671
672
  /* The high order 16 bits of a relative address.  */
673
  HOW (R_PPC_REL16_HI, 2, 16, 0xffff, 16, true, dont,
674
       bfd_elf_generic_reloc),
675
676
  /* The high order 16 bits of a relative address, plus 1 if the contents of
677
     the low 16 bits, treated as a signed number, is negative.  */
678
  HOW (R_PPC_REL16_HA, 2, 16, 0xffff, 16, true, dont,
679
       ppc_elf_addr16_ha_reloc),
680
681
  /* Like R_PPC_REL16_HA but for split field in addpcis.  */
682
  HOW (R_PPC_REL16DX_HA, 4, 16, 0x1fffc1, 16, true, signed,
683
       ppc_elf_addr16_ha_reloc),
684
685
  /* A split-field reloc for addpcis, non-relative (gas internal use only).  */
686
  HOW (R_PPC_16DX_HA, 4, 16, 0x1fffc1, 16, false, signed,
687
       ppc_elf_addr16_ha_reloc),
688
689
  /* GNU extension to record C++ vtable hierarchy.  */
690
  HOW (R_PPC_GNU_VTINHERIT, 0, 0, 0, 0, false, dont,
691
       NULL),
692
693
  /* GNU extension to record C++ vtable member usage.  */
694
  HOW (R_PPC_GNU_VTENTRY, 0, 0, 0, 0, false, dont,
695
       NULL),
696
697
  /* Phony reloc to handle AIX style TOC entries.  */
698
  HOW (R_PPC_TOC16, 2, 16, 0xffff, 0, false, signed,
699
       ppc_elf_unhandled_reloc),
700
};
701

702
/* Initialize the ppc_elf_howto_table, so that linear accesses can be done.  */
703
704
static void
705
ppc_elf_howto_init (void)
706
1
{
707
1
  unsigned int i, type;
708
709
108
  for (i = 0; i < ARRAY_SIZE (ppc_elf_howto_raw); i++)
710
107
    {
711
107
      type = ppc_elf_howto_raw[i].type;
712
107
      if (type >= ARRAY_SIZE (ppc_elf_howto_table))
713
0
  abort ();
714
107
      ppc_elf_howto_table[type] = &ppc_elf_howto_raw[i];
715
107
    }
716
1
}
717
718
static reloc_howto_type *
719
ppc_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
720
         bfd_reloc_code_real_type code)
721
0
{
722
0
  enum elf_ppc_reloc_type r;
723
724
  /* Initialize howto table if not already done.  */
725
0
  if (!ppc_elf_howto_table[R_PPC_ADDR32])
726
0
    ppc_elf_howto_init ();
727
728
0
  switch (code)
729
0
    {
730
0
    default:
731
0
      return NULL;
732
733
0
    case BFD_RELOC_NONE:    r = R_PPC_NONE;     break;
734
0
    case BFD_RELOC_32:      r = R_PPC_ADDR32;   break;
735
0
    case BFD_RELOC_PPC_BA26:    r = R_PPC_ADDR24;   break;
736
0
    case BFD_RELOC_PPC64_ADDR16_DS:
737
0
    case BFD_RELOC_16:      r = R_PPC_ADDR16;   break;
738
0
    case BFD_RELOC_PPC64_ADDR16_LO_DS:
739
0
    case BFD_RELOC_LO16:    r = R_PPC_ADDR16_LO;    break;
740
0
    case BFD_RELOC_HI16:    r = R_PPC_ADDR16_HI;    break;
741
0
    case BFD_RELOC_HI16_S:    r = R_PPC_ADDR16_HA;    break;
742
0
    case BFD_RELOC_PPC_BA16:    r = R_PPC_ADDR14;   break;
743
0
    case BFD_RELOC_PPC_BA16_BRTAKEN:  r = R_PPC_ADDR14_BRTAKEN; break;
744
0
    case BFD_RELOC_PPC_BA16_BRNTAKEN: r = R_PPC_ADDR14_BRNTAKEN;  break;
745
0
    case BFD_RELOC_PPC_B26:   r = R_PPC_REL24;    break;
746
0
    case BFD_RELOC_PPC_B16:   r = R_PPC_REL14;    break;
747
0
    case BFD_RELOC_PPC_B16_BRTAKEN: r = R_PPC_REL14_BRTAKEN;  break;
748
0
    case BFD_RELOC_PPC_B16_BRNTAKEN:  r = R_PPC_REL14_BRNTAKEN; break;
749
0
    case BFD_RELOC_PPC64_GOT16_DS:
750
0
    case BFD_RELOC_16_GOTOFF:   r = R_PPC_GOT16;    break;
751
0
    case BFD_RELOC_PPC64_GOT16_LO_DS:
752
0
    case BFD_RELOC_LO16_GOTOFF:   r = R_PPC_GOT16_LO;   break;
753
0
    case BFD_RELOC_HI16_GOTOFF:   r = R_PPC_GOT16_HI;   break;
754
0
    case BFD_RELOC_HI16_S_GOTOFF: r = R_PPC_GOT16_HA;   break;
755
0
    case BFD_RELOC_24_PLT_PCREL:  r = R_PPC_PLTREL24;   break;
756
0
    case BFD_RELOC_COPY:    r = R_PPC_COPY;     break;
757
0
    case BFD_RELOC_GLOB_DAT:    r = R_PPC_GLOB_DAT;   break;
758
0
    case BFD_RELOC_PPC_LOCAL24PC: r = R_PPC_LOCAL24PC;    break;
759
0
    case BFD_RELOC_32_PCREL:    r = R_PPC_REL32;    break;
760
0
    case BFD_RELOC_32_PLTOFF:   r = R_PPC_PLT32;    break;
761
0
    case BFD_RELOC_32_PLT_PCREL:  r = R_PPC_PLTREL32;   break;
762
0
    case BFD_RELOC_PPC64_PLT16_LO_DS:
763
0
    case BFD_RELOC_LO16_PLTOFF:   r = R_PPC_PLT16_LO;   break;
764
0
    case BFD_RELOC_HI16_PLTOFF:   r = R_PPC_PLT16_HI;   break;
765
0
    case BFD_RELOC_HI16_S_PLTOFF: r = R_PPC_PLT16_HA;   break;
766
0
    case BFD_RELOC_GPREL16:   r = R_PPC_SDAREL16;   break;
767
0
    case BFD_RELOC_PPC64_SECTOFF_DS:
768
0
    case BFD_RELOC_16_BASEREL:    r = R_PPC_SECTOFF;    break;
769
0
    case BFD_RELOC_PPC64_SECTOFF_LO_DS:
770
0
    case BFD_RELOC_LO16_BASEREL:  r = R_PPC_SECTOFF_LO;   break;
771
0
    case BFD_RELOC_HI16_BASEREL:  r = R_PPC_SECTOFF_HI;   break;
772
0
    case BFD_RELOC_HI16_S_BASEREL:  r = R_PPC_SECTOFF_HA;   break;
773
0
    case BFD_RELOC_CTOR:    r = R_PPC_ADDR32;   break;
774
0
    case BFD_RELOC_PPC64_TOC16_DS:
775
0
    case BFD_RELOC_PPC_TOC16:   r = R_PPC_TOC16;    break;
776
0
    case BFD_RELOC_PPC_TLS:   r = R_PPC_TLS;      break;
777
0
    case BFD_RELOC_PPC_TLSGD:   r = R_PPC_TLSGD;    break;
778
0
    case BFD_RELOC_PPC_TLSLD:   r = R_PPC_TLSLD;    break;
779
0
    case BFD_RELOC_PPC_DTPMOD:    r = R_PPC_DTPMOD32;   break;
780
0
    case BFD_RELOC_PPC64_TPREL16_DS:
781
0
    case BFD_RELOC_PPC_TPREL16:   r = R_PPC_TPREL16;    break;
782
0
    case BFD_RELOC_PPC64_TPREL16_LO_DS:
783
0
    case BFD_RELOC_PPC_TPREL16_LO:  r = R_PPC_TPREL16_LO;   break;
784
0
    case BFD_RELOC_PPC_TPREL16_HI:  r = R_PPC_TPREL16_HI;   break;
785
0
    case BFD_RELOC_PPC_TPREL16_HA:  r = R_PPC_TPREL16_HA;   break;
786
0
    case BFD_RELOC_PPC_TPREL:   r = R_PPC_TPREL32;    break;
787
0
    case BFD_RELOC_PPC64_DTPREL16_DS:
788
0
    case BFD_RELOC_PPC_DTPREL16:  r = R_PPC_DTPREL16;   break;
789
0
    case BFD_RELOC_PPC64_DTPREL16_LO_DS:
790
0
    case BFD_RELOC_PPC_DTPREL16_LO: r = R_PPC_DTPREL16_LO;    break;
791
0
    case BFD_RELOC_PPC_DTPREL16_HI: r = R_PPC_DTPREL16_HI;    break;
792
0
    case BFD_RELOC_PPC_DTPREL16_HA: r = R_PPC_DTPREL16_HA;    break;
793
0
    case BFD_RELOC_PPC_DTPREL:    r = R_PPC_DTPREL32;   break;
794
0
    case BFD_RELOC_PPC_GOT_TLSGD16: r = R_PPC_GOT_TLSGD16;    break;
795
0
    case BFD_RELOC_PPC_GOT_TLSGD16_LO:  r = R_PPC_GOT_TLSGD16_LO; break;
796
0
    case BFD_RELOC_PPC_GOT_TLSGD16_HI:  r = R_PPC_GOT_TLSGD16_HI; break;
797
0
    case BFD_RELOC_PPC_GOT_TLSGD16_HA:  r = R_PPC_GOT_TLSGD16_HA; break;
798
0
    case BFD_RELOC_PPC_GOT_TLSLD16: r = R_PPC_GOT_TLSLD16;    break;
799
0
    case BFD_RELOC_PPC_GOT_TLSLD16_LO:  r = R_PPC_GOT_TLSLD16_LO; break;
800
0
    case BFD_RELOC_PPC_GOT_TLSLD16_HI:  r = R_PPC_GOT_TLSLD16_HI; break;
801
0
    case BFD_RELOC_PPC_GOT_TLSLD16_HA:  r = R_PPC_GOT_TLSLD16_HA; break;
802
0
    case BFD_RELOC_PPC_GOT_TPREL16: r = R_PPC_GOT_TPREL16;    break;
803
0
    case BFD_RELOC_PPC_GOT_TPREL16_LO:  r = R_PPC_GOT_TPREL16_LO; break;
804
0
    case BFD_RELOC_PPC_GOT_TPREL16_HI:  r = R_PPC_GOT_TPREL16_HI; break;
805
0
    case BFD_RELOC_PPC_GOT_TPREL16_HA:  r = R_PPC_GOT_TPREL16_HA; break;
806
0
    case BFD_RELOC_PPC_GOT_DTPREL16:  r = R_PPC_GOT_DTPREL16;   break;
807
0
    case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC_GOT_DTPREL16_LO;  break;
808
0
    case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC_GOT_DTPREL16_HI;  break;
809
0
    case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC_GOT_DTPREL16_HA;  break;
810
0
    case BFD_RELOC_PPC_EMB_NADDR32: r = R_PPC_EMB_NADDR32;    break;
811
0
    case BFD_RELOC_PPC_EMB_NADDR16: r = R_PPC_EMB_NADDR16;    break;
812
0
    case BFD_RELOC_PPC_EMB_NADDR16_LO:  r = R_PPC_EMB_NADDR16_LO; break;
813
0
    case BFD_RELOC_PPC_EMB_NADDR16_HI:  r = R_PPC_EMB_NADDR16_HI; break;
814
0
    case BFD_RELOC_PPC_EMB_NADDR16_HA:  r = R_PPC_EMB_NADDR16_HA; break;
815
0
    case BFD_RELOC_PPC_EMB_SDAI16:  r = R_PPC_EMB_SDAI16;   break;
816
0
    case BFD_RELOC_PPC_EMB_SDA2I16: r = R_PPC_EMB_SDA2I16;    break;
817
0
    case BFD_RELOC_PPC_EMB_SDA2REL: r = R_PPC_EMB_SDA2REL;    break;
818
0
    case BFD_RELOC_PPC_EMB_SDA21: r = R_PPC_EMB_SDA21;    break;
819
0
    case BFD_RELOC_PPC_EMB_MRKREF:  r = R_PPC_EMB_MRKREF;   break;
820
0
    case BFD_RELOC_PPC_EMB_RELSEC16:  r = R_PPC_EMB_RELSEC16;   break;
821
0
    case BFD_RELOC_PPC_EMB_RELST_LO:  r = R_PPC_EMB_RELST_LO;   break;
822
0
    case BFD_RELOC_PPC_EMB_RELST_HI:  r = R_PPC_EMB_RELST_HI;   break;
823
0
    case BFD_RELOC_PPC_EMB_RELST_HA:  r = R_PPC_EMB_RELST_HA;   break;
824
0
    case BFD_RELOC_PPC_EMB_BIT_FLD: r = R_PPC_EMB_BIT_FLD;    break;
825
0
    case BFD_RELOC_PPC_EMB_RELSDA:  r = R_PPC_EMB_RELSDA;   break;
826
0
    case BFD_RELOC_PPC_VLE_REL8:  r = R_PPC_VLE_REL8;   break;
827
0
    case BFD_RELOC_PPC_VLE_REL15: r = R_PPC_VLE_REL15;    break;
828
0
    case BFD_RELOC_PPC_VLE_REL24: r = R_PPC_VLE_REL24;    break;
829
0
    case BFD_RELOC_PPC_VLE_LO16A: r = R_PPC_VLE_LO16A;    break;
830
0
    case BFD_RELOC_PPC_VLE_LO16D: r = R_PPC_VLE_LO16D;    break;
831
0
    case BFD_RELOC_PPC_VLE_HI16A: r = R_PPC_VLE_HI16A;    break;
832
0
    case BFD_RELOC_PPC_VLE_HI16D: r = R_PPC_VLE_HI16D;    break;
833
0
    case BFD_RELOC_PPC_VLE_HA16A: r = R_PPC_VLE_HA16A;    break;
834
0
    case BFD_RELOC_PPC_VLE_HA16D: r = R_PPC_VLE_HA16D;    break;
835
0
    case BFD_RELOC_PPC_VLE_SDA21: r = R_PPC_VLE_SDA21;    break;
836
0
    case BFD_RELOC_PPC_VLE_SDA21_LO:  r = R_PPC_VLE_SDA21_LO;   break;
837
0
    case BFD_RELOC_PPC_VLE_SDAREL_LO16A:
838
0
      r = R_PPC_VLE_SDAREL_LO16A;
839
0
      break;
840
0
    case BFD_RELOC_PPC_VLE_SDAREL_LO16D:
841
0
      r = R_PPC_VLE_SDAREL_LO16D;
842
0
      break;
843
0
    case BFD_RELOC_PPC_VLE_SDAREL_HI16A:
844
0
      r = R_PPC_VLE_SDAREL_HI16A;
845
0
      break;
846
0
    case BFD_RELOC_PPC_VLE_SDAREL_HI16D:
847
0
      r = R_PPC_VLE_SDAREL_HI16D;
848
0
      break;
849
0
    case BFD_RELOC_PPC_VLE_SDAREL_HA16A:
850
0
      r = R_PPC_VLE_SDAREL_HA16A;
851
0
      break;
852
0
    case BFD_RELOC_PPC_VLE_SDAREL_HA16D:
853
0
      r = R_PPC_VLE_SDAREL_HA16D;
854
0
      break;
855
0
    case BFD_RELOC_16_PCREL:    r = R_PPC_REL16;    break;
856
0
    case BFD_RELOC_LO16_PCREL:    r = R_PPC_REL16_LO;   break;
857
0
    case BFD_RELOC_HI16_PCREL:    r = R_PPC_REL16_HI;   break;
858
0
    case BFD_RELOC_HI16_S_PCREL:  r = R_PPC_REL16_HA;   break;
859
0
    case BFD_RELOC_PPC_16DX_HA:   r = R_PPC_16DX_HA;    break;
860
0
    case BFD_RELOC_PPC_REL16DX_HA:  r = R_PPC_REL16DX_HA;   break;
861
0
    case BFD_RELOC_VTABLE_INHERIT:  r = R_PPC_GNU_VTINHERIT;  break;
862
0
    case BFD_RELOC_VTABLE_ENTRY:  r = R_PPC_GNU_VTENTRY;    break;
863
0
    }
864
865
0
  return ppc_elf_howto_table[r];
866
0
};
867
868
static reloc_howto_type *
869
ppc_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
870
         const char *r_name)
871
0
{
872
0
  unsigned int i;
873
874
0
  for (i = 0; i < ARRAY_SIZE (ppc_elf_howto_raw); i++)
875
0
    if (ppc_elf_howto_raw[i].name != NULL
876
0
  && strcasecmp (ppc_elf_howto_raw[i].name, r_name) == 0)
877
0
      return &ppc_elf_howto_raw[i];
878
879
0
  return NULL;
880
0
}
881
882
/* Set the howto pointer for a PowerPC ELF reloc.  */
883
884
static bool
885
ppc_elf_info_to_howto (bfd *abfd,
886
           arelent *cache_ptr,
887
           Elf_Internal_Rela *dst)
888
174
{
889
174
  unsigned int r_type;
890
891
  /* Initialize howto table if not already done.  */
892
174
  if (!ppc_elf_howto_table[R_PPC_ADDR32])
893
1
    ppc_elf_howto_init ();
894
895
174
  r_type = ELF32_R_TYPE (dst->r_info);
896
174
  if (r_type >= ARRAY_SIZE (ppc_elf_howto_table)
897
174
      || ppc_elf_howto_table[r_type] == NULL)
898
3
    {
899
      /* xgettext:c-format */
900
3
      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
901
3
        abfd, r_type);
902
3
      bfd_set_error (bfd_error_bad_value);
903
3
      return false;
904
3
    }
905
906
171
  cache_ptr->howto = ppc_elf_howto_table[r_type];
907
171
  return true;
908
174
}
909
910
/* Handle the R_PPC_ADDR16_HA and R_PPC_REL16_HA relocs.  */
911
912
static bfd_reloc_status_type
913
ppc_elf_addr16_ha_reloc (bfd *abfd,
914
       arelent *reloc_entry,
915
       asymbol *symbol,
916
       void *data,
917
       asection *input_section,
918
       bfd *output_bfd,
919
       char **error_message ATTRIBUTE_UNUSED)
920
0
{
921
0
  enum elf_ppc_reloc_type r_type;
922
0
  long insn;
923
0
  bfd_size_type octets;
924
0
  bfd_vma value;
925
926
0
  if (output_bfd != NULL)
927
0
    {
928
0
      reloc_entry->address += input_section->output_offset;
929
0
      return bfd_reloc_ok;
930
0
    }
931
932
0
  reloc_entry->addend += 0x8000;
933
0
  r_type = reloc_entry->howto->type;
934
0
  if (r_type != R_PPC_REL16DX_HA)
935
0
    return bfd_reloc_continue;
936
937
0
  value = 0;
938
0
  if (!bfd_is_com_section (symbol->section))
939
0
    value = symbol->value;
940
0
  value += (reloc_entry->addend
941
0
      + symbol->section->output_offset
942
0
      + symbol->section->output_section->vma);
943
0
  value -= (reloc_entry->address
944
0
      + input_section->output_offset
945
0
      + input_section->output_section->vma);
946
0
  value >>= 16;
947
948
0
  octets = reloc_entry->address * OCTETS_PER_BYTE (abfd, input_section);
949
0
  if (!bfd_reloc_offset_in_range (reloc_entry->howto, abfd,
950
0
          input_section, octets))
951
0
    return bfd_reloc_outofrange;
952
953
0
  insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
954
0
  insn &= ~0x1fffc1;
955
0
  insn |= (value & 0xffc1) | ((value & 0x3e) << 15);
956
0
  bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
957
0
  return bfd_reloc_ok;
958
0
}
959
960
static bfd_reloc_status_type
961
ppc_elf_unhandled_reloc (bfd *abfd,
962
       arelent *reloc_entry,
963
       asymbol *symbol,
964
       void *data,
965
       asection *input_section,
966
       bfd *output_bfd,
967
       char **error_message)
968
74
{
969
  /* If this is a relocatable link (output_bfd test tells us), just
970
     call the generic function.  Any adjustment will be done at final
971
     link time.  */
972
74
  if (output_bfd != NULL)
973
0
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
974
0
          input_section, output_bfd, error_message);
975
976
74
  if (error_message != NULL)
977
74
    *error_message = bfd_asprintf (_("generic linker can't handle %s"),
978
74
             reloc_entry->howto->name);
979
74
  return bfd_reloc_dangerous;
980
74
}
981

982
/* Sections created by the linker.  */
983
984
typedef struct elf_linker_section
985
{
986
  /* Pointer to the bfd section.  */
987
  asection *section;
988
  /* Section name.  */
989
  const char *name;
990
  /* Associated bss section name.  */
991
  const char *bss_name;
992
  /* Associated symbol name.  */
993
  const char *sym_name;
994
  /* Associated symbol.  */
995
  struct elf_link_hash_entry *sym;
996
} elf_linker_section_t;
997
998
/* Linked list of allocated pointer entries.  This hangs off of the
999
   symbol lists, and provides allows us to return different pointers,
1000
   based on different addend's.  */
1001
1002
typedef struct elf_linker_section_pointers
1003
{
1004
  /* next allocated pointer for this symbol */
1005
  struct elf_linker_section_pointers *next;
1006
  /* offset of pointer from beginning of section */
1007
  bfd_vma offset;
1008
  /* addend used */
1009
  bfd_vma addend;
1010
  /* which linker section this is */
1011
  elf_linker_section_t *lsect;
1012
} elf_linker_section_pointers_t;
1013
1014
struct ppc_elf_obj_tdata
1015
{
1016
  struct elf_obj_tdata elf;
1017
1018
  /* A mapping from local symbols to offsets into the various linker
1019
     sections added.  This is index by the symbol index.  */
1020
  elf_linker_section_pointers_t **linker_section_pointers;
1021
1022
  /* Flags used to auto-detect plt type.  */
1023
  unsigned int makes_plt_call : 1;
1024
  unsigned int has_rel16 : 1;
1025
};
1026
1027
#define ppc_elf_tdata(bfd) \
1028
0
  ((struct ppc_elf_obj_tdata *) (bfd)->tdata.any)
1029
1030
#define elf_local_ptr_offsets(bfd) \
1031
0
  (ppc_elf_tdata (bfd)->linker_section_pointers)
1032
1033
#define is_ppc_elf(bfd) \
1034
0
  (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
1035
0
   && elf_object_id (bfd) == PPC32_ELF_DATA)
1036
1037
/* Override the generic function because we store some extras.  */
1038
1039
static bool
1040
ppc_elf_mkobject (bfd *abfd)
1041
53.5k
{
1042
53.5k
  return bfd_elf_allocate_object (abfd, sizeof (struct ppc_elf_obj_tdata));
1043
53.5k
}
1044
1045
/* When defaulting arch/mach, decode apuinfo to find a better match.  */
1046
1047
bool
1048
_bfd_elf_ppc_set_arch (bfd *abfd)
1049
1.47k
{
1050
1.47k
  unsigned long mach = 0;
1051
1.47k
  asection *s;
1052
1.47k
  unsigned char *contents;
1053
1054
1.47k
  if (abfd->arch_info->bits_per_word == 32
1055
1.07k
      && bfd_big_endian (abfd))
1056
610
    {
1057
1058
610
      for (s = abfd->sections; s != NULL; s = s->next)
1059
0
  if ((elf_section_data (s)->this_hdr.sh_flags & SHF_PPC_VLE) != 0)
1060
0
    break;
1061
610
      if (s != NULL)
1062
0
  mach = bfd_mach_ppc_vle;
1063
610
    }
1064
1065
1.47k
  if (mach == 0)
1066
1.47k
    {
1067
1.47k
      s = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
1068
1.47k
      if (s != NULL
1069
232
    && s->size >= 24
1070
230
    && (s->flags & SEC_HAS_CONTENTS) != 0
1071
226
    && bfd_malloc_and_get_section (abfd, s, &contents))
1072
217
  {
1073
217
    unsigned int apuinfo_size = bfd_get_32 (abfd, contents + 4);
1074
217
    unsigned int i;
1075
1076
174k
    for (i = 20; i < apuinfo_size + 20 && i + 4 <= s->size; i += 4)
1077
173k
      {
1078
173k
        unsigned int val = bfd_get_32 (abfd, contents + i);
1079
173k
        switch (val >> 16)
1080
173k
    {
1081
1.78k
    case PPC_APUINFO_PMR:
1082
3.63k
    case PPC_APUINFO_RFMCI:
1083
3.63k
      if (mach == 0)
1084
4
        mach = bfd_mach_ppc_titan;
1085
3.63k
      break;
1086
1087
692
    case PPC_APUINFO_ISEL:
1088
1.18k
    case PPC_APUINFO_CACHELCK:
1089
1.18k
      if (mach == bfd_mach_ppc_titan)
1090
0
        mach = bfd_mach_ppc_e500mc;
1091
1.18k
      break;
1092
1093
2.10k
    case PPC_APUINFO_SPE:
1094
13.5k
    case PPC_APUINFO_EFS:
1095
14.5k
    case PPC_APUINFO_BRLOCK:
1096
14.5k
      if (mach != bfd_mach_ppc_vle)
1097
13.3k
        mach = bfd_mach_ppc_e500;
1098
14.5k
      break;
1099
1100
586
    case PPC_APUINFO_VLE:
1101
586
      mach = bfd_mach_ppc_vle;
1102
586
      break;
1103
1104
153k
    default:
1105
153k
      mach = -1ul;
1106
173k
    }
1107
173k
      }
1108
217
    free (contents);
1109
217
  }
1110
1.47k
    }
1111
1112
1.47k
  if (mach != 0 && mach != -1ul)
1113
27
    {
1114
27
      const bfd_arch_info_type *arch;
1115
1116
346
      for (arch = abfd->arch_info->next; arch; arch = arch->next)
1117
346
  if (arch->mach == mach)
1118
27
    {
1119
27
      abfd->arch_info = arch;
1120
27
      break;
1121
27
    }
1122
27
    }
1123
1.47k
  return true;
1124
1.47k
}
1125
1126
/* Fix bad default arch selected for a 32 bit input bfd when the
1127
   default is 64 bit.  Also select arch based on apuinfo.  */
1128
1129
static bool
1130
ppc_elf_object_p (bfd *abfd)
1131
1.07k
{
1132
1.07k
  if (!abfd->arch_info->the_default)
1133
0
    return true;
1134
1135
1.07k
  if (abfd->arch_info->bits_per_word == 64)
1136
1.07k
    {
1137
1.07k
      Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
1138
1139
1.07k
      if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS32)
1140
1.07k
  {
1141
    /* Relies on arch after 64 bit default being 32 bit default.  */
1142
1.07k
    abfd->arch_info = abfd->arch_info->next;
1143
1.07k
    BFD_ASSERT (abfd->arch_info->bits_per_word == 32);
1144
1.07k
  }
1145
1.07k
    }
1146
1.07k
  return _bfd_elf_ppc_set_arch (abfd);
1147
1.07k
}
1148
1149
/* Function to set whether a module needs the -mrelocatable bit set.  */
1150
1151
static bool
1152
ppc_elf_set_private_flags (bfd *abfd, flagword flags)
1153
0
{
1154
0
  BFD_ASSERT (!elf_flags_init (abfd)
1155
0
        || elf_elfheader (abfd)->e_flags == flags);
1156
1157
0
  elf_elfheader (abfd)->e_flags = flags;
1158
0
  elf_flags_init (abfd) = true;
1159
0
  return true;
1160
0
}
1161
1162
/* Support for core dump NOTE sections.  */
1163
1164
static bool
1165
ppc_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1166
9
{
1167
9
  int offset;
1168
9
  unsigned int size;
1169
1170
9
  switch (note->descsz)
1171
9
    {
1172
9
    default:
1173
9
      return false;
1174
1175
0
    case 268:   /* Linux/PPC.  */
1176
      /* pr_cursig */
1177
0
      elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
1178
1179
      /* pr_pid */
1180
0
      elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
1181
1182
      /* pr_reg */
1183
0
      offset = 72;
1184
0
      size = 192;
1185
1186
0
      break;
1187
9
    }
1188
1189
  /* Make a ".reg/999" section.  */
1190
0
  return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1191
0
            size, note->descpos + offset);
1192
9
}
1193
1194
static bool
1195
ppc_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1196
42
{
1197
42
  switch (note->descsz)
1198
42
    {
1199
42
    default:
1200
42
      return false;
1201
1202
0
    case 128:   /* Linux/PPC elf_prpsinfo.  */
1203
0
      elf_tdata (abfd)->core->pid
1204
0
  = bfd_get_32 (abfd, note->descdata + 16);
1205
0
      elf_tdata (abfd)->core->program
1206
0
  = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
1207
0
      elf_tdata (abfd)->core->command
1208
0
  = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
1209
42
    }
1210
1211
  /* Note that for some reason, a spurious space is tacked
1212
     onto the end of the args in some (at least one anyway)
1213
     implementations, so strip it off if it exists.  */
1214
1215
0
  {
1216
0
    char *command = elf_tdata (abfd)->core->command;
1217
0
    int n = strlen (command);
1218
1219
0
    if (0 < n && command[n - 1] == ' ')
1220
0
      command[n - 1] = '\0';
1221
0
  }
1222
1223
0
  return true;
1224
42
}
1225
1226
static char *
1227
ppc_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type, ...)
1228
0
{
1229
0
  switch (note_type)
1230
0
    {
1231
0
    default:
1232
0
      return NULL;
1233
1234
0
    case NT_PRPSINFO:
1235
0
      {
1236
0
  char data[128] ATTRIBUTE_NONSTRING;
1237
0
  va_list ap;
1238
1239
0
  va_start (ap, note_type);
1240
0
  memset (data, 0, sizeof (data));
1241
0
  strncpy (data + 32, va_arg (ap, const char *), 16);
1242
#if GCC_VERSION == 8000 || GCC_VERSION == 8001
1243
  DIAGNOSTIC_PUSH;
1244
  /* GCC 8.0 and 8.1 warn about 80 equals destination size with
1245
     -Wstringop-truncation:
1246
     https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85643
1247
   */
1248
  DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION;
1249
#endif
1250
0
  strncpy (data + 48, va_arg (ap, const char *), 80);
1251
#if GCC_VERSION == 8000 || GCC_VERSION == 8001
1252
  DIAGNOSTIC_POP;
1253
#endif
1254
0
  va_end (ap);
1255
0
  return elfcore_write_note (abfd, buf, bufsiz,
1256
0
           "CORE", note_type, data, sizeof (data));
1257
0
      }
1258
1259
0
    case NT_PRSTATUS:
1260
0
      {
1261
0
  char data[268];
1262
0
  va_list ap;
1263
0
  long pid;
1264
0
  int cursig;
1265
0
  const void *greg;
1266
1267
0
  va_start (ap, note_type);
1268
0
  memset (data, 0, 72);
1269
0
  pid = va_arg (ap, long);
1270
0
  bfd_put_32 (abfd, pid, data + 24);
1271
0
  cursig = va_arg (ap, int);
1272
0
  bfd_put_16 (abfd, cursig, data + 12);
1273
0
  greg = va_arg (ap, const void *);
1274
0
  memcpy (data + 72, greg, 192);
1275
0
  memset (data + 264, 0, 4);
1276
0
  va_end (ap);
1277
0
  return elfcore_write_note (abfd, buf, bufsiz,
1278
0
           "CORE", note_type, data, sizeof (data));
1279
0
      }
1280
0
    }
1281
0
}
1282
1283
static flagword
1284
ppc_elf_lookup_section_flags (char *flag_name)
1285
0
{
1286
1287
0
  if (!strcmp (flag_name, "SHF_PPC_VLE"))
1288
0
    return SHF_PPC_VLE;
1289
1290
0
  return 0;
1291
0
}
1292
1293
/* Return address for Ith PLT stub in section PLT, for relocation REL
1294
   or (bfd_vma) -1 if it should not be included.  */
1295
1296
static bfd_vma
1297
ppc_elf_plt_sym_val (bfd_vma i ATTRIBUTE_UNUSED,
1298
         const asection *plt ATTRIBUTE_UNUSED,
1299
         const arelent *rel)
1300
0
{
1301
0
  return rel->address;
1302
0
}
1303
1304
/* Handle a PowerPC specific section when reading an object file.  This
1305
   is called when bfd_section_from_shdr finds a section with an unknown
1306
   type.  */
1307
1308
static bool
1309
ppc_elf_section_from_shdr (bfd *abfd,
1310
         Elf_Internal_Shdr *hdr,
1311
         const char *name,
1312
         int shindex)
1313
2.22k
{
1314
2.22k
  asection *newsect;
1315
2.22k
  flagword flags;
1316
1317
2.22k
  if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
1318
3
    return false;
1319
1320
2.22k
  newsect = hdr->bfd_section;
1321
2.22k
  flags = 0;
1322
2.22k
  if (hdr->sh_flags & SHF_EXCLUDE)
1323
622
    flags |= SEC_EXCLUDE;
1324
1325
2.22k
  if (hdr->sh_type == SHT_ORDERED)
1326
34
    flags |= SEC_SORT_ENTRIES;
1327
1328
2.22k
  if (startswith (name, ".PPC.EMB"))
1329
373
    name += 8;
1330
2.22k
  if (startswith (name, ".sbss")
1331
2.17k
      || startswith (name, ".sdata"))
1332
93
    flags |= SEC_SMALL_DATA;
1333
1334
2.22k
  return (flags == 0
1335
710
    || bfd_set_section_flags (newsect, newsect->flags | flags));
1336
2.22k
}
1337
1338
/* Set up any other section flags and such that may be necessary.  */
1339
1340
static bool
1341
ppc_elf_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
1342
           Elf_Internal_Shdr *shdr,
1343
           asection *asect)
1344
26
{
1345
26
  if ((asect->flags & SEC_SORT_ENTRIES) != 0)
1346
0
    shdr->sh_type = SHT_ORDERED;
1347
1348
26
  return true;
1349
26
}
1350
1351
/* If we have .sbss2 or .PPC.EMB.sbss0 output sections, we
1352
   need to bump up the number of section headers.  */
1353
1354
static int
1355
ppc_elf_additional_program_headers (bfd *abfd,
1356
            struct bfd_link_info *info ATTRIBUTE_UNUSED)
1357
0
{
1358
0
  asection *s;
1359
0
  int ret = 0;
1360
1361
0
  s = bfd_get_section_by_name (abfd, ".sbss2");
1362
0
  if (s != NULL && (s->flags & SEC_ALLOC) != 0)
1363
0
    ++ret;
1364
1365
0
  s = bfd_get_section_by_name (abfd, ".PPC.EMB.sbss0");
1366
0
  if (s != NULL && (s->flags & SEC_ALLOC) != 0)
1367
0
    ++ret;
1368
1369
0
  return ret;
1370
0
}
1371
1372
/* Modify the segment map for VLE executables.  */
1373
1374
bool
1375
ppc_elf_modify_segment_map (bfd *abfd,
1376
          struct bfd_link_info *info ATTRIBUTE_UNUSED)
1377
10
{
1378
10
  struct elf_segment_map *m;
1379
1380
  /* At this point in the link, output sections have already been sorted by
1381
     LMA and assigned to segments.  All that is left to do is to ensure
1382
     there is no mixing of VLE & non-VLE sections in a text segment.
1383
     If we find that case, we split the segment.
1384
     We maintain the original output section order.  */
1385
1386
33
  for (m = elf_seg_map (abfd); m != NULL; m = m->next)
1387
23
    {
1388
23
      struct elf_segment_map *n;
1389
23
      size_t amt;
1390
23
      unsigned int j, k;
1391
23
      unsigned int p_flags;
1392
1393
23
      if (m->p_type != PT_LOAD || m->count == 0)
1394
21
  continue;
1395
1396
5
      for (p_flags = PF_R, j = 0; j != m->count; ++j)
1397
3
  {
1398
3
    if ((m->sections[j]->flags & SEC_READONLY) == 0)
1399
0
      p_flags |= PF_W;
1400
3
    if ((m->sections[j]->flags & SEC_CODE) != 0)
1401
0
      {
1402
0
        p_flags |= PF_X;
1403
0
        if ((elf_section_flags (m->sections[j]) & SHF_PPC_VLE) != 0)
1404
0
    p_flags |= PF_PPC_VLE;
1405
0
        break;
1406
0
      }
1407
3
  }
1408
2
      if (j != m->count)
1409
0
  while (++j != m->count)
1410
0
    {
1411
0
      unsigned int p_flags1 = PF_R;
1412
1413
0
      if ((m->sections[j]->flags & SEC_READONLY) == 0)
1414
0
        p_flags1 |= PF_W;
1415
0
      if ((m->sections[j]->flags & SEC_CODE) != 0)
1416
0
        {
1417
0
    p_flags1 |= PF_X;
1418
0
    if ((elf_section_flags (m->sections[j]) & SHF_PPC_VLE) != 0)
1419
0
      p_flags1 |= PF_PPC_VLE;
1420
0
    if (((p_flags1 ^ p_flags) & PF_PPC_VLE) != 0)
1421
0
      break;
1422
0
        }
1423
0
      p_flags |= p_flags1;
1424
0
    }
1425
      /* If we're splitting a segment which originally contained rw
1426
   sections then those sections might now only be in one of the
1427
   two parts.  So always set p_flags if splitting, even if we
1428
   are being called for objcopy with p_flags_valid set.  */
1429
2
      if (j != m->count || !m->p_flags_valid)
1430
0
  {
1431
0
    m->p_flags_valid = 1;
1432
0
    m->p_flags = p_flags;
1433
0
  }
1434
2
      if (j == m->count)
1435
2
  continue;
1436
1437
      /* Sections 0..j-1 stay in this (current) segment,
1438
   the remainder are put in a new segment.
1439
   The scan resumes with the new segment.  */
1440
1441
0
      amt = sizeof (struct elf_segment_map);
1442
0
      amt += (m->count - j - 1) * sizeof (asection *);
1443
0
      n = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
1444
0
      if (n == NULL)
1445
0
  return false;
1446
1447
0
      n->p_type = PT_LOAD;
1448
0
      n->count = m->count - j;
1449
0
      for (k = 0; k < n->count; ++k)
1450
0
  n->sections[k] = m->sections[j + k];
1451
0
      m->count = j;
1452
0
      m->p_size_valid = 0;
1453
0
      n->next = m->next;
1454
0
      m->next = n;
1455
0
    }
1456
1457
10
  return true;
1458
10
}
1459
1460
/* Add extra PPC sections -- Note, for now, make .sbss2 and
1461
   .PPC.EMB.sbss0 a normal section, and not a bss section so
1462
   that the linker doesn't crater when trying to make more than
1463
   2 sections.  */
1464
1465
static const struct bfd_elf_special_section ppc_elf_special_sections[] =
1466
{
1467
  { STRING_COMMA_LEN (".plt"), 0, SHT_NOBITS, SHF_ALLOC + SHF_EXECINSTR },
1468
  { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
1469
  { STRING_COMMA_LEN (".sbss2"), -2, SHT_PROGBITS, SHF_ALLOC },
1470
  { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
1471
  { STRING_COMMA_LEN (".sdata2"), -2, SHT_PROGBITS, SHF_ALLOC },
1472
  { STRING_COMMA_LEN (".tags"), 0, SHT_ORDERED, SHF_ALLOC },
1473
  { STRING_COMMA_LEN (APUINFO_SECTION_NAME), 0, SHT_NOTE, 0 },
1474
  { STRING_COMMA_LEN (".PPC.EMB.sbss0"), 0, SHT_PROGBITS, SHF_ALLOC },
1475
  { STRING_COMMA_LEN (".PPC.EMB.sdata0"), 0, SHT_PROGBITS, SHF_ALLOC },
1476
  { NULL, 0, 0, 0, 0 }
1477
};
1478
1479
/* This is what we want for new plt/got.  */
1480
static const struct bfd_elf_special_section ppc_alt_plt =
1481
  { STRING_COMMA_LEN (".plt"),       0, SHT_PROGBITS, SHF_ALLOC };
1482
1483
static const struct bfd_elf_special_section *
1484
ppc_elf_get_sec_type_attr (bfd *abfd, asection *sec)
1485
18.0k
{
1486
18.0k
  const struct bfd_elf_special_section *ssect;
1487
1488
  /* See if this is one of the special sections.  */
1489
18.0k
  if (sec->name == NULL)
1490
0
    return NULL;
1491
1492
18.0k
  ssect = _bfd_elf_get_special_section (sec->name, ppc_elf_special_sections,
1493
18.0k
          sec->use_rela_p);
1494
18.0k
  if (ssect != NULL)
1495
367
    {
1496
367
      if (ssect == ppc_elf_special_sections && (sec->flags & SEC_LOAD) != 0)
1497
0
  ssect = &ppc_alt_plt;
1498
367
      return ssect;
1499
367
    }
1500
1501
17.7k
  return _bfd_elf_get_sec_type_attr (abfd, sec);
1502
18.0k
}
1503

1504
/* Very simple linked list structure for recording apuinfo values.  */
1505
typedef struct apuinfo_list
1506
{
1507
  struct apuinfo_list *next;
1508
  unsigned long value;
1509
}
1510
apuinfo_list;
1511
1512
static apuinfo_list *head;
1513
static bool apuinfo_set;
1514
1515
static void
1516
apuinfo_list_init (void)
1517
0
{
1518
0
  head = NULL;
1519
0
  apuinfo_set = false;
1520
0
}
1521
1522
static void
1523
apuinfo_list_add (unsigned long value)
1524
0
{
1525
0
  apuinfo_list *entry = head;
1526
1527
0
  while (entry != NULL)
1528
0
    {
1529
0
      if (entry->value == value)
1530
0
  return;
1531
0
      entry = entry->next;
1532
0
    }
1533
1534
0
  entry = bfd_malloc (sizeof (* entry));
1535
0
  if (entry == NULL)
1536
0
    return;
1537
1538
0
  entry->value = value;
1539
0
  entry->next  = head;
1540
0
  head = entry;
1541
0
}
1542
1543
static unsigned
1544
apuinfo_list_length (void)
1545
0
{
1546
0
  apuinfo_list *entry;
1547
0
  unsigned long count;
1548
1549
0
  for (entry = head, count = 0;
1550
0
       entry;
1551
0
       entry = entry->next)
1552
0
    ++ count;
1553
1554
0
  return count;
1555
0
}
1556
1557
static inline unsigned long
1558
apuinfo_list_element (unsigned long number)
1559
0
{
1560
0
  apuinfo_list * entry;
1561
1562
0
  for (entry = head;
1563
0
       entry && number --;
1564
0
       entry = entry->next)
1565
0
    ;
1566
1567
0
  return entry ? entry->value : 0;
1568
0
}
1569
1570
static void
1571
apuinfo_list_finish (void)
1572
0
{
1573
0
  apuinfo_list *entry;
1574
1575
0
  for (entry = head; entry;)
1576
0
    {
1577
0
      apuinfo_list *next = entry->next;
1578
0
      free (entry);
1579
0
      entry = next;
1580
0
    }
1581
1582
0
  head = NULL;
1583
0
}
1584
1585
/* Scan the input BFDs and create a linked list of
1586
   the APUinfo values that will need to be emitted.  */
1587
1588
static void
1589
ppc_elf_begin_write_processing (bfd *abfd, struct bfd_link_info *link_info)
1590
11
{
1591
11
  bfd *ibfd;
1592
11
  asection *asec;
1593
11
  char *buffer = NULL;
1594
11
  bfd_size_type largest_input_size = 0;
1595
11
  unsigned i;
1596
11
  unsigned long length;
1597
11
  const char *error_message = NULL;
1598
1599
11
  if (link_info == NULL)
1600
11
    return;
1601
1602
0
  apuinfo_list_init ();
1603
1604
  /* Read in the input sections contents.  */
1605
0
  for (ibfd = link_info->input_bfds; ibfd; ibfd = ibfd->link.next)
1606
0
    {
1607
0
      unsigned long datum;
1608
1609
0
      asec = bfd_get_section_by_name (ibfd, APUINFO_SECTION_NAME);
1610
0
      if (asec == NULL)
1611
0
  continue;
1612
1613
      /* xgettext:c-format */
1614
0
      error_message = _("corrupt %s section in %pB");
1615
0
      length = asec->size;
1616
0
      if (length < 20)
1617
0
  goto fail;
1618
1619
0
      apuinfo_set = true;
1620
0
      if (largest_input_size < asec->size)
1621
0
  {
1622
0
    free (buffer);
1623
0
    largest_input_size = asec->size;
1624
0
    buffer = bfd_malloc (largest_input_size);
1625
0
    if (!buffer)
1626
0
      return;
1627
0
  }
1628
1629
0
      if (bfd_seek (ibfd, asec->filepos, SEEK_SET) != 0
1630
0
    || (bfd_read (buffer, length, ibfd) != length))
1631
0
  {
1632
    /* xgettext:c-format */
1633
0
    error_message = _("unable to read in %s section from %pB");
1634
0
    goto fail;
1635
0
  }
1636
1637
      /* Verify the contents of the header.  Note - we have to
1638
   extract the values this way in order to allow for a
1639
   host whose endian-ness is different from the target.  */
1640
0
      datum = bfd_get_32 (ibfd, buffer);
1641
0
      if (datum != sizeof APUINFO_LABEL)
1642
0
  goto fail;
1643
1644
0
      datum = bfd_get_32 (ibfd, buffer + 8);
1645
0
      if (datum != 0x2)
1646
0
  goto fail;
1647
1648
0
      if (strcmp (buffer + 12, APUINFO_LABEL) != 0)
1649
0
  goto fail;
1650
1651
      /* Get the number of bytes used for apuinfo entries.  */
1652
0
      datum = bfd_get_32 (ibfd, buffer + 4);
1653
0
      if (datum + 20 != length)
1654
0
  goto fail;
1655
1656
      /* Scan the apuinfo section, building a list of apuinfo numbers.  */
1657
0
      for (i = 0; i < datum; i += 4)
1658
0
  apuinfo_list_add (bfd_get_32 (ibfd, buffer + 20 + i));
1659
0
    }
1660
1661
0
  error_message = NULL;
1662
1663
0
  if (apuinfo_set)
1664
0
    {
1665
      /* Compute the size of the output section.  */
1666
0
      unsigned num_entries = apuinfo_list_length ();
1667
1668
      /* Set the output section size, if it exists.  */
1669
0
      asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
1670
1671
0
      if (asec && !bfd_set_section_size (asec, 20 + num_entries * 4))
1672
0
  {
1673
0
    ibfd = abfd;
1674
    /* xgettext:c-format */
1675
0
    error_message = _("warning: unable to set size of %s section in %pB");
1676
0
  }
1677
0
    }
1678
1679
0
 fail:
1680
0
  free (buffer);
1681
1682
0
  if (error_message)
1683
0
    _bfd_error_handler (error_message, APUINFO_SECTION_NAME, ibfd);
1684
0
}
1685
1686
/* Prevent the output section from accumulating the input sections'
1687
   contents.  We have already stored this in our linked list structure.  */
1688
1689
static bool
1690
ppc_elf_write_section (bfd *abfd ATTRIBUTE_UNUSED,
1691
           struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
1692
           asection *asec,
1693
           bfd_byte *contents ATTRIBUTE_UNUSED)
1694
0
{
1695
0
  return apuinfo_set && strcmp (asec->name, APUINFO_SECTION_NAME) == 0;
1696
0
}
1697
1698
/* Finally we can generate the output section.  */
1699
1700
static void
1701
ppc_final_write_processing (bfd *abfd)
1702
10
{
1703
10
  bfd_byte *buffer;
1704
10
  asection *asec;
1705
10
  unsigned i;
1706
10
  unsigned num_entries;
1707
10
  bfd_size_type length;
1708
1709
10
  asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
1710
10
  if (asec == NULL)
1711
10
    return;
1712
1713
0
  if (!apuinfo_set)
1714
0
    return;
1715
1716
0
  length = asec->size;
1717
0
  if (length < 20)
1718
0
    return;
1719
1720
0
  buffer = bfd_malloc (length);
1721
0
  if (buffer == NULL)
1722
0
    {
1723
0
      _bfd_error_handler
1724
0
  (_("failed to allocate space for new APUinfo section"));
1725
0
      return;
1726
0
    }
1727
1728
  /* Create the apuinfo header.  */
1729
0
  num_entries = apuinfo_list_length ();
1730
0
  bfd_put_32 (abfd, sizeof APUINFO_LABEL, buffer);
1731
0
  bfd_put_32 (abfd, num_entries * 4, buffer + 4);
1732
0
  bfd_put_32 (abfd, 0x2, buffer + 8);
1733
0
  strcpy ((char *) buffer + 12, APUINFO_LABEL);
1734
1735
0
  length = 20;
1736
0
  for (i = 0; i < num_entries; i++)
1737
0
    {
1738
0
      bfd_put_32 (abfd, apuinfo_list_element (i), buffer + length);
1739
0
      length += 4;
1740
0
    }
1741
1742
0
  if (length != asec->size)
1743
0
    _bfd_error_handler (_("failed to compute new APUinfo section"));
1744
1745
0
  if (! bfd_set_section_contents (abfd, asec, buffer, (file_ptr) 0, length))
1746
0
    _bfd_error_handler (_("failed to install new APUinfo section"));
1747
1748
0
  free (buffer);
1749
1750
0
  apuinfo_list_finish ();
1751
0
}
1752
1753
static bool
1754
ppc_elf_final_write_processing (bfd *abfd)
1755
10
{
1756
10
  ppc_final_write_processing (abfd);
1757
10
  return _bfd_elf_final_write_processing (abfd);
1758
10
}
1759

1760
static bool
1761
is_nonpic_glink_stub (bfd *abfd, asection *glink, bfd_vma off)
1762
0
{
1763
0
  bfd_byte buf[4 * 4];
1764
1765
0
  if (!bfd_get_section_contents (abfd, glink, buf, off, sizeof buf))
1766
0
    return false;
1767
1768
0
  return ((bfd_get_32 (abfd, buf + 0) & 0xffff0000) == LIS_11
1769
0
    && (bfd_get_32 (abfd, buf + 4) & 0xffff0000) == LWZ_11_11
1770
0
    && bfd_get_32 (abfd, buf + 8) == MTCTR_11
1771
0
    && bfd_get_32 (abfd, buf + 12) == BCTR);
1772
0
}
1773
1774
static bool
1775
section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
1776
0
{
1777
0
  bfd_vma vma = *(bfd_vma *) ptr;
1778
0
  return ((section->flags & SEC_ALLOC) != 0
1779
0
    && section->vma <= vma
1780
0
    && vma < section->vma + section->size);
1781
0
}
1782
1783
static long
1784
ppc_elf_get_synthetic_symtab (bfd *abfd, long symcount, asymbol **syms,
1785
            long dynsymcount, asymbol **dynsyms,
1786
            asymbol **ret)
1787
161
{
1788
161
  bool (*slurp_relocs) (bfd *, asection *, asymbol **, bool);
1789
161
  asection *plt, *relplt, *dynamic, *glink;
1790
161
  bfd_vma glink_vma = 0;
1791
161
  bfd_vma resolv_vma = 0;
1792
161
  bfd_vma stub_off;
1793
161
  asymbol *s;
1794
161
  arelent *p;
1795
161
  size_t count, i, stub_delta;
1796
161
  size_t size;
1797
161
  char *names;
1798
161
  bfd_byte buf[4];
1799
1800
161
  *ret = NULL;
1801
1802
161
  if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0)
1803
161
    return 0;
1804
1805
0
  if (dynsymcount <= 0)
1806
0
    return 0;
1807
1808
0
  relplt = bfd_get_section_by_name (abfd, ".rela.plt");
1809
0
  if (relplt == NULL)
1810
0
    return 0;
1811
1812
0
  plt = bfd_get_section_by_name (abfd, ".plt");
1813
0
  if (plt == NULL)
1814
0
    return 0;
1815
1816
  /* Call common code to handle old-style executable PLTs.  */
1817
0
  if (elf_section_flags (plt) & SHF_EXECINSTR)
1818
0
    return _bfd_elf_get_synthetic_symtab (abfd, symcount, syms,
1819
0
            dynsymcount, dynsyms, ret);
1820
1821
  /* If this object was prelinked, the prelinker stored the address
1822
     of .glink at got[1].  If it wasn't prelinked, got[1] will be zero.  */
1823
0
  dynamic = bfd_get_section_by_name (abfd, ".dynamic");
1824
0
  if (dynamic != NULL
1825
0
      && (dynamic->flags & SEC_HAS_CONTENTS) != 0)
1826
0
    {
1827
0
      bfd_byte *dynbuf, *extdyn, *extdynend;
1828
0
      size_t extdynsize;
1829
0
      void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
1830
1831
0
      if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
1832
0
  return -1;
1833
1834
0
      extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
1835
0
      swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
1836
1837
0
      for (extdyn = dynbuf, extdynend = dynbuf + dynamic->size;
1838
0
     (size_t) (extdynend - extdyn) >= extdynsize;
1839
0
     extdyn += extdynsize)
1840
0
  {
1841
0
    Elf_Internal_Dyn dyn;
1842
0
    (*swap_dyn_in) (abfd, extdyn, &dyn);
1843
1844
0
    if (dyn.d_tag == DT_NULL)
1845
0
      break;
1846
1847
0
    if (dyn.d_tag == DT_PPC_GOT)
1848
0
      {
1849
0
        unsigned int g_o_t = dyn.d_un.d_val;
1850
0
        asection *got = bfd_get_section_by_name (abfd, ".got");
1851
0
        if (got != NULL
1852
0
      && bfd_get_section_contents (abfd, got, buf,
1853
0
                 g_o_t - got->vma + 4, 4))
1854
0
    glink_vma = bfd_get_32 (abfd, buf);
1855
0
        break;
1856
0
      }
1857
0
  }
1858
0
      free (dynbuf);
1859
0
    }
1860
1861
  /* Otherwise we read the first plt entry.  */
1862
0
  if (glink_vma == 0)
1863
0
    {
1864
0
      if (bfd_get_section_contents (abfd, plt, buf, 0, 4))
1865
0
  glink_vma = bfd_get_32 (abfd, buf);
1866
0
    }
1867
1868
0
  if (glink_vma == 0)
1869
0
    return 0;
1870
1871
  /* The .glink section usually does not survive the final
1872
     link; search for the section (usually .text) where the
1873
     glink stubs now reside.  */
1874
0
  glink = bfd_sections_find_if (abfd, section_covers_vma, &glink_vma);
1875
0
  if (glink == NULL)
1876
0
    return 0;
1877
1878
  /* Determine glink PLT resolver by reading the relative branch
1879
     from the first glink stub.  */
1880
0
  if (bfd_get_section_contents (abfd, glink, buf,
1881
0
        glink_vma - glink->vma, 4))
1882
0
    {
1883
0
      unsigned int insn = bfd_get_32 (abfd, buf);
1884
1885
      /* The first glink stub may either branch to the resolver ...  */
1886
0
      insn ^= B;
1887
0
      if ((insn & ~0x3fffffc) == 0)
1888
0
  resolv_vma = glink_vma + (insn ^ 0x2000000) - 0x2000000;
1889
1890
      /* ... or fall through a bunch of NOPs.  */
1891
0
      else if ((insn ^ B ^ NOP) == 0)
1892
0
  for (i = 4;
1893
0
       bfd_get_section_contents (abfd, glink, buf,
1894
0
               glink_vma - glink->vma + i, 4);
1895
0
       i += 4)
1896
0
    if (bfd_get_32 (abfd, buf) != NOP)
1897
0
      {
1898
0
        resolv_vma = glink_vma + i;
1899
0
        break;
1900
0
      }
1901
0
    }
1902
1903
0
  count = NUM_SHDR_ENTRIES (&elf_section_data (relplt)->this_hdr);
1904
  /* If the stubs are those for -shared/-pie then we might have
1905
     multiple stubs for each plt entry.  If that is the case then
1906
     there is no way to associate stubs with their plt entries short
1907
     of figuring out the GOT pointer value used in the stub.
1908
     The offsets tested here need to cover all possible values of
1909
     GLINK_ENTRY_SIZE for other than __tls_get_addr_opt.  */
1910
0
  stub_off = glink_vma - glink->vma;
1911
0
  for (stub_delta = 16; stub_delta <= 32; stub_delta += 8)
1912
0
    if (is_nonpic_glink_stub (abfd, glink, stub_off - stub_delta))
1913
0
      break;
1914
0
  if (stub_delta > 32)
1915
0
    return 0;
1916
1917
0
  slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
1918
0
  if (! (*slurp_relocs) (abfd, relplt, dynsyms, true))
1919
0
    return -1;
1920
1921
0
  size = count * sizeof (asymbol);
1922
0
  p = relplt->relocation;
1923
0
  for (i = 0; i < count; i++, p++)
1924
0
    {
1925
0
      size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
1926
0
      if (p->addend != 0)
1927
0
  size += sizeof ("+0x") - 1 + 8;
1928
0
    }
1929
1930
0
  size += sizeof (asymbol) + sizeof ("__glink");
1931
1932
0
  if (resolv_vma)
1933
0
    size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
1934
1935
0
  s = *ret = bfd_malloc (size);
1936
0
  if (s == NULL)
1937
0
    return -1;
1938
1939
0
  stub_off = glink_vma - glink->vma;
1940
0
  names = (char *) (s + count + 1 + (resolv_vma != 0));
1941
0
  p = relplt->relocation + count - 1;
1942
0
  for (i = 0; i < count; i++)
1943
0
    {
1944
0
      size_t len;
1945
1946
0
      stub_off -= stub_delta;
1947
0
      if (strcmp ((*p->sym_ptr_ptr)->name, "__tls_get_addr_opt") == 0)
1948
0
  stub_off -= 32;
1949
0
      *s = **p->sym_ptr_ptr;
1950
      /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set.  Since
1951
   we are defining a symbol, ensure one of them is set.  */
1952
0
      if ((s->flags & BSF_LOCAL) == 0)
1953
0
  s->flags |= BSF_GLOBAL;
1954
0
      s->flags |= BSF_SYNTHETIC;
1955
0
      s->section = glink;
1956
0
      s->value = stub_off;
1957
0
      s->name = names;
1958
0
      s->udata.p = NULL;
1959
0
      len = strlen ((*p->sym_ptr_ptr)->name);
1960
0
      memcpy (names, (*p->sym_ptr_ptr)->name, len);
1961
0
      names += len;
1962
0
      if (p->addend != 0)
1963
0
  {
1964
0
    memcpy (names, "+0x", sizeof ("+0x") - 1);
1965
0
    names += sizeof ("+0x") - 1;
1966
0
    bfd_sprintf_vma (abfd, names, p->addend);
1967
0
    names += strlen (names);
1968
0
  }
1969
0
      memcpy (names, "@plt", sizeof ("@plt"));
1970
0
      names += sizeof ("@plt");
1971
0
      ++s;
1972
0
      --p;
1973
0
    }
1974
1975
  /* Add a symbol at the start of the glink branch table.  */
1976
0
  memset (s, 0, sizeof *s);
1977
0
  s->the_bfd = abfd;
1978
0
  s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
1979
0
  s->section = glink;
1980
0
  s->value = glink_vma - glink->vma;
1981
0
  s->name = names;
1982
0
  memcpy (names, "__glink", sizeof ("__glink"));
1983
0
  names += sizeof ("__glink");
1984
0
  s++;
1985
0
  count++;
1986
1987
0
  if (resolv_vma)
1988
0
    {
1989
      /* Add a symbol for the glink PLT resolver.  */
1990
0
      memset (s, 0, sizeof *s);
1991
0
      s->the_bfd = abfd;
1992
0
      s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
1993
0
      s->section = glink;
1994
0
      s->value = resolv_vma - glink->vma;
1995
0
      s->name = names;
1996
0
      memcpy (names, "__glink_PLTresolve", sizeof ("__glink_PLTresolve"));
1997
0
      names += sizeof ("__glink_PLTresolve");
1998
0
      s++;
1999
0
      count++;
2000
0
    }
2001
2002
0
  return count;
2003
0
}
2004

2005
/* The following functions are specific to the ELF linker, while
2006
   functions above are used generally.  They appear in this file more
2007
   or less in the order in which they are called.  eg.
2008
   ppc_elf_check_relocs is called early in the link process,
2009
   ppc_elf_finish_dynamic_sections is one of the last functions
2010
   called.  */
2011
2012
/* Track PLT entries needed for a given symbol.  We might need more
2013
   than one glink entry per symbol when generating a pic binary.  */
2014
struct plt_entry
2015
{
2016
  struct plt_entry *next;
2017
2018
  /* -fPIC uses multiple GOT sections, one per file, called ".got2".
2019
     This field stores the offset into .got2 used to initialise the
2020
     GOT pointer reg.  It will always be at least 32768.  (Current
2021
     gcc always uses an offset of 32768, but ld -r will pack .got2
2022
     sections together resulting in larger offsets).  */
2023
  bfd_vma addend;
2024
2025
  /* The .got2 section.  */
2026
  asection *sec;
2027
2028
  /* PLT refcount or offset.  */
2029
  union
2030
    {
2031
      bfd_signed_vma refcount;
2032
      bfd_vma offset;
2033
    } plt;
2034
2035
  /* .glink stub offset.  */
2036
  bfd_vma glink_offset;
2037
};
2038
2039
/* Of those relocs that might be copied as dynamic relocs, this
2040
   function selects those that must be copied when linking a shared
2041
   library or PIE, even when the symbol is local.  */
2042
2043
static int
2044
must_be_dyn_reloc (struct bfd_link_info *info,
2045
       enum elf_ppc_reloc_type r_type)
2046
0
{
2047
0
  switch (r_type)
2048
0
    {
2049
0
    default:
2050
      /* Only relative relocs can be resolved when the object load
2051
   address isn't fixed.  DTPREL32 is excluded because the
2052
   dynamic linker needs to differentiate global dynamic from
2053
   local dynamic __tls_index pairs when PPC_OPT_TLS is set.  */
2054
0
      return 1;
2055
2056
0
    case R_PPC_REL24:
2057
0
    case R_PPC_REL14:
2058
0
    case R_PPC_REL14_BRTAKEN:
2059
0
    case R_PPC_REL14_BRNTAKEN:
2060
0
    case R_PPC_REL32:
2061
0
      return 0;
2062
2063
0
    case R_PPC_TPREL32:
2064
0
    case R_PPC_TPREL16:
2065
0
    case R_PPC_TPREL16_LO:
2066
0
    case R_PPC_TPREL16_HI:
2067
0
    case R_PPC_TPREL16_HA:
2068
      /* These relocations are relative but in a shared library the
2069
   linker doesn't know the thread pointer base.  */
2070
0
      return bfd_link_dll (info);
2071
0
    }
2072
0
}
2073
2074
/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
2075
   copying dynamic variables from a shared lib into an app's dynbss
2076
   section, and instead use a dynamic relocation to point into the
2077
   shared lib.  */
2078
0
#define ELIMINATE_COPY_RELOCS 1
2079
2080
/* Used to track dynamic relocations for local symbols.  */
2081
struct ppc_dyn_relocs
2082
{
2083
  struct ppc_dyn_relocs *next;
2084
2085
  /* The input section of the reloc.  */
2086
  asection *sec;
2087
2088
  /* Total number of relocs copied for the input section.  */
2089
  unsigned int count : 31;
2090
2091
  /* Whether this entry is for STT_GNU_IFUNC symbols.  */
2092
  unsigned int ifunc : 1;
2093
};
2094
2095
/* PPC ELF linker hash entry.  */
2096
2097
struct ppc_elf_link_hash_entry
2098
{
2099
  struct elf_link_hash_entry elf;
2100
2101
  /* If this symbol is used in the linker created sections, the processor
2102
     specific backend uses this field to map the field into the offset
2103
     from the beginning of the section.  */
2104
  elf_linker_section_pointers_t *linker_section_pointer;
2105
2106
  /* Contexts in which symbol is used in the GOT.
2107
     Bits are or'd into the mask as the corresponding relocs are
2108
     encountered during check_relocs, with TLS_TLS being set when any
2109
     of the other TLS bits are set.  tls_optimize clears bits when
2110
     optimizing to indicate the corresponding GOT entry type is not
2111
     needed.  If set, TLS_TLS is never cleared.  tls_optimize may also
2112
     set TLS_GDIE when a GD reloc turns into an IE one.
2113
     These flags are also kept for local symbols.  */
2114
0
#define TLS_TLS    1  /* Any TLS reloc.  */
2115
0
#define TLS_GD     2  /* GD reloc. */
2116
0
#define TLS_LD     4  /* LD reloc. */
2117
0
#define TLS_TPREL  8  /* TPREL reloc, => IE. */
2118
0
#define TLS_DTPREL  16  /* DTPREL reloc, => LD. */
2119
0
#define TLS_MARK  32  /* __tls_get_addr call marked. */
2120
0
#define TLS_GDIE  64  /* GOT TPREL reloc resulting from GD->IE. */
2121
  unsigned char tls_mask;
2122
2123
  /* The above field is also used to mark function symbols.  In which
2124
     case TLS_TLS will be 0.  */
2125
0
#define PLT_IFUNC  2  /* STT_GNU_IFUNC.  */
2126
0
#define PLT_KEEP   4  /* inline plt call requires plt entry.  */
2127
0
#define NON_GOT        256  /* local symbol plt, not stored.  */
2128
2129
  /* Nonzero if we have seen a small data relocation referring to this
2130
     symbol.  */
2131
  unsigned char has_sda_refs : 1;
2132
2133
  /* Flag use of given relocations.  */
2134
  unsigned char has_addr16_ha : 1;
2135
  unsigned char has_addr16_lo : 1;
2136
};
2137
2138
0
#define ppc_elf_hash_entry(ent) ((struct ppc_elf_link_hash_entry *) (ent))
2139
2140
/* PPC ELF linker hash table.  */
2141
2142
struct ppc_elf_link_hash_table
2143
{
2144
  struct elf_link_hash_table elf;
2145
2146
  /* Various options passed from the linker.  */
2147
  struct ppc_elf_params *params;
2148
2149
  /* Short-cuts to get to dynamic linker sections.  */
2150
  asection *glink;
2151
  asection *dynsbss;
2152
  asection *relsbss;
2153
  elf_linker_section_t sdata[2];
2154
  asection *sbss;
2155
  asection *glink_eh_frame;
2156
  asection *pltlocal;
2157
  asection *relpltlocal;
2158
2159
  /* The (unloaded but important) .rela.plt.unloaded on VxWorks.  */
2160
  asection *srelplt2;
2161
2162
  /* Shortcut to __tls_get_addr.  */
2163
  struct elf_link_hash_entry *tls_get_addr;
2164
2165
  /* The bfd that forced an old-style PLT.  */
2166
  bfd *old_bfd;
2167
2168
  /* TLS local dynamic got entry handling.  */
2169
  union {
2170
    bfd_signed_vma refcount;
2171
    bfd_vma offset;
2172
  } tlsld_got;
2173
2174
  /* Offset of branch table to PltResolve function in glink.  */
2175
  bfd_vma glink_pltresolve;
2176
2177
  /* Size of reserved GOT entries.  */
2178
  unsigned int got_header_size;
2179
  /* Non-zero if allocating the header left a gap.  */
2180
  unsigned int got_gap;
2181
2182
  /* The type of PLT we have chosen to use.  */
2183
  enum ppc_elf_plt_type plt_type;
2184
2185
  /* Whether there exist local gnu indirect function resolvers,
2186
     referenced by dynamic relocations.  */
2187
  unsigned int local_ifunc_resolver:1;
2188
  unsigned int maybe_local_ifunc_resolver:1;
2189
2190
  /* Set if tls optimization is enabled.  */
2191
  unsigned int do_tls_opt:1;
2192
2193
  /* Set if inline plt calls should be converted to direct calls.  */
2194
  unsigned int can_convert_all_inline_plt:1;
2195
2196
  /* The size of PLT entries.  */
2197
  int plt_entry_size;
2198
  /* The distance between adjacent PLT slots.  */
2199
  int plt_slot_size;
2200
  /* The size of the first PLT entry.  */
2201
  int plt_initial_entry_size;
2202
};
2203
2204
/* Rename some of the generic section flags to better document how they
2205
   are used for ppc32.  The flags are only valid for ppc32 elf objects.  */
2206
2207
/* Nonzero if this section has TLS related relocations.  */
2208
0
#define has_tls_reloc sec_flg0
2209
2210
/* Nonzero if this section has a call to __tls_get_addr lacking marker
2211
   relocs.  */
2212
0
#define nomark_tls_get_addr sec_flg1
2213
2214
  /* Flag set when PLTCALL relocs are detected.  */
2215
0
#define has_pltcall sec_flg2
2216
2217
/* Get the PPC ELF linker hash table from a link_info structure.  */
2218
2219
#define ppc_elf_hash_table(p) \
2220
0
  ((is_elf_hash_table ((p)->hash)          \
2221
0
    && elf_hash_table_id (elf_hash_table (p)) == PPC32_ELF_DATA) \
2222
0
   ? (struct ppc_elf_link_hash_table *) (p)->hash : NULL)
2223
2224
/* Create an entry in a PPC ELF linker hash table.  */
2225
2226
static struct bfd_hash_entry *
2227
ppc_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
2228
         struct bfd_hash_table *table,
2229
         const char *string)
2230
0
{
2231
  /* Allocate the structure if it has not already been allocated by a
2232
     subclass.  */
2233
0
  if (entry == NULL)
2234
0
    {
2235
0
      entry = bfd_hash_allocate (table,
2236
0
         sizeof (struct ppc_elf_link_hash_entry));
2237
0
      if (entry == NULL)
2238
0
  return entry;
2239
0
    }
2240
2241
  /* Call the allocation method of the superclass.  */
2242
0
  entry = _bfd_elf_link_hash_newfunc (entry, table, string);
2243
0
  if (entry != NULL)
2244
0
    {
2245
0
      ppc_elf_hash_entry (entry)->linker_section_pointer = NULL;
2246
0
      ppc_elf_hash_entry (entry)->tls_mask = 0;
2247
0
      ppc_elf_hash_entry (entry)->has_sda_refs = 0;
2248
0
    }
2249
2250
0
  return entry;
2251
0
}
2252
2253
/* Create a PPC ELF linker hash table.  */
2254
2255
static struct bfd_link_hash_table *
2256
ppc_elf_link_hash_table_create (bfd *abfd)
2257
0
{
2258
0
  struct ppc_elf_link_hash_table *ret;
2259
0
  static struct ppc_elf_params default_params
2260
0
    = { PLT_OLD, 0, 0, 1, 0, 0, 12, 0, 0, 0 };
2261
2262
0
  ret = bfd_zmalloc (sizeof (struct ppc_elf_link_hash_table));
2263
0
  if (ret == NULL)
2264
0
    return NULL;
2265
2266
0
  if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
2267
0
              ppc_elf_link_hash_newfunc,
2268
0
              sizeof (struct ppc_elf_link_hash_entry)))
2269
0
    {
2270
0
      free (ret);
2271
0
      return NULL;
2272
0
    }
2273
2274
0
  ret->elf.init_plt_refcount.refcount = 0;
2275
0
  ret->elf.init_plt_refcount.glist = NULL;
2276
0
  ret->elf.init_plt_offset.offset = 0;
2277
0
  ret->elf.init_plt_offset.glist = NULL;
2278
2279
0
  ret->params = &default_params;
2280
2281
0
  ret->sdata[0].name = ".sdata";
2282
0
  ret->sdata[0].sym_name = "_SDA_BASE_";
2283
0
  ret->sdata[0].bss_name = ".sbss";
2284
2285
0
  ret->sdata[1].name = ".sdata2";
2286
0
  ret->sdata[1].sym_name = "_SDA2_BASE_";
2287
0
  ret->sdata[1].bss_name = ".sbss2";
2288
2289
0
  ret->plt_entry_size = 12;
2290
0
  ret->plt_slot_size = 8;
2291
0
  ret->plt_initial_entry_size = 72;
2292
2293
0
  return &ret->elf.root;
2294
0
}
2295
2296
/* Hook linker params into hash table.  */
2297
2298
void
2299
ppc_elf_link_params (struct bfd_link_info *info, struct ppc_elf_params *params)
2300
0
{
2301
0
  struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
2302
2303
0
  if (htab)
2304
0
    htab->params = params;
2305
0
  params->pagesize_p2 = bfd_log2 (params->pagesize);
2306
0
}
2307
2308
/* Create .got and the related sections.  */
2309
2310
static bool
2311
ppc_elf_create_got (bfd *abfd, struct bfd_link_info *info)
2312
0
{
2313
0
  struct ppc_elf_link_hash_table *htab;
2314
2315
0
  if (!_bfd_elf_create_got_section (abfd, info))
2316
0
    return false;
2317
2318
0
  htab = ppc_elf_hash_table (info);
2319
0
  if (htab->elf.target_os != is_vxworks)
2320
0
    {
2321
      /* The powerpc .got has a blrl instruction in it.  Mark it
2322
   executable.  */
2323
0
      flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS
2324
0
      | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2325
0
      if (!bfd_set_section_flags (htab->elf.sgot, flags))
2326
0
  return false;
2327
0
    }
2328
2329
0
  return true;
2330
0
}
2331
2332
/* Create a special linker section, used for R_PPC_EMB_SDAI16 and
2333
   R_PPC_EMB_SDA2I16 pointers.  These sections become part of .sdata
2334
   and .sdata2.  Create _SDA_BASE_ and _SDA2_BASE too.  */
2335
2336
static bool
2337
ppc_elf_create_linker_section (bfd *abfd,
2338
             struct bfd_link_info *info,
2339
             flagword flags,
2340
             elf_linker_section_t *lsect)
2341
0
{
2342
0
  asection *s;
2343
2344
0
  flags |= (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2345
0
      | SEC_LINKER_CREATED);
2346
2347
0
  s = bfd_make_section_anyway_with_flags (abfd, lsect->name, flags);
2348
0
  if (s == NULL)
2349
0
    return false;
2350
0
  lsect->section = s;
2351
2352
  /* Define the sym on the first section of this name.  */
2353
0
  s = bfd_get_section_by_name (abfd, lsect->name);
2354
2355
0
  lsect->sym = _bfd_elf_define_linkage_sym (abfd, info, s, lsect->sym_name);
2356
0
  if (lsect->sym == NULL)
2357
0
    return false;
2358
0
  lsect->sym->root.u.def.value = 0x8000;
2359
0
  return true;
2360
0
}
2361
2362
static bool
2363
ppc_elf_create_glink (bfd *abfd, struct bfd_link_info *info)
2364
0
{
2365
0
  struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
2366
0
  asection *s;
2367
0
  flagword flags;
2368
0
  int p2align;
2369
2370
0
  flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY | SEC_HAS_CONTENTS
2371
0
     | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2372
0
  s = bfd_make_section_anyway_with_flags (abfd, ".glink", flags);
2373
0
  htab->glink = s;
2374
0
  p2align = htab->params->ppc476_workaround ? 6 : 4;
2375
0
  if (p2align < htab->params->plt_stub_align)
2376
0
    p2align = htab->params->plt_stub_align;
2377
0
  if (s == NULL
2378
0
      || !bfd_set_section_alignment (s, p2align))
2379
0
    return false;
2380
2381
0
  if (!info->no_ld_generated_unwind_info)
2382
0
    {
2383
0
      flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
2384
0
         | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2385
0
      s = bfd_make_section_anyway_with_flags (abfd, ".eh_frame", flags);
2386
0
      htab->glink_eh_frame = s;
2387
0
      if (s == NULL
2388
0
    || !bfd_set_section_alignment (s, 2))
2389
0
  return false;
2390
0
    }
2391
2392
0
  flags = SEC_ALLOC | SEC_LINKER_CREATED;
2393
0
  s = bfd_make_section_anyway_with_flags (abfd, ".iplt", flags);
2394
0
  htab->elf.iplt = s;
2395
0
  if (s == NULL
2396
0
      || !bfd_set_section_alignment (s, 4))
2397
0
    return false;
2398
2399
0
  flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
2400
0
     | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2401
0
  s = bfd_make_section_anyway_with_flags (abfd, ".rela.iplt", flags);
2402
0
  htab->elf.irelplt = s;
2403
0
  if (s == NULL
2404
0
      || ! bfd_set_section_alignment (s, 2))
2405
0
    return false;
2406
2407
  /* Local plt entries.  */
2408
0
  flags = (SEC_ALLOC | SEC_LOAD
2409
0
     | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2410
0
  htab->pltlocal = bfd_make_section_anyway_with_flags (abfd, ".branch_lt",
2411
0
                   flags);
2412
0
  if (htab->pltlocal == NULL
2413
0
      || !bfd_set_section_alignment (htab->pltlocal, 2))
2414
0
    return false;
2415
2416
0
  if (bfd_link_pic (info))
2417
0
    {
2418
0
      flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
2419
0
         | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2420
0
      htab->relpltlocal
2421
0
  = bfd_make_section_anyway_with_flags (abfd, ".rela.branch_lt", flags);
2422
0
      if (htab->relpltlocal == NULL
2423
0
    || !bfd_set_section_alignment (htab->relpltlocal, 2))
2424
0
  return false;
2425
0
    }
2426
2427
0
  if (!ppc_elf_create_linker_section (abfd, info, 0,
2428
0
              &htab->sdata[0]))
2429
0
    return false;
2430
2431
0
  if (!ppc_elf_create_linker_section (abfd, info, SEC_READONLY,
2432
0
              &htab->sdata[1]))
2433
0
    return false;
2434
2435
0
  return true;
2436
0
}
2437
2438
/* We have to create .dynsbss and .rela.sbss here so that they get mapped
2439
   to output sections (just like _bfd_elf_create_dynamic_sections has
2440
   to create .dynbss and .rela.bss).  */
2441
2442
static bool
2443
ppc_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
2444
0
{
2445
0
  struct ppc_elf_link_hash_table *htab;
2446
0
  asection *s;
2447
0
  flagword flags;
2448
2449
0
  htab = ppc_elf_hash_table (info);
2450
2451
0
  if (htab->elf.sgot == NULL
2452
0
      && !ppc_elf_create_got (abfd, info))
2453
0
    return false;
2454
2455
0
  if (!_bfd_elf_create_dynamic_sections (abfd, info))
2456
0
    return false;
2457
2458
0
  if (htab->glink == NULL
2459
0
      && !ppc_elf_create_glink (abfd, info))
2460
0
    return false;
2461
2462
0
  s = bfd_make_section_anyway_with_flags (abfd, ".dynsbss",
2463
0
            SEC_ALLOC | SEC_LINKER_CREATED);
2464
0
  htab->dynsbss = s;
2465
0
  if (s == NULL)
2466
0
    return false;
2467
2468
0
  if (! bfd_link_pic (info))
2469
0
    {
2470
0
      flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
2471
0
         | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2472
0
      s = bfd_make_section_anyway_with_flags (abfd, ".rela.sbss", flags);
2473
0
      htab->relsbss = s;
2474
0
      if (s == NULL
2475
0
    || !bfd_set_section_alignment (s, 2))
2476
0
  return false;
2477
0
    }
2478
2479
0
  if (htab->elf.target_os == is_vxworks
2480
0
      && !elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
2481
0
    return false;
2482
2483
0
  s = htab->elf.splt;
2484
0
  flags = SEC_ALLOC | SEC_CODE | SEC_LINKER_CREATED;
2485
0
  if (htab->plt_type == PLT_VXWORKS)
2486
    /* The VxWorks PLT is a loaded section with contents.  */
2487
0
    flags |= SEC_HAS_CONTENTS | SEC_LOAD | SEC_READONLY;
2488
0
  return bfd_set_section_flags (s, flags);
2489
0
}
2490
2491
/* Copy the extra info we tack onto an elf_link_hash_entry.  */
2492
2493
static void
2494
ppc_elf_copy_indirect_symbol (struct bfd_link_info *info,
2495
            struct elf_link_hash_entry *dir,
2496
            struct elf_link_hash_entry *ind)
2497
0
{
2498
0
  struct ppc_elf_link_hash_entry *edir, *eind;
2499
2500
0
  edir = (struct ppc_elf_link_hash_entry *) dir;
2501
0
  eind = (struct ppc_elf_link_hash_entry *) ind;
2502
2503
0
  edir->tls_mask |= eind->tls_mask;
2504
0
  edir->has_sda_refs |= eind->has_sda_refs;
2505
2506
0
  if (edir->elf.versioned != versioned_hidden)
2507
0
    edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
2508
0
  edir->elf.ref_regular |= eind->elf.ref_regular;
2509
0
  edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
2510
0
  edir->elf.non_got_ref |= eind->elf.non_got_ref;
2511
0
  edir->elf.needs_plt |= eind->elf.needs_plt;
2512
0
  edir->elf.pointer_equality_needed |= eind->elf.pointer_equality_needed;
2513
2514
  /* If we were called to copy over info for a weak sym, that's all.  */
2515
0
  if (eind->elf.root.type != bfd_link_hash_indirect)
2516
0
    return;
2517
2518
0
  if (ind->dyn_relocs != NULL)
2519
0
    {
2520
0
      if (dir->dyn_relocs != NULL)
2521
0
  {
2522
0
    struct elf_dyn_relocs **pp;
2523
0
    struct elf_dyn_relocs *p;
2524
2525
    /* Add reloc counts against the indirect sym to the direct sym
2526
       list.  Merge any entries against the same section.  */
2527
0
    for (pp = &ind->dyn_relocs; (p = *pp) != NULL; )
2528
0
      {
2529
0
        struct elf_dyn_relocs *q;
2530
2531
0
        for (q = dir->dyn_relocs; q != NULL; q = q->next)
2532
0
    if (q->sec == p->sec)
2533
0
      {
2534
0
        q->pc_count += p->pc_count;
2535
0
        q->count += p->count;
2536
0
        *pp = p->next;
2537
0
        break;
2538
0
      }
2539
0
        if (q == NULL)
2540
0
    pp = &p->next;
2541
0
      }
2542
0
    *pp = dir->dyn_relocs;
2543
0
  }
2544
2545
0
      dir->dyn_relocs = ind->dyn_relocs;
2546
0
      ind->dyn_relocs = NULL;
2547
0
    }
2548
2549
  /* Copy over the GOT refcount entries that we may have already seen to
2550
     the symbol which just became indirect.  */
2551
0
  edir->elf.got.refcount += eind->elf.got.refcount;
2552
0
  eind->elf.got.refcount = 0;
2553
2554
  /* And plt entries.  */
2555
0
  if (eind->elf.plt.plist != NULL)
2556
0
    {
2557
0
      if (edir->elf.plt.plist != NULL)
2558
0
  {
2559
0
    struct plt_entry **entp;
2560
0
    struct plt_entry *ent;
2561
2562
0
    for (entp = &eind->elf.plt.plist; (ent = *entp) != NULL; )
2563
0
      {
2564
0
        struct plt_entry *dent;
2565
2566
0
        for (dent = edir->elf.plt.plist; dent != NULL; dent = dent->next)
2567
0
    if (dent->sec == ent->sec && dent->addend == ent->addend)
2568
0
      {
2569
0
        dent->plt.refcount += ent->plt.refcount;
2570
0
        *entp = ent->next;
2571
0
        break;
2572
0
      }
2573
0
        if (dent == NULL)
2574
0
    entp = &ent->next;
2575
0
      }
2576
0
    *entp = edir->elf.plt.plist;
2577
0
  }
2578
2579
0
      edir->elf.plt.plist = eind->elf.plt.plist;
2580
0
      eind->elf.plt.plist = NULL;
2581
0
    }
2582
2583
0
  if (eind->elf.dynindx != -1)
2584
0
    {
2585
0
      if (edir->elf.dynindx != -1)
2586
0
  _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
2587
0
        edir->elf.dynstr_index);
2588
0
      edir->elf.dynindx = eind->elf.dynindx;
2589
0
      edir->elf.dynstr_index = eind->elf.dynstr_index;
2590
0
      eind->elf.dynindx = -1;
2591
0
      eind->elf.dynstr_index = 0;
2592
0
    }
2593
0
}
2594
2595
/* Hook called by the linker routine which adds symbols from an object
2596
   file.  We use it to put .comm items in .sbss, and not .bss.  */
2597
2598
static bool
2599
ppc_elf_add_symbol_hook (bfd *abfd,
2600
       struct bfd_link_info *info,
2601
       Elf_Internal_Sym *sym,
2602
       const char **namep ATTRIBUTE_UNUSED,
2603
       flagword *flagsp ATTRIBUTE_UNUSED,
2604
       asection **secp,
2605
       bfd_vma *valp)
2606
0
{
2607
0
  if (sym->st_shndx == SHN_COMMON
2608
0
      && !bfd_link_relocatable (info)
2609
0
      && is_ppc_elf (info->output_bfd)
2610
0
      && sym->st_size <= elf_gp_size (abfd))
2611
0
    {
2612
      /* Common symbols less than or equal to -G nn bytes are automatically
2613
   put into .sbss.  */
2614
0
      struct ppc_elf_link_hash_table *htab;
2615
2616
0
      htab = ppc_elf_hash_table (info);
2617
0
      if (htab->sbss == NULL)
2618
0
  {
2619
0
    flagword flags = SEC_IS_COMMON | SEC_SMALL_DATA | SEC_LINKER_CREATED;
2620
2621
0
    if (!htab->elf.dynobj)
2622
0
      htab->elf.dynobj = abfd;
2623
2624
0
    htab->sbss = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
2625
0
                 ".sbss",
2626
0
                 flags);
2627
0
    if (htab->sbss == NULL)
2628
0
      return false;
2629
0
  }
2630
2631
0
      *secp = htab->sbss;
2632
0
      *valp = sym->st_size;
2633
0
    }
2634
2635
0
  return true;
2636
0
}
2637

2638
/* Find a linker generated pointer with a given addend and type.  */
2639
2640
static elf_linker_section_pointers_t *
2641
elf_find_pointer_linker_section
2642
  (elf_linker_section_pointers_t *linker_pointers,
2643
   bfd_vma addend,
2644
   elf_linker_section_t *lsect)
2645
0
{
2646
0
  for ( ; linker_pointers != NULL; linker_pointers = linker_pointers->next)
2647
0
    if (lsect == linker_pointers->lsect && addend == linker_pointers->addend)
2648
0
      return linker_pointers;
2649
2650
0
  return NULL;
2651
0
}
2652
2653
/* Allocate a pointer to live in a linker created section.  */
2654
2655
static bool
2656
elf_allocate_pointer_linker_section (bfd *abfd,
2657
             elf_linker_section_t *lsect,
2658
             struct elf_link_hash_entry *h,
2659
             const Elf_Internal_Rela *rel)
2660
0
{
2661
0
  elf_linker_section_pointers_t **ptr_linker_section_ptr = NULL;
2662
0
  elf_linker_section_pointers_t *linker_section_ptr;
2663
0
  unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
2664
0
  bfd_size_type amt;
2665
2666
0
  BFD_ASSERT (lsect != NULL);
2667
2668
  /* Is this a global symbol?  */
2669
0
  if (h != NULL)
2670
0
    {
2671
0
      struct ppc_elf_link_hash_entry *eh;
2672
2673
      /* Has this symbol already been allocated?  If so, our work is done.  */
2674
0
      eh = (struct ppc_elf_link_hash_entry *) h;
2675
0
      if (elf_find_pointer_linker_section (eh->linker_section_pointer,
2676
0
             rel->r_addend,
2677
0
             lsect))
2678
0
  return true;
2679
2680
0
      ptr_linker_section_ptr = &eh->linker_section_pointer;
2681
0
    }
2682
0
  else
2683
0
    {
2684
0
      BFD_ASSERT (is_ppc_elf (abfd));
2685
2686
      /* Allocation of a pointer to a local symbol.  */
2687
0
      elf_linker_section_pointers_t **ptr = elf_local_ptr_offsets (abfd);
2688
2689
      /* Allocate a table to hold the local symbols if first time.  */
2690
0
      if (!ptr)
2691
0
  {
2692
0
    unsigned int num_symbols = elf_symtab_hdr (abfd).sh_info;
2693
2694
0
    amt = num_symbols;
2695
0
    amt *= sizeof (elf_linker_section_pointers_t *);
2696
0
    ptr = bfd_zalloc (abfd, amt);
2697
2698
0
    if (!ptr)
2699
0
      return false;
2700
2701
0
    elf_local_ptr_offsets (abfd) = ptr;
2702
0
  }
2703
2704
      /* Has this symbol already been allocated?  If so, our work is done.  */
2705
0
      if (elf_find_pointer_linker_section (ptr[r_symndx],
2706
0
             rel->r_addend,
2707
0
             lsect))
2708
0
  return true;
2709
2710
0
      ptr_linker_section_ptr = &ptr[r_symndx];
2711
0
    }
2712
2713
  /* Allocate space for a pointer in the linker section, and allocate
2714
     a new pointer record from internal memory.  */
2715
0
  BFD_ASSERT (ptr_linker_section_ptr != NULL);
2716
0
  amt = sizeof (elf_linker_section_pointers_t);
2717
0
  linker_section_ptr = bfd_alloc (abfd, amt);
2718
2719
0
  if (!linker_section_ptr)
2720
0
    return false;
2721
2722
0
  linker_section_ptr->next = *ptr_linker_section_ptr;
2723
0
  linker_section_ptr->addend = rel->r_addend;
2724
0
  linker_section_ptr->lsect = lsect;
2725
0
  *ptr_linker_section_ptr = linker_section_ptr;
2726
2727
0
  if (!bfd_set_section_alignment (lsect->section, 2))
2728
0
    return false;
2729
0
  linker_section_ptr->offset = lsect->section->size;
2730
0
  lsect->section->size += 4;
2731
2732
#ifdef DEBUG
2733
  fprintf (stderr,
2734
     "Create pointer in linker section %s, offset = %ld, section size = %ld\n",
2735
     lsect->name, (long) linker_section_ptr->offset,
2736
     (long) lsect->section->size);
2737
#endif
2738
2739
0
  return true;
2740
0
}
2741
2742
static struct plt_entry **
2743
update_local_sym_info (bfd *abfd,
2744
           Elf_Internal_Shdr *symtab_hdr,
2745
           unsigned long r_symndx,
2746
           int tls_type)
2747
0
{
2748
0
  bfd_signed_vma *local_got_refcounts = elf_local_got_refcounts (abfd);
2749
0
  struct plt_entry **local_plt;
2750
0
  unsigned char *local_got_tls_masks;
2751
2752
0
  if (local_got_refcounts == NULL)
2753
0
    {
2754
0
      bfd_size_type size = symtab_hdr->sh_info;
2755
2756
0
      size *= (sizeof (*local_got_refcounts)
2757
0
         + sizeof (*local_plt)
2758
0
         + sizeof (*local_got_tls_masks));
2759
0
      local_got_refcounts = bfd_zalloc (abfd, size);
2760
0
      if (local_got_refcounts == NULL)
2761
0
  return NULL;
2762
0
      elf_local_got_refcounts (abfd) = local_got_refcounts;
2763
0
    }
2764
2765
0
  local_plt = (struct plt_entry **) (local_got_refcounts + symtab_hdr->sh_info);
2766
0
  local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
2767
0
  local_got_tls_masks[r_symndx] |= tls_type & 0xff;
2768
0
  if ((tls_type & NON_GOT) == 0)
2769
0
    local_got_refcounts[r_symndx] += 1;
2770
0
  return local_plt + r_symndx;
2771
0
}
2772
2773
static bool
2774
update_plt_info (bfd *abfd, struct plt_entry **plist,
2775
     asection *sec, bfd_vma addend)
2776
0
{
2777
0
  struct plt_entry *ent;
2778
2779
0
  if (addend < 32768)
2780
0
    sec = NULL;
2781
0
  for (ent = *plist; ent != NULL; ent = ent->next)
2782
0
    if (ent->sec == sec && ent->addend == addend)
2783
0
      break;
2784
0
  if (ent == NULL)
2785
0
    {
2786
0
      size_t amt = sizeof (*ent);
2787
0
      ent = bfd_alloc (abfd, amt);
2788
0
      if (ent == NULL)
2789
0
  return false;
2790
0
      ent->next = *plist;
2791
0
      ent->sec = sec;
2792
0
      ent->addend = addend;
2793
0
      ent->plt.refcount = 0;
2794
0
      *plist = ent;
2795
0
    }
2796
0
  ent->plt.refcount += 1;
2797
0
  return true;
2798
0
}
2799
2800
static struct plt_entry *
2801
find_plt_ent (struct plt_entry **plist, asection *sec, bfd_vma addend)
2802
0
{
2803
0
  struct plt_entry *ent;
2804
2805
0
  if (addend < 32768)
2806
0
    sec = NULL;
2807
0
  for (ent = *plist; ent != NULL; ent = ent->next)
2808
0
    if (ent->sec == sec && ent->addend == addend)
2809
0
      break;
2810
0
  return ent;
2811
0
}
2812
2813
static bool
2814
is_branch_reloc (enum elf_ppc_reloc_type r_type)
2815
0
{
2816
0
  return (r_type == R_PPC_PLTREL24
2817
0
    || r_type == R_PPC_LOCAL24PC
2818
0
    || r_type == R_PPC_REL24
2819
0
    || r_type == R_PPC_REL14
2820
0
    || r_type == R_PPC_REL14_BRTAKEN
2821
0
    || r_type == R_PPC_REL14_BRNTAKEN
2822
0
    || r_type == R_PPC_ADDR24
2823
0
    || r_type == R_PPC_ADDR14
2824
0
    || r_type == R_PPC_ADDR14_BRTAKEN
2825
0
    || r_type == R_PPC_ADDR14_BRNTAKEN
2826
0
    || r_type == R_PPC_VLE_REL24);
2827
0
}
2828
2829
/* Relocs on inline plt call sequence insns prior to the call.  */
2830
2831
static bool
2832
is_plt_seq_reloc (enum elf_ppc_reloc_type r_type)
2833
0
{
2834
0
  return (r_type == R_PPC_PLT16_HA
2835
0
    || r_type == R_PPC_PLT16_HI
2836
0
    || r_type == R_PPC_PLT16_LO
2837
0
    || r_type == R_PPC_PLTSEQ);
2838
0
}
2839
2840
/* Like bfd_reloc_offset_in_range but without a howto.  Return true
2841
   iff a field of SIZE bytes at OFFSET is within SEC limits.  */
2842
2843
static bool
2844
offset_in_range (asection *sec, bfd_vma offset, size_t size)
2845
0
{
2846
0
  return offset <= sec->size && size <= sec->size - offset;
2847
0
}
2848
2849
static void
2850
bad_shared_reloc (bfd *abfd, enum elf_ppc_reloc_type r_type)
2851
0
{
2852
0
  _bfd_error_handler
2853
    /* xgettext:c-format */
2854
0
    (_("%pB: relocation %s cannot be used when making a shared object"),
2855
0
     abfd,
2856
0
     ppc_elf_howto_table[r_type]->name);
2857
0
  bfd_set_error (bfd_error_bad_value);
2858
0
}
2859
2860
/* Look through the relocs for a section during the first phase, and
2861
   allocate space in the global offset table or procedure linkage
2862
   table.  */
2863
2864
static bool
2865
ppc_elf_check_relocs (bfd *abfd,
2866
          struct bfd_link_info *info,
2867
          asection *sec,
2868
          const Elf_Internal_Rela *relocs)
2869
0
{
2870
0
  struct ppc_elf_link_hash_table *htab;
2871
0
  Elf_Internal_Shdr *symtab_hdr;
2872
0
  struct elf_link_hash_entry **sym_hashes;
2873
0
  const Elf_Internal_Rela *rel;
2874
0
  const Elf_Internal_Rela *rel_end;
2875
0
  asection *got2, *sreloc;
2876
0
  struct elf_link_hash_entry *tga;
2877
2878
0
  if (bfd_link_relocatable (info))
2879
0
    return true;
2880
2881
#ifdef DEBUG
2882
  _bfd_error_handler ("ppc_elf_check_relocs called for section %pA in %pB",
2883
          sec, abfd);
2884
#endif
2885
2886
0
  BFD_ASSERT (is_ppc_elf (abfd));
2887
2888
  /* Initialize howto table if not already done.  */
2889
0
  if (!ppc_elf_howto_table[R_PPC_ADDR32])
2890
0
    ppc_elf_howto_init ();
2891
2892
0
  htab = ppc_elf_hash_table (info);
2893
0
  if (htab->glink == NULL)
2894
0
    {
2895
0
      if (htab->elf.dynobj == NULL)
2896
0
  htab->elf.dynobj = abfd;
2897
0
      if (!ppc_elf_create_glink (htab->elf.dynobj, info))
2898
0
  return false;
2899
0
    }
2900
0
  tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
2901
0
            false, false, true);
2902
0
  symtab_hdr = &elf_symtab_hdr (abfd);
2903
0
  sym_hashes = elf_sym_hashes (abfd);
2904
0
  got2 = bfd_get_section_by_name (abfd, ".got2");
2905
0
  sreloc = NULL;
2906
2907
0
  rel_end = relocs + sec->reloc_count;
2908
0
  for (rel = relocs; rel < rel_end; rel++)
2909
0
    {
2910
0
      unsigned long r_symndx;
2911
0
      enum elf_ppc_reloc_type r_type;
2912
0
      struct elf_link_hash_entry *h;
2913
0
      Elf_Internal_Sym *isym;
2914
0
      int tls_type;
2915
0
      struct plt_entry **ifunc;
2916
0
      struct plt_entry **pltent;
2917
0
      bfd_vma addend;
2918
2919
0
      r_symndx = ELF32_R_SYM (rel->r_info);
2920
0
      if (r_symndx < symtab_hdr->sh_info)
2921
0
  {
2922
0
    h = NULL;
2923
0
    isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, abfd, r_symndx);
2924
0
    if (isym == NULL)
2925
0
      return false;
2926
0
  }
2927
0
      else
2928
0
  {
2929
0
    h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2930
0
    while (h->root.type == bfd_link_hash_indirect
2931
0
     || h->root.type == bfd_link_hash_warning)
2932
0
      h = (struct elf_link_hash_entry *) h->root.u.i.link;
2933
0
    isym = NULL;
2934
0
  }
2935
2936
      /* If a relocation refers to _GLOBAL_OFFSET_TABLE_, create the .got.
2937
   This shows up in particular in an R_PPC_ADDR32 in the eabi
2938
   startup code.  */
2939
0
      if (h != NULL
2940
0
    && htab->elf.sgot == NULL
2941
0
    && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2942
0
  {
2943
0
    if (htab->elf.dynobj == NULL)
2944
0
      htab->elf.dynobj = abfd;
2945
0
    if (!ppc_elf_create_got (htab->elf.dynobj, info))
2946
0
      return false;
2947
0
    BFD_ASSERT (h == htab->elf.hgot);
2948
0
  }
2949
2950
0
      tls_type = 0;
2951
0
      r_type = ELF32_R_TYPE (rel->r_info);
2952
0
      ifunc = NULL;
2953
0
      if (h != NULL)
2954
0
  {
2955
0
    if (h->type == STT_GNU_IFUNC)
2956
0
      {
2957
0
        h->needs_plt = 1;
2958
0
        ifunc = &h->plt.plist;
2959
0
      }
2960
0
  }
2961
0
      else if (htab->elf.target_os != is_vxworks)
2962
0
  {
2963
0
    if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
2964
0
      {
2965
        /* Set PLT_IFUNC flag for this sym, no GOT entry yet.  */
2966
0
        ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
2967
0
               NON_GOT | PLT_IFUNC);
2968
0
        if (ifunc == NULL)
2969
0
    return false;
2970
2971
        /* STT_GNU_IFUNC symbols must have a PLT entry;
2972
     In a non-pie executable even when there are
2973
     no plt calls.  */
2974
0
        if (!bfd_link_pic (info)
2975
0
      || is_branch_reloc (r_type)
2976
0
      || r_type == R_PPC_PLT16_LO
2977
0
      || r_type == R_PPC_PLT16_HI
2978
0
      || r_type == R_PPC_PLT16_HA)
2979
0
    {
2980
0
      addend = 0;
2981
0
      if (r_type == R_PPC_PLTREL24)
2982
0
        ppc_elf_tdata (abfd)->makes_plt_call = 1;
2983
0
      if (bfd_link_pic (info)
2984
0
          && (r_type == R_PPC_PLTREL24
2985
0
        || r_type == R_PPC_PLT16_LO
2986
0
        || r_type == R_PPC_PLT16_HI
2987
0
        || r_type == R_PPC_PLT16_HA))
2988
0
        addend = rel->r_addend;
2989
0
      if (!update_plt_info (abfd, ifunc, got2, addend))
2990
0
        return false;
2991
0
    }
2992
0
      }
2993
0
  }
2994
2995
0
      if (htab->elf.target_os != is_vxworks
2996
0
    && is_branch_reloc (r_type)
2997
0
    && h != NULL
2998
0
    && h == tga)
2999
0
  {
3000
0
    if (rel != relocs
3001
0
        && (ELF32_R_TYPE (rel[-1].r_info) == R_PPC_TLSGD
3002
0
      || ELF32_R_TYPE (rel[-1].r_info) == R_PPC_TLSLD))
3003
      /* We have a new-style __tls_get_addr call with a marker
3004
         reloc.  */
3005
0
      ;
3006
0
    else
3007
      /* Mark this section as having an old-style call.  */
3008
0
      sec->nomark_tls_get_addr = 1;
3009
0
  }
3010
3011
0
      switch (r_type)
3012
0
  {
3013
0
  case R_PPC_TLSGD:
3014
0
  case R_PPC_TLSLD:
3015
    /* These special tls relocs tie a call to __tls_get_addr with
3016
       its parameter symbol.  */
3017
0
    if (h != NULL)
3018
0
      ppc_elf_hash_entry (h)->tls_mask |= TLS_TLS | TLS_MARK;
3019
0
    else
3020
0
      if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
3021
0
          NON_GOT | TLS_TLS | TLS_MARK))
3022
0
        return false;
3023
0
    break;
3024
3025
0
  case R_PPC_PLTSEQ:
3026
0
    break;
3027
3028
0
  case R_PPC_GOT_TLSLD16:
3029
0
  case R_PPC_GOT_TLSLD16_LO:
3030
0
  case R_PPC_GOT_TLSLD16_HI:
3031
0
  case R_PPC_GOT_TLSLD16_HA:
3032
0
    tls_type = TLS_TLS | TLS_LD;
3033
0
    goto dogottls;
3034
3035
0
  case R_PPC_GOT_TLSGD16:
3036
0
  case R_PPC_GOT_TLSGD16_LO:
3037
0
  case R_PPC_GOT_TLSGD16_HI:
3038
0
  case R_PPC_GOT_TLSGD16_HA:
3039
0
    tls_type = TLS_TLS | TLS_GD;
3040
0
    goto dogottls;
3041
3042
0
  case R_PPC_GOT_TPREL16:
3043
0
  case R_PPC_GOT_TPREL16_LO:
3044
0
  case R_PPC_GOT_TPREL16_HI:
3045
0
  case R_PPC_GOT_TPREL16_HA:
3046
0
    if (bfd_link_dll (info))
3047
0
      info->flags |= DF_STATIC_TLS;
3048
0
    tls_type = TLS_TLS | TLS_TPREL;
3049
0
    goto dogottls;
3050
3051
0
  case R_PPC_GOT_DTPREL16:
3052
0
  case R_PPC_GOT_DTPREL16_LO:
3053
0
  case R_PPC_GOT_DTPREL16_HI:
3054
0
  case R_PPC_GOT_DTPREL16_HA:
3055
0
    tls_type = TLS_TLS | TLS_DTPREL;
3056
0
  dogottls:
3057
0
    sec->has_tls_reloc = 1;
3058
    /* Fall through.  */
3059
3060
    /* GOT16 relocations */
3061
0
  case R_PPC_GOT16:
3062
0
  case R_PPC_GOT16_LO:
3063
0
  case R_PPC_GOT16_HI:
3064
0
  case R_PPC_GOT16_HA:
3065
    /* This symbol requires a global offset table entry.  */
3066
0
    if (htab->elf.sgot == NULL)
3067
0
      {
3068
0
        if (htab->elf.dynobj == NULL)
3069
0
    htab->elf.dynobj = abfd;
3070
0
        if (!ppc_elf_create_got (htab->elf.dynobj, info))
3071
0
    return false;
3072
0
      }
3073
0
    if (h != NULL)
3074
0
      {
3075
0
        h->got.refcount += 1;
3076
0
        ppc_elf_hash_entry (h)->tls_mask |= tls_type;
3077
0
      }
3078
0
    else
3079
      /* This is a global offset table entry for a local symbol.  */
3080
0
      if (!update_local_sym_info (abfd, symtab_hdr, r_symndx, tls_type))
3081
0
        return false;
3082
3083
    /* We may also need a plt entry if the symbol turns out to be
3084
       an ifunc.  */
3085
0
    if (h != NULL && !bfd_link_pic (info))
3086
0
      {
3087
0
        if (!update_plt_info (abfd, &h->plt.plist, NULL, 0))
3088
0
    return false;
3089
0
      }
3090
0
    break;
3091
3092
    /* Indirect .sdata relocation.  */
3093
0
  case R_PPC_EMB_SDAI16:
3094
0
    htab->sdata[0].sym->ref_regular = 1;
3095
0
    if (!elf_allocate_pointer_linker_section (abfd, &htab->sdata[0],
3096
0
                h, rel))
3097
0
      return false;
3098
0
    if (h != NULL)
3099
0
      {
3100
0
        ppc_elf_hash_entry (h)->has_sda_refs = true;
3101
0
        h->non_got_ref = true;
3102
0
      }
3103
0
    break;
3104
3105
    /* Indirect .sdata2 relocation.  */
3106
0
  case R_PPC_EMB_SDA2I16:
3107
0
    if (!bfd_link_executable (info))
3108
0
      {
3109
0
        bad_shared_reloc (abfd, r_type);
3110
0
        return false;
3111
0
      }
3112
0
    htab->sdata[1].sym->ref_regular = 1;
3113
0
    if (!elf_allocate_pointer_linker_section (abfd, &htab->sdata[1],
3114
0
                h, rel))
3115
0
      return false;
3116
0
    if (h != NULL)
3117
0
      {
3118
0
        ppc_elf_hash_entry (h)->has_sda_refs = true;
3119
0
        h->non_got_ref = true;
3120
0
      }
3121
0
    break;
3122
3123
0
  case R_PPC_SDAREL16:
3124
0
    htab->sdata[0].sym->ref_regular = 1;
3125
    /* Fall through.  */
3126
3127
0
  case R_PPC_VLE_SDAREL_LO16A:
3128
0
  case R_PPC_VLE_SDAREL_LO16D:
3129
0
  case R_PPC_VLE_SDAREL_HI16A:
3130
0
  case R_PPC_VLE_SDAREL_HI16D:
3131
0
  case R_PPC_VLE_SDAREL_HA16A:
3132
0
  case R_PPC_VLE_SDAREL_HA16D:
3133
0
    if (h != NULL)
3134
0
      {
3135
0
        ppc_elf_hash_entry (h)->has_sda_refs = true;
3136
0
        h->non_got_ref = true;
3137
0
      }
3138
0
    break;
3139
3140
0
  case R_PPC_VLE_REL8:
3141
0
  case R_PPC_VLE_REL15:
3142
0
  case R_PPC_VLE_REL24:
3143
0
  case R_PPC_VLE_LO16A:
3144
0
  case R_PPC_VLE_LO16D:
3145
0
  case R_PPC_VLE_HI16A:
3146
0
  case R_PPC_VLE_HI16D:
3147
0
  case R_PPC_VLE_HA16A:
3148
0
  case R_PPC_VLE_HA16D:
3149
0
  case R_PPC_VLE_ADDR20:
3150
0
    break;
3151
3152
0
  case R_PPC_EMB_SDA2REL:
3153
0
    if (!bfd_link_executable (info))
3154
0
      {
3155
0
        bad_shared_reloc (abfd, r_type);
3156
0
        return false;
3157
0
      }
3158
0
    htab->sdata[1].sym->ref_regular = 1;
3159
0
    if (h != NULL)
3160
0
      {
3161
0
        ppc_elf_hash_entry (h)->has_sda_refs = true;
3162
0
        h->non_got_ref = true;
3163
0
      }
3164
0
    break;
3165
3166
0
  case R_PPC_VLE_SDA21_LO:
3167
0
  case R_PPC_VLE_SDA21:
3168
0
  case R_PPC_EMB_SDA21:
3169
0
  case R_PPC_EMB_RELSDA:
3170
0
    if (h != NULL)
3171
0
      {
3172
0
        ppc_elf_hash_entry (h)->has_sda_refs = true;
3173
0
        h->non_got_ref = true;
3174
0
      }
3175
0
    break;
3176
3177
0
  case R_PPC_EMB_NADDR32:
3178
0
  case R_PPC_EMB_NADDR16:
3179
0
  case R_PPC_EMB_NADDR16_LO:
3180
0
  case R_PPC_EMB_NADDR16_HI:
3181
0
  case R_PPC_EMB_NADDR16_HA:
3182
0
    if (h != NULL)
3183
0
      h->non_got_ref = true;
3184
0
    break;
3185
3186
0
  case R_PPC_PLTREL24:
3187
0
    if (h == NULL)
3188
0
      break;
3189
0
    ppc_elf_tdata (abfd)->makes_plt_call = 1;
3190
0
    goto pltentry;
3191
3192
0
  case R_PPC_PLTCALL:
3193
0
    sec->has_pltcall = 1;
3194
    /* Fall through.  */
3195
3196
0
  case R_PPC_PLT32:
3197
0
  case R_PPC_PLTREL32:
3198
0
  case R_PPC_PLT16_LO:
3199
0
  case R_PPC_PLT16_HI:
3200
0
  case R_PPC_PLT16_HA:
3201
0
  pltentry:
3202
#ifdef DEBUG
3203
    fprintf (stderr, "Reloc requires a PLT entry\n");
3204
#endif
3205
    /* This symbol requires a procedure linkage table entry.  */
3206
0
    if (h == NULL)
3207
0
      {
3208
0
        pltent = update_local_sym_info (abfd, symtab_hdr, r_symndx,
3209
0
                NON_GOT | PLT_KEEP);
3210
0
        if (pltent == NULL)
3211
0
    return false;
3212
0
      }
3213
0
    else
3214
0
      {
3215
0
        if (r_type != R_PPC_PLTREL24)
3216
0
    ppc_elf_hash_entry (h)->tls_mask |= PLT_KEEP;
3217
0
        h->needs_plt = 1;
3218
0
        pltent = &h->plt.plist;
3219
0
      }
3220
0
    addend = 0;
3221
0
    if (bfd_link_pic (info)
3222
0
        && (r_type == R_PPC_PLTREL24
3223
0
      || r_type == R_PPC_PLT16_LO
3224
0
      || r_type == R_PPC_PLT16_HI
3225
0
      || r_type == R_PPC_PLT16_HA))
3226
0
      addend = rel->r_addend;
3227
0
    if (!update_plt_info (abfd, pltent, got2, addend))
3228
0
      return false;
3229
0
    break;
3230
3231
    /* The following relocations don't need to propagate the
3232
       relocation if linking a shared object since they are
3233
       section relative.  */
3234
0
  case R_PPC_SECTOFF:
3235
0
  case R_PPC_SECTOFF_LO:
3236
0
  case R_PPC_SECTOFF_HI:
3237
0
  case R_PPC_SECTOFF_HA:
3238
0
  case R_PPC_DTPREL16:
3239
0
  case R_PPC_DTPREL16_LO:
3240
0
  case R_PPC_DTPREL16_HI:
3241
0
  case R_PPC_DTPREL16_HA:
3242
0
  case R_PPC_TOC16:
3243
0
    break;
3244
3245
0
  case R_PPC_REL16:
3246
0
  case R_PPC_REL16_LO:
3247
0
  case R_PPC_REL16_HI:
3248
0
  case R_PPC_REL16_HA:
3249
0
  case R_PPC_REL16DX_HA:
3250
0
    ppc_elf_tdata (abfd)->has_rel16 = 1;
3251
0
    break;
3252
3253
    /* These are just markers.  */
3254
0
  case R_PPC_TLS:
3255
0
  case R_PPC_EMB_MRKREF:
3256
0
  case R_PPC_NONE:
3257
0
  case R_PPC_max:
3258
0
  case R_PPC_RELAX:
3259
0
  case R_PPC_RELAX_PLT:
3260
0
  case R_PPC_RELAX_PLTREL24:
3261
0
  case R_PPC_16DX_HA:
3262
0
    break;
3263
3264
    /* These should only appear in dynamic objects.  */
3265
0
  case R_PPC_COPY:
3266
0
  case R_PPC_GLOB_DAT:
3267
0
  case R_PPC_JMP_SLOT:
3268
0
  case R_PPC_RELATIVE:
3269
0
  case R_PPC_IRELATIVE:
3270
0
    break;
3271
3272
    /* These aren't handled yet.  We'll report an error later.  */
3273
0
  case R_PPC_ADDR30:
3274
0
  case R_PPC_EMB_RELSEC16:
3275
0
  case R_PPC_EMB_RELST_LO:
3276
0
  case R_PPC_EMB_RELST_HI:
3277
0
  case R_PPC_EMB_RELST_HA:
3278
0
  case R_PPC_EMB_BIT_FLD:
3279
0
    break;
3280
3281
    /* This refers only to functions defined in the shared library.  */
3282
0
  case R_PPC_LOCAL24PC:
3283
0
    if (h != NULL && h == htab->elf.hgot && htab->plt_type == PLT_UNSET)
3284
0
      {
3285
0
        htab->plt_type = PLT_OLD;
3286
0
        htab->old_bfd = abfd;
3287
0
      }
3288
0
    if (h != NULL
3289
0
        && ifunc != NULL
3290
0
        && !update_plt_info (abfd, ifunc, NULL, 0))
3291
0
      return false;
3292
0
    break;
3293
3294
    /* This relocation describes the C++ object vtable hierarchy.
3295
       Reconstruct it for later use during GC.  */
3296
0
  case R_PPC_GNU_VTINHERIT:
3297
0
    if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
3298
0
      return false;
3299
0
    break;
3300
3301
    /* This relocation describes which C++ vtable entries are actually
3302
       used.  Record for later use during GC.  */
3303
0
  case R_PPC_GNU_VTENTRY:
3304
0
    if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
3305
0
      return false;
3306
0
    break;
3307
3308
0
  case R_PPC_TPREL16_HI:
3309
0
  case R_PPC_TPREL16_HA:
3310
0
    sec->has_tls_reloc = 1;
3311
    /* Fall through.  */
3312
    /* We shouldn't really be seeing TPREL32.  */
3313
0
  case R_PPC_TPREL32:
3314
0
  case R_PPC_TPREL16:
3315
0
  case R_PPC_TPREL16_LO:
3316
0
    if (bfd_link_dll (info))
3317
0
      info->flags |= DF_STATIC_TLS;
3318
0
    goto dodyn;
3319
3320
    /* Nor these.  */
3321
0
  case R_PPC_DTPMOD32:
3322
0
  case R_PPC_DTPREL32:
3323
0
    goto dodyn;
3324
3325
0
  case R_PPC_REL32:
3326
0
    if (h == NULL
3327
0
        && got2 != NULL
3328
0
        && (sec->flags & SEC_CODE) != 0
3329
0
        && bfd_link_pic (info)
3330
0
        && htab->plt_type == PLT_UNSET)
3331
0
      {
3332
        /* Old -fPIC gcc code has .long LCTOC1-LCFx just before
3333
     the start of a function, which assembles to a REL32
3334
     reference to .got2.  If we detect one of these, then
3335
     force the old PLT layout because the linker cannot
3336
     reliably deduce the GOT pointer value needed for
3337
     PLT call stubs.  */
3338
0
        asection *s;
3339
3340
0
        s = bfd_section_from_elf_index (abfd, isym->st_shndx);
3341
0
        if (s == got2)
3342
0
    {
3343
0
      htab->plt_type = PLT_OLD;
3344
0
      htab->old_bfd = abfd;
3345
0
    }
3346
0
      }
3347
0
    if (h == NULL || h == htab->elf.hgot)
3348
0
      break;
3349
    /* fall through */
3350
3351
0
  case R_PPC_ADDR32:
3352
0
  case R_PPC_ADDR16:
3353
0
  case R_PPC_ADDR16_LO:
3354
0
  case R_PPC_ADDR16_HI:
3355
0
  case R_PPC_ADDR16_HA:
3356
0
  case R_PPC_UADDR32:
3357
0
  case R_PPC_UADDR16:
3358
0
    if (h != NULL && !bfd_link_pic (info))
3359
0
      {
3360
        /* We may need a plt entry if the symbol turns out to be
3361
     a function defined in a dynamic object.  */
3362
0
        if (!update_plt_info (abfd, &h->plt.plist, NULL, 0))
3363
0
    return false;
3364
3365
        /* We may need a copy reloc too.  */
3366
0
        h->non_got_ref = 1;
3367
0
        h->pointer_equality_needed = 1;
3368
0
        if (r_type == R_PPC_ADDR16_HA)
3369
0
    ppc_elf_hash_entry (h)->has_addr16_ha = 1;
3370
0
        if (r_type == R_PPC_ADDR16_LO)
3371
0
    ppc_elf_hash_entry (h)->has_addr16_lo = 1;
3372
0
      }
3373
0
    goto dodyn;
3374
3375
0
  case R_PPC_REL24:
3376
0
  case R_PPC_REL14:
3377
0
  case R_PPC_REL14_BRTAKEN:
3378
0
  case R_PPC_REL14_BRNTAKEN:
3379
0
    if (h == NULL)
3380
0
      break;
3381
0
    if (h == htab->elf.hgot)
3382
0
      {
3383
0
        if (htab->plt_type == PLT_UNSET)
3384
0
    {
3385
0
      htab->plt_type = PLT_OLD;
3386
0
      htab->old_bfd = abfd;
3387
0
    }
3388
0
        break;
3389
0
      }
3390
    /* fall through */
3391
3392
0
  case R_PPC_ADDR24:
3393
0
  case R_PPC_ADDR14:
3394
0
  case R_PPC_ADDR14_BRTAKEN:
3395
0
  case R_PPC_ADDR14_BRNTAKEN:
3396
0
    if (h != NULL && !bfd_link_pic (info))
3397
0
      {
3398
        /* We may need a plt entry if the symbol turns out to be
3399
     a function defined in a dynamic object.  */
3400
0
        h->needs_plt = 1;
3401
0
        if (!update_plt_info (abfd, &h->plt.plist, NULL, 0))
3402
0
    return false;
3403
0
        break;
3404
0
      }
3405
3406
0
  dodyn:
3407
    /* Set up information for symbols that might need dynamic
3408
       relocations.  At this point in linking we have read all
3409
       the input files and resolved most symbols, but have not
3410
       yet decided whether symbols are dynamic or finalized
3411
       symbol flags.  In some cases we might be setting dynamic
3412
       reloc info for symbols that do not end up needing such.
3413
       That's OK, adjust_dynamic_symbol and allocate_dynrelocs
3414
       work together with this code.  */
3415
0
    if ((h != NULL
3416
0
         && !SYMBOL_REFERENCES_LOCAL (info, h))
3417
0
        || (bfd_link_pic (info)
3418
0
      && (h != NULL
3419
0
          ? !bfd_is_abs_symbol (&h->root)
3420
0
          : isym->st_shndx != SHN_ABS)
3421
0
      && must_be_dyn_reloc (info, r_type)))
3422
0
      {
3423
#ifdef DEBUG
3424
        fprintf (stderr,
3425
           "ppc_elf_check_relocs needs to "
3426
           "create relocation for %s\n",
3427
           (h && h->root.root.string
3428
      ? h->root.root.string : "<unknown>"));
3429
#endif
3430
0
        if (sreloc == NULL)
3431
0
    {
3432
0
      if (htab->elf.dynobj == NULL)
3433
0
        htab->elf.dynobj = abfd;
3434
3435
0
      sreloc = _bfd_elf_make_dynamic_reloc_section
3436
0
        (sec, htab->elf.dynobj, 2, abfd, /*rela?*/ true);
3437
3438
0
      if (sreloc == NULL)
3439
0
        return false;
3440
0
    }
3441
3442
        /* If this is a global symbol, we count the number of
3443
     relocations we need for this symbol.  */
3444
0
        if (h != NULL)
3445
0
    {
3446
0
      struct elf_dyn_relocs *p;
3447
0
      struct elf_dyn_relocs **rel_head;
3448
3449
0
      rel_head = &h->dyn_relocs;
3450
0
      p = *rel_head;
3451
0
      if (p == NULL || p->sec != sec)
3452
0
        {
3453
0
          p = bfd_alloc (htab->elf.dynobj, sizeof *p);
3454
0
          if (p == NULL)
3455
0
      return false;
3456
0
          p->next = *rel_head;
3457
0
          *rel_head = p;
3458
0
          p->sec = sec;
3459
0
          p->count = 0;
3460
0
          p->pc_count = 0;
3461
0
        }
3462
0
      p->count += 1;
3463
0
      if (!must_be_dyn_reloc (info, r_type))
3464
0
        p->pc_count += 1;
3465
0
    }
3466
0
        else
3467
0
    {
3468
      /* Track dynamic relocs needed for local syms too.
3469
         We really need local syms available to do this
3470
         easily.  Oh well.  */
3471
0
      struct ppc_dyn_relocs *p;
3472
0
      struct ppc_dyn_relocs **rel_head;
3473
0
      bool is_ifunc;
3474
0
      asection *s;
3475
0
      void *vpp;
3476
3477
0
      s = bfd_section_from_elf_index (abfd, isym->st_shndx);
3478
0
      if (s == NULL)
3479
0
        s = sec;
3480
3481
0
      vpp = &elf_section_data (s)->local_dynrel;
3482
0
      rel_head = (struct ppc_dyn_relocs **) vpp;
3483
0
      is_ifunc = ifunc != NULL;
3484
0
      p = *rel_head;
3485
0
      if (p != NULL && p->sec == sec && p->ifunc != is_ifunc)
3486
0
        p = p->next;
3487
0
      if (p == NULL || p->sec != sec || p->ifunc != is_ifunc)
3488
0
        {
3489
0
          p = bfd_alloc (htab->elf.dynobj, sizeof *p);
3490
0
          if (p == NULL)
3491
0
      return false;
3492
0
          p->next = *rel_head;
3493
0
          *rel_head = p;
3494
0
          p->sec = sec;
3495
0
          p->ifunc = is_ifunc;
3496
0
          p->count = 0;
3497
0
        }
3498
0
      p->count += 1;
3499
0
    }
3500
0
      }
3501
3502
0
    break;
3503
0
  }
3504
0
    }
3505
3506
0
  return true;
3507
0
}
3508

3509
/* Warn for conflicting Tag_GNU_Power_ABI_FP attributes between IBFD
3510
   and OBFD, and merge non-conflicting ones.  */
3511
bool
3512
_bfd_elf_ppc_merge_fp_attributes (bfd *ibfd, struct bfd_link_info *info)
3513
0
{
3514
0
  bfd *obfd = info->output_bfd;
3515
0
  obj_attribute *in_attr, *in_attrs;
3516
0
  obj_attribute *out_attr, *out_attrs;
3517
0
  bool ret = true;
3518
0
  bool warn_only;
3519
3520
  /* We only warn about shared library mismatches, because common
3521
     libraries advertise support for a particular long double variant
3522
     but actually support more than one variant.  For example, glibc
3523
     typically supports 128-bit IBM long double in the shared library
3524
     but has a compatibility static archive for 64-bit long double.
3525
     The linker doesn't have the smarts to see that an app using
3526
     object files marked as 64-bit long double call the compatibility
3527
     layer objects and only from there call into the shared library.  */
3528
0
  warn_only = (ibfd->flags & DYNAMIC) != 0;
3529
3530
0
  in_attrs = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
3531
0
  out_attrs = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
3532
3533
0
  in_attr = &in_attrs[Tag_GNU_Power_ABI_FP];
3534
0
  out_attr = &out_attrs[Tag_GNU_Power_ABI_FP];
3535
3536
0
  if (in_attr->i != out_attr->i)
3537
0
    {
3538
0
      int in_fp = in_attr->i & 3;
3539
0
      int out_fp = out_attr->i & 3;
3540
0
      static bfd *last_fp, *last_ld;
3541
3542
0
      if (in_fp == 0)
3543
0
  ;
3544
0
      else if (out_fp == 0)
3545
0
  {
3546
0
    if (!warn_only)
3547
0
      {
3548
0
        out_attr->type = ATTR_TYPE_FLAG_INT_VAL;
3549
0
        out_attr->i ^= in_fp;
3550
0
        last_fp = ibfd;
3551
0
      }
3552
0
  }
3553
0
      else if (out_fp != 2 && in_fp == 2)
3554
0
  {
3555
0
    _bfd_error_handler
3556
      /* xgettext:c-format */
3557
0
      (_("%pB uses hard float, %pB uses soft float"),
3558
0
       last_fp, ibfd);
3559
0
    ret = warn_only;
3560
0
  }
3561
0
      else if (out_fp == 2 && in_fp != 2)
3562
0
  {
3563
0
    _bfd_error_handler
3564
      /* xgettext:c-format */
3565
0
      (_("%pB uses hard float, %pB uses soft float"),
3566
0
       ibfd, last_fp);
3567
0
    ret = warn_only;
3568
0
  }
3569
0
      else if (out_fp == 1 && in_fp == 3)
3570
0
  {
3571
0
    _bfd_error_handler
3572
      /* xgettext:c-format */
3573
0
      (_("%pB uses double-precision hard float, "
3574
0
         "%pB uses single-precision hard float"), last_fp, ibfd);
3575
0
    ret = warn_only;
3576
0
  }
3577
0
      else if (out_fp == 3 && in_fp == 1)
3578
0
  {
3579
0
    _bfd_error_handler
3580
      /* xgettext:c-format */
3581
0
      (_("%pB uses double-precision hard float, "
3582
0
         "%pB uses single-precision hard float"), ibfd, last_fp);
3583
0
    ret = warn_only;
3584
0
  }
3585
3586
0
      in_fp = in_attr->i & 0xc;
3587
0
      out_fp = out_attr->i & 0xc;
3588
0
      if (in_fp == 0)
3589
0
  ;
3590
0
      else if (out_fp == 0)
3591
0
  {
3592
0
    if (!warn_only)
3593
0
      {
3594
0
        out_attr->type = ATTR_TYPE_FLAG_INT_VAL;
3595
0
        out_attr->i ^= in_fp;
3596
0
        last_ld = ibfd;
3597
0
      }
3598
0
  }
3599
0
      else if (out_fp != 2 * 4 && in_fp == 2 * 4)
3600
0
  {
3601
0
    _bfd_error_handler
3602
      /* xgettext:c-format */
3603
0
      (_("%pB uses 64-bit long double, "
3604
0
         "%pB uses 128-bit long double"), ibfd, last_ld);
3605
0
    ret = warn_only;
3606
0
  }
3607
0
      else if (in_fp != 2 * 4 && out_fp == 2 * 4)
3608
0
  {
3609
0
    _bfd_error_handler
3610
      /* xgettext:c-format */
3611
0
      (_("%pB uses 64-bit long double, "
3612
0
         "%pB uses 128-bit long double"), last_ld, ibfd);
3613
0
    ret = warn_only;
3614
0
  }
3615
0
      else if (out_fp == 1 * 4 && in_fp == 3 * 4)
3616
0
  {
3617
0
    _bfd_error_handler
3618
      /* xgettext:c-format */
3619
0
      (_("%pB uses IBM long double, "
3620
0
         "%pB uses IEEE long double"), last_ld, ibfd);
3621
0
    ret = warn_only;
3622
0
  }
3623
0
      else if (out_fp == 3 * 4 && in_fp == 1 * 4)
3624
0
  {
3625
0
    _bfd_error_handler
3626
      /* xgettext:c-format */
3627
0
      (_("%pB uses IBM long double, "
3628
0
         "%pB uses IEEE long double"), ibfd, last_ld);
3629
0
    ret = warn_only;
3630
0
  }
3631
0
    }
3632
3633
0
  if (!ret)
3634
0
    {
3635
0
      out_attr->type = ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_ERROR;
3636
0
      bfd_set_error (bfd_error_bad_value);
3637
0
    }
3638
0
  return ret;
3639
0
}
3640
3641
/* Merge object attributes from IBFD into OBFD.  Warn if
3642
   there are conflicting attributes.  */
3643
static bool
3644
ppc_elf_merge_obj_attributes (bfd *ibfd, struct bfd_link_info *info)
3645
0
{
3646
0
  bfd *obfd;
3647
0
  obj_attribute *in_attr, *in_attrs;
3648
0
  obj_attribute *out_attr, *out_attrs;
3649
0
  bool ret;
3650
3651
0
  if (!_bfd_elf_ppc_merge_fp_attributes (ibfd, info))
3652
0
    return false;
3653
3654
0
  obfd = info->output_bfd;
3655
0
  in_attrs = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
3656
0
  out_attrs = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
3657
3658
  /* Check for conflicting Tag_GNU_Power_ABI_Vector attributes and
3659
     merge non-conflicting ones.  */
3660
0
  in_attr = &in_attrs[Tag_GNU_Power_ABI_Vector];
3661
0
  out_attr = &out_attrs[Tag_GNU_Power_ABI_Vector];
3662
0
  ret = true;
3663
0
  if (in_attr->i != out_attr->i)
3664
0
    {
3665
0
      int in_vec = in_attr->i & 3;
3666
0
      int out_vec = out_attr->i & 3;
3667
0
      static bfd *last_vec;
3668
3669
0
      if (in_vec == 0)
3670
0
  ;
3671
0
      else if (out_vec == 0)
3672
0
  {
3673
0
    out_attr->type = ATTR_TYPE_FLAG_INT_VAL;
3674
0
    out_attr->i = in_vec;
3675
0
    last_vec = ibfd;
3676
0
  }
3677
      /* For now, allow generic to transition to AltiVec or SPE
3678
   without a warning.  If GCC marked files with their stack
3679
   alignment and used don't-care markings for files which are
3680
   not affected by the vector ABI, we could warn about this
3681
   case too.  */
3682
0
      else if (in_vec == 1)
3683
0
  ;
3684
0
      else if (out_vec == 1)
3685
0
  {
3686
0
    out_attr->type = ATTR_TYPE_FLAG_INT_VAL;
3687
0
    out_attr->i = in_vec;
3688
0
    last_vec = ibfd;
3689
0
  }
3690
0
      else if (out_vec < in_vec)
3691
0
  {
3692
0
    _bfd_error_handler
3693
      /* xgettext:c-format */
3694
0
      (_("%pB uses AltiVec vector ABI, %pB uses SPE vector ABI"),
3695
0
       last_vec, ibfd);
3696
0
    out_attr->type = ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_ERROR;
3697
0
    ret = false;
3698
0
  }
3699
0
      else if (out_vec > in_vec)
3700
0
  {
3701
0
    _bfd_error_handler
3702
      /* xgettext:c-format */
3703
0
      (_("%pB uses AltiVec vector ABI, %pB uses SPE vector ABI"),
3704
0
       ibfd, last_vec);
3705
0
    out_attr->type = ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_ERROR;
3706
0
    ret = false;
3707
0
  }
3708
0
    }
3709
3710
  /* Check for conflicting Tag_GNU_Power_ABI_Struct_Return attributes
3711
     and merge non-conflicting ones.  */
3712
0
  in_attr = &in_attrs[Tag_GNU_Power_ABI_Struct_Return];
3713
0
  out_attr = &out_attrs[Tag_GNU_Power_ABI_Struct_Return];
3714
0
  if (in_attr->i != out_attr->i)
3715
0
    {
3716
0
      int in_struct = in_attr->i & 3;
3717
0
      int out_struct = out_attr->i & 3;
3718
0
      static bfd *last_struct;
3719
3720
0
      if (in_struct == 0 || in_struct == 3)
3721
0
       ;
3722
0
      else if (out_struct == 0)
3723
0
  {
3724
0
    out_attr->type = ATTR_TYPE_FLAG_INT_VAL;
3725
0
    out_attr->i = in_struct;
3726
0
    last_struct = ibfd;
3727
0
  }
3728
0
      else if (out_struct < in_struct)
3729
0
  {
3730
0
    _bfd_error_handler
3731
      /* xgettext:c-format */
3732
0
      (_("%pB uses r3/r4 for small structure returns, "
3733
0
         "%pB uses memory"), last_struct, ibfd);
3734
0
    out_attr->type = ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_ERROR;
3735
0
    ret = false;
3736
0
  }
3737
0
      else if (out_struct > in_struct)
3738
0
  {
3739
0
    _bfd_error_handler
3740
      /* xgettext:c-format */
3741
0
      (_("%pB uses r3/r4 for small structure returns, "
3742
0
         "%pB uses memory"), ibfd, last_struct);
3743
0
    out_attr->type = ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_ERROR;
3744
0
    ret = false;
3745
0
  }
3746
0
    }
3747
0
  if (!ret)
3748
0
    {
3749
0
      bfd_set_error (bfd_error_bad_value);
3750
0
      return false;
3751
0
    }
3752
3753
  /* Merge Tag_compatibility attributes and any common GNU ones.  */
3754
0
  return _bfd_elf_merge_object_attributes (ibfd, info);
3755
0
}
3756
3757
/* Merge backend specific data from an object file to the output
3758
   object file when linking.  */
3759
3760
static bool
3761
ppc_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
3762
0
{
3763
0
  bfd *obfd = info->output_bfd;
3764
0
  flagword old_flags;
3765
0
  flagword new_flags;
3766
0
  bool error;
3767
3768
0
  if (!is_ppc_elf (ibfd))
3769
0
    return true;
3770
3771
  /* Check if we have the same endianness.  */
3772
0
  if (! _bfd_generic_verify_endian_match (ibfd, info))
3773
0
    return false;
3774
3775
0
  if (!ppc_elf_merge_obj_attributes (ibfd, info))
3776
0
    return false;
3777
3778
0
  if ((ibfd->flags & DYNAMIC) != 0)
3779
0
    return true;
3780
3781
0
  new_flags = elf_elfheader (ibfd)->e_flags;
3782
0
  old_flags = elf_elfheader (obfd)->e_flags;
3783
0
  if (!elf_flags_init (obfd))
3784
0
    {
3785
      /* First call, no flags set.  */
3786
0
      elf_flags_init (obfd) = true;
3787
0
      elf_elfheader (obfd)->e_flags = new_flags;
3788
0
    }
3789
3790
  /* Compatible flags are ok.  */
3791
0
  else if (new_flags == old_flags)
3792
0
    ;
3793
3794
  /* Incompatible flags.  */
3795
0
  else
3796
0
    {
3797
      /* Warn about -mrelocatable mismatch.  Allow -mrelocatable-lib
3798
   to be linked with either.  */
3799
0
      error = false;
3800
0
      if ((new_flags & EF_PPC_RELOCATABLE) != 0
3801
0
    && (old_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0)
3802
0
  {
3803
0
    error = true;
3804
0
    _bfd_error_handler
3805
0
      (_("%pB: compiled with -mrelocatable and linked with "
3806
0
         "modules compiled normally"), ibfd);
3807
0
  }
3808
0
      else if ((new_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0
3809
0
         && (old_flags & EF_PPC_RELOCATABLE) != 0)
3810
0
  {
3811
0
    error = true;
3812
0
    _bfd_error_handler
3813
0
      (_("%pB: compiled normally and linked with "
3814
0
         "modules compiled with -mrelocatable"), ibfd);
3815
0
  }
3816
3817
      /* The output is -mrelocatable-lib iff both the input files are.  */
3818
0
      if (! (new_flags & EF_PPC_RELOCATABLE_LIB))
3819
0
  elf_elfheader (obfd)->e_flags &= ~EF_PPC_RELOCATABLE_LIB;
3820
3821
      /* The output is -mrelocatable iff it can't be -mrelocatable-lib,
3822
   but each input file is either -mrelocatable or -mrelocatable-lib.  */
3823
0
      if (! (elf_elfheader (obfd)->e_flags & EF_PPC_RELOCATABLE_LIB)
3824
0
    && (new_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE))
3825
0
    && (old_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE)))
3826
0
  elf_elfheader (obfd)->e_flags |= EF_PPC_RELOCATABLE;
3827
3828
      /* Do not warn about eabi vs. V.4 mismatch, just or in the bit if
3829
   any module uses it.  */
3830
0
      elf_elfheader (obfd)->e_flags |= (new_flags & EF_PPC_EMB);
3831
3832
0
      new_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
3833
0
      old_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
3834
3835
      /* Warn about any other mismatches.  */
3836
0
      if (new_flags != old_flags)
3837
0
  {
3838
0
    error = true;
3839
0
    _bfd_error_handler
3840
      /* xgettext:c-format */
3841
0
      (_("%pB: uses different e_flags (%#x) fields "
3842
0
         "than previous modules (%#x)"),
3843
0
       ibfd, new_flags, old_flags);
3844
0
  }
3845
3846
0
      if (error)
3847
0
  {
3848
0
    bfd_set_error (bfd_error_bad_value);
3849
0
    return false;
3850
0
  }
3851
0
    }
3852
3853
0
  return true;
3854
0
}
3855
3856
static bfd_reloc_status_type
3857
ppc_elf_vle_split16 (bfd *input_bfd,
3858
         asection *input_section,
3859
         unsigned long offset,
3860
         bfd_byte *loc,
3861
         bfd_vma value,
3862
         split16_format_type split16_format,
3863
         bool fixup)
3864
0
{
3865
0
  unsigned int insn, opcode;
3866
3867
0
  if (!offset_in_range (input_section, offset, 4))
3868
0
    return bfd_reloc_outofrange;
3869
0
  insn = bfd_get_32 (input_bfd, loc);
3870
0
  opcode = insn & E_OPCODE_MASK;
3871
0
  if (opcode == E_OR2I_INSN
3872
0
      || opcode == E_AND2I_DOT_INSN
3873
0
      || opcode == E_OR2IS_INSN
3874
0
      || opcode == E_LIS_INSN
3875
0
      || opcode == E_AND2IS_DOT_INSN)
3876
0
    {
3877
0
      if (split16_format != split16a_type)
3878
0
  {
3879
0
    if (fixup)
3880
0
      split16_format = split16a_type;
3881
0
    else
3882
0
      _bfd_error_handler
3883
        /* xgettext:c-format */
3884
0
        (_("%pB(%pA+0x%lx): expected 16A style relocation on 0x%08x insn"),
3885
0
         input_bfd, input_section, offset, opcode);
3886
0
  }
3887
0
    }
3888
0
  else if (opcode == E_ADD2I_DOT_INSN
3889
0
     || opcode == E_ADD2IS_INSN
3890
0
     || opcode == E_CMP16I_INSN
3891
0
     || opcode == E_MULL2I_INSN
3892
0
     || opcode == E_CMPL16I_INSN
3893
0
     || opcode == E_CMPH16I_INSN
3894
0
     || opcode == E_CMPHL16I_INSN)
3895
0
    {
3896
0
      if (split16_format != split16d_type)
3897
0
  {
3898
0
    if (fixup)
3899
0
      split16_format = split16d_type;
3900
0
    else
3901
0
      _bfd_error_handler
3902
        /* xgettext:c-format */
3903
0
        (_("%pB(%pA+0x%lx): expected 16D style relocation on 0x%08x insn"),
3904
0
         input_bfd, input_section, offset, opcode);
3905
0
  }
3906
0
    }
3907
0
  if (split16_format == split16a_type)
3908
0
    {
3909
0
      insn &= ~((0xf800 << 5) | 0x7ff);
3910
0
      insn |= (value & 0xf800) << 5;
3911
0
      if ((insn & E_LI_MASK) == E_LI_INSN)
3912
0
  {
3913
    /* Hack for e_li.  Extend sign.  */
3914
0
    insn &= ~(0xf0000 >> 5);
3915
0
    insn |= (-(value & 0x8000) & 0xf0000) >> 5;
3916
0
  }
3917
0
    }
3918
0
  else
3919
0
    {
3920
0
      insn &= ~((0xf800 << 10) | 0x7ff);
3921
0
      insn |= (value & 0xf800) << 10;
3922
0
    }
3923
0
  insn |= value & 0x7ff;
3924
0
  bfd_put_32 (input_bfd, insn, loc);
3925
0
  return bfd_reloc_ok;
3926
0
}
3927
3928
static void
3929
ppc_elf_vle_split20 (bfd *output_bfd, bfd_byte *loc, bfd_vma value)
3930
0
{
3931
0
  unsigned int insn;
3932
3933
0
  insn = bfd_get_32 (output_bfd, loc);
3934
  /* We have an li20 field, bits 17..20, 11..15, 21..31.  */
3935
  /* Top 4 bits of value to 17..20.  */
3936
0
  insn |= (value & 0xf0000) >> 5;
3937
  /* Next 5 bits of the value to 11..15.  */
3938
0
  insn |= (value & 0xf800) << 5;
3939
  /* And the final 11 bits of the value to bits 21 to 31.  */
3940
0
  insn |= value & 0x7ff;
3941
0
  bfd_put_32 (output_bfd, insn, loc);
3942
0
}
3943
3944

3945
/* Choose which PLT scheme to use, and set .plt flags appropriately.
3946
   Returns -1 on error, 0 for old PLT, 1 for new PLT.  */
3947
int
3948
ppc_elf_select_plt_layout (bfd *output_bfd ATTRIBUTE_UNUSED,
3949
         struct bfd_link_info *info)
3950
0
{
3951
0
  struct ppc_elf_link_hash_table *htab;
3952
0
  flagword flags;
3953
3954
0
  htab = ppc_elf_hash_table (info);
3955
3956
0
  if (htab->plt_type == PLT_UNSET)
3957
0
    {
3958
0
      struct elf_link_hash_entry *h;
3959
3960
0
      if (htab->params->plt_style == PLT_OLD)
3961
0
  htab->plt_type = PLT_OLD;
3962
0
      else if (bfd_link_pic (info)
3963
0
         && htab->elf.dynamic_sections_created
3964
0
         && (h = elf_link_hash_lookup (&htab->elf, "_mcount",
3965
0
               false, false, true)) != NULL
3966
0
         && (h->type == STT_FUNC
3967
0
       || h->needs_plt)
3968
0
         && h->ref_regular
3969
0
         && !(SYMBOL_CALLS_LOCAL (info, h)
3970
0
        || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)))
3971
0
  {
3972
    /* Profiling of shared libs (and pies) is not supported with
3973
       secure plt, because ppc32 does profiling before a
3974
       function prologue and a secure plt pic call stubs needs
3975
       r30 to be set up.  */
3976
0
    htab->plt_type = PLT_OLD;
3977
0
  }
3978
0
      else
3979
0
  {
3980
0
    bfd *ibfd;
3981
0
    enum ppc_elf_plt_type plt_type = htab->params->plt_style;
3982
3983
    /* Look through the reloc flags left by ppc_elf_check_relocs.
3984
       Use the old style bss plt if a file makes plt calls
3985
       without using the new relocs, and if ld isn't given
3986
       --secure-plt and we never see REL16 relocs.  */
3987
0
    if (plt_type == PLT_UNSET)
3988
0
      plt_type = PLT_OLD;
3989
0
    for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
3990
0
      if (is_ppc_elf (ibfd))
3991
0
        {
3992
0
    if (ppc_elf_tdata (ibfd)->has_rel16)
3993
0
      plt_type = PLT_NEW;
3994
0
    else if (ppc_elf_tdata (ibfd)->makes_plt_call)
3995
0
      {
3996
0
        plt_type = PLT_OLD;
3997
0
        htab->old_bfd = ibfd;
3998
0
        break;
3999
0
      }
4000
0
        }
4001
0
    htab->plt_type = plt_type;
4002
0
  }
4003
0
    }
4004
0
  if (htab->plt_type == PLT_OLD)
4005
0
    {
4006
0
      if (!info->user_warn_rwx_segments)
4007
0
  info->no_warn_rwx_segments = 1;
4008
0
      if (htab->params->plt_style == PLT_NEW
4009
0
    || (htab->params->plt_style != PLT_OLD
4010
0
        && !info->no_warn_rwx_segments))
4011
0
  {
4012
0
    if (htab->old_bfd != NULL)
4013
0
      _bfd_error_handler (_("bss-plt forced due to %pB"), htab->old_bfd);
4014
0
    else
4015
0
      _bfd_error_handler (_("bss-plt forced by profiling"));
4016
0
  }
4017
0
    }
4018
4019
0
  BFD_ASSERT (htab->plt_type != PLT_VXWORKS);
4020
4021
0
  if (htab->plt_type == PLT_NEW)
4022
0
    {
4023
0
      flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
4024
0
         | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4025
4026
      /* The new PLT is a loaded section.  */
4027
0
      if (htab->elf.splt != NULL
4028
0
    && !bfd_set_section_flags (htab->elf.splt, flags))
4029
0
  return -1;
4030
4031
      /* The new GOT is not executable.  */
4032
0
      if (htab->elf.sgot != NULL
4033
0
    && !bfd_set_section_flags (htab->elf.sgot, flags))
4034
0
  return -1;
4035
0
    }
4036
0
  else
4037
0
    {
4038
      /* Stop an unused .glink section from affecting .text alignment.  */
4039
0
      if (htab->glink != NULL
4040
0
    && !bfd_set_section_alignment (htab->glink, 0))
4041
0
  return -1;
4042
0
    }
4043
0
  return htab->plt_type == PLT_NEW;
4044
0
}
4045

4046
/* Return the section that should be marked against GC for a given
4047
   relocation.  */
4048
4049
static asection *
4050
ppc_elf_gc_mark_hook (asection *sec,
4051
          struct bfd_link_info *info,
4052
          struct elf_reloc_cookie *cookie,
4053
          struct elf_link_hash_entry *h,
4054
          unsigned int symndx)
4055
0
{
4056
0
  if (h != NULL)
4057
0
    switch (ELF32_R_TYPE (cookie->rel->r_info))
4058
0
      {
4059
0
      case R_PPC_GNU_VTINHERIT:
4060
0
      case R_PPC_GNU_VTENTRY:
4061
0
  return NULL;
4062
0
      }
4063
4064
0
  return _bfd_elf_gc_mark_hook (sec, info, cookie, h, symndx);
4065
0
}
4066
4067
static bool
4068
get_sym_h (struct elf_link_hash_entry **hp,
4069
     Elf_Internal_Sym **symp,
4070
     asection **symsecp,
4071
     unsigned char **tls_maskp,
4072
     Elf_Internal_Sym **locsymsp,
4073
     unsigned long r_symndx,
4074
     bfd *ibfd)
4075
0
{
4076
0
  Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
4077
4078
0
  if (r_symndx >= symtab_hdr->sh_info)
4079
0
    {
4080
0
      struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
4081
0
      struct elf_link_hash_entry *h;
4082
4083
0
      h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4084
0
      while (h->root.type == bfd_link_hash_indirect
4085
0
       || h->root.type == bfd_link_hash_warning)
4086
0
  h = (struct elf_link_hash_entry *) h->root.u.i.link;
4087
4088
0
      if (hp != NULL)
4089
0
  *hp = h;
4090
4091
0
      if (symp != NULL)
4092
0
  *symp = NULL;
4093
4094
0
      if (symsecp != NULL)
4095
0
  {
4096
0
    asection *symsec = NULL;
4097
0
    if (h->root.type == bfd_link_hash_defined
4098
0
        || h->root.type == bfd_link_hash_defweak)
4099
0
      symsec = h->root.u.def.section;
4100
0
    *symsecp = symsec;
4101
0
  }
4102
4103
0
      if (tls_maskp != NULL)
4104
0
  *tls_maskp = &ppc_elf_hash_entry (h)->tls_mask;
4105
0
    }
4106
0
  else
4107
0
    {
4108
0
      Elf_Internal_Sym *sym;
4109
0
      Elf_Internal_Sym *locsyms = *locsymsp;
4110
4111
0
      if (locsyms == NULL)
4112
0
  {
4113
0
    locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
4114
0
    if (locsyms == NULL)
4115
0
      locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
4116
0
              symtab_hdr->sh_info,
4117
0
              0, NULL, NULL, NULL);
4118
0
    if (locsyms == NULL)
4119
0
      return false;
4120
0
    *locsymsp = locsyms;
4121
0
  }
4122
0
      sym = locsyms + r_symndx;
4123
4124
0
      if (hp != NULL)
4125
0
  *hp = NULL;
4126
4127
0
      if (symp != NULL)
4128
0
  *symp = sym;
4129
4130
0
      if (symsecp != NULL)
4131
0
  *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
4132
4133
0
      if (tls_maskp != NULL)
4134
0
  {
4135
0
    bfd_signed_vma *local_got;
4136
0
    unsigned char *tls_mask;
4137
4138
0
    tls_mask = NULL;
4139
0
    local_got = elf_local_got_refcounts (ibfd);
4140
0
    if (local_got != NULL)
4141
0
      {
4142
0
        struct plt_entry **local_plt = (struct plt_entry **)
4143
0
    (local_got + symtab_hdr->sh_info);
4144
0
        unsigned char *lgot_masks = (unsigned char *)
4145
0
    (local_plt + symtab_hdr->sh_info);
4146
0
        tls_mask = &lgot_masks[r_symndx];
4147
0
      }
4148
0
    *tls_maskp = tls_mask;
4149
0
  }
4150
0
    }
4151
0
  return true;
4152
0
}
4153

4154
/* Analyze inline PLT call relocations to see whether calls to locally
4155
   defined functions can be converted to direct calls.  */
4156
4157
bool
4158
ppc_elf_inline_plt (struct bfd_link_info *info)
4159
0
{
4160
0
  struct ppc_elf_link_hash_table *htab;
4161
0
  bfd *ibfd;
4162
0
  asection *sec;
4163
0
  bfd_vma low_vma, high_vma, limit;
4164
4165
0
  htab = ppc_elf_hash_table (info);
4166
0
  if (htab == NULL)
4167
0
    return false;
4168
4169
  /* A bl insn can reach -0x2000000 to 0x1fffffc.  The limit is
4170
     reduced somewhat to cater for possible stubs that might be added
4171
     between the call and its destination.  */
4172
0
  limit = 0x1e00000;
4173
0
  low_vma = -1;
4174
0
  high_vma = 0;
4175
0
  for (sec = info->output_bfd->sections; sec != NULL; sec = sec->next)
4176
0
    if ((sec->flags & (SEC_ALLOC | SEC_CODE)) == (SEC_ALLOC | SEC_CODE))
4177
0
      {
4178
0
  if (low_vma > sec->vma)
4179
0
    low_vma = sec->vma;
4180
0
  if (high_vma < sec->vma + sec->size)
4181
0
    high_vma = sec->vma + sec->size;
4182
0
      }
4183
4184
  /* If a "bl" can reach anywhere in local code sections, then we can
4185
     convert all inline PLT sequences to direct calls when the symbol
4186
     is local.  */
4187
0
  if (high_vma - low_vma < limit)
4188
0
    {
4189
0
      htab->can_convert_all_inline_plt = 1;
4190
0
      return true;
4191
0
    }
4192
4193
  /* Otherwise, go looking through relocs for cases where a direct
4194
     call won't reach.  Mark the symbol on any such reloc to disable
4195
     the optimization and keep the PLT entry as it seems likely that
4196
     this will be better than creating trampolines.  Note that this
4197
     will disable the optimization for all inline PLT calls to a
4198
     particular symbol, not just those that won't reach.  The
4199
     difficulty in doing a more precise optimization is that the
4200
     linker needs to make a decision depending on whether a
4201
     particular R_PPC_PLTCALL insn can be turned into a direct
4202
     call, for each of the R_PPC_PLTSEQ and R_PPC_PLT16* insns in
4203
     the sequence, and there is nothing that ties those relocs
4204
     together except their symbol.  */
4205
4206
0
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
4207
0
    {
4208
0
      Elf_Internal_Shdr *symtab_hdr;
4209
0
      Elf_Internal_Sym *local_syms;
4210
4211
0
      if (!is_ppc_elf (ibfd))
4212
0
  continue;
4213
4214
0
      local_syms = NULL;
4215
0
      symtab_hdr = &elf_symtab_hdr (ibfd);
4216
4217
0
      for (sec = ibfd->sections; sec != NULL; sec = sec->next)
4218
0
  if (sec->has_pltcall
4219
0
      && !bfd_is_abs_section (sec->output_section))
4220
0
    {
4221
0
      Elf_Internal_Rela *relstart, *rel, *relend;
4222
4223
      /* Read the relocations.  */
4224
0
      relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
4225
0
              info->keep_memory);
4226
0
      if (relstart == NULL)
4227
0
        return false;
4228
4229
0
      relend = relstart + sec->reloc_count;
4230
0
      for (rel = relstart; rel < relend; rel++)
4231
0
        {
4232
0
    enum elf_ppc_reloc_type r_type;
4233
0
    unsigned long r_symndx;
4234
0
    asection *sym_sec;
4235
0
    struct elf_link_hash_entry *h;
4236
0
    Elf_Internal_Sym *sym;
4237
0
    unsigned char *tls_maskp;
4238
4239
0
    r_type = ELF32_R_TYPE (rel->r_info);
4240
0
    if (r_type != R_PPC_PLTCALL)
4241
0
      continue;
4242
4243
0
    r_symndx = ELF32_R_SYM (rel->r_info);
4244
0
    if (!get_sym_h (&h, &sym, &sym_sec, &tls_maskp, &local_syms,
4245
0
        r_symndx, ibfd))
4246
0
      {
4247
0
        if (elf_section_data (sec)->relocs != relstart)
4248
0
          free (relstart);
4249
0
        if (symtab_hdr->contents != (unsigned char *) local_syms)
4250
0
          free (local_syms);
4251
0
        return false;
4252
0
      }
4253
4254
0
    if (sym_sec != NULL && sym_sec->output_section != NULL)
4255
0
      {
4256
0
        bfd_vma from, to;
4257
0
        if (h != NULL)
4258
0
          to = h->root.u.def.value;
4259
0
        else
4260
0
          to = sym->st_value;
4261
0
        to += (rel->r_addend
4262
0
         + sym_sec->output_offset
4263
0
         + sym_sec->output_section->vma);
4264
0
        from = (rel->r_offset
4265
0
          + sec->output_offset
4266
0
          + sec->output_section->vma);
4267
0
        if (to - from + limit < 2 * limit)
4268
0
          *tls_maskp &= ~PLT_KEEP;
4269
0
      }
4270
0
        }
4271
0
      if (elf_section_data (sec)->relocs != relstart)
4272
0
        free (relstart);
4273
0
    }
4274
4275
0
      if (local_syms != NULL
4276
0
    && symtab_hdr->contents != (unsigned char *) local_syms)
4277
0
  {
4278
0
    if (!info->keep_memory)
4279
0
      free (local_syms);
4280
0
    else
4281
0
      symtab_hdr->contents = (unsigned char *) local_syms;
4282
0
  }
4283
0
    }
4284
4285
0
  return true;
4286
0
}
4287
4288
/* Set plt output section type, htab->tls_get_addr, and call the
4289
   generic ELF tls_setup function.  */
4290
4291
asection *
4292
ppc_elf_tls_setup (bfd *obfd, struct bfd_link_info *info)
4293
0
{
4294
0
  struct ppc_elf_link_hash_table *htab;
4295
4296
0
  htab = ppc_elf_hash_table (info);
4297
0
  htab->tls_get_addr = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
4298
0
               false, false, true);
4299
0
  if (htab->plt_type != PLT_NEW)
4300
0
    htab->params->no_tls_get_addr_opt = true;
4301
4302
0
  if (!htab->params->no_tls_get_addr_opt)
4303
0
    {
4304
0
      struct elf_link_hash_entry *opt, *tga;
4305
0
      opt = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
4306
0
          false, false, true);
4307
0
      if (opt != NULL
4308
0
    && (opt->root.type == bfd_link_hash_defined
4309
0
        || opt->root.type == bfd_link_hash_defweak))
4310
0
  {
4311
    /* If glibc supports an optimized __tls_get_addr call stub,
4312
       signalled by the presence of __tls_get_addr_opt, and we'll
4313
       be calling __tls_get_addr via a plt call stub, then
4314
       make __tls_get_addr point to __tls_get_addr_opt.  */
4315
0
    tga = htab->tls_get_addr;
4316
0
    if (htab->elf.dynamic_sections_created
4317
0
        && tga != NULL
4318
0
        && (tga->type == STT_FUNC
4319
0
      || tga->needs_plt)
4320
0
        && !(SYMBOL_CALLS_LOCAL (info, tga)
4321
0
       || UNDEFWEAK_NO_DYNAMIC_RELOC (info, tga)))
4322
0
      {
4323
0
        struct plt_entry *ent;
4324
0
        for (ent = tga->plt.plist; ent != NULL; ent = ent->next)
4325
0
    if (ent->plt.refcount > 0)
4326
0
      break;
4327
0
        if (ent != NULL)
4328
0
    {
4329
0
      tga->root.type = bfd_link_hash_indirect;
4330
0
      tga->root.u.i.link = &opt->root;
4331
0
      ppc_elf_copy_indirect_symbol (info, opt, tga);
4332
0
      opt->mark = 1;
4333
0
      if (opt->dynindx != -1)
4334
0
        {
4335
          /* Use __tls_get_addr_opt in dynamic relocations.  */
4336
0
          opt->dynindx = -1;
4337
0
          _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
4338
0
                opt->dynstr_index);
4339
0
          if (!bfd_elf_link_record_dynamic_symbol (info, opt))
4340
0
      return NULL;
4341
0
        }
4342
0
      htab->tls_get_addr = opt;
4343
0
    }
4344
0
      }
4345
0
  }
4346
0
      else
4347
0
  htab->params->no_tls_get_addr_opt = true;
4348
0
    }
4349
0
  if (htab->plt_type == PLT_NEW
4350
0
      && htab->elf.splt != NULL
4351
0
      && htab->elf.splt->output_section != NULL)
4352
0
    {
4353
0
      elf_section_type (htab->elf.splt->output_section) = SHT_PROGBITS;
4354
0
      elf_section_flags (htab->elf.splt->output_section) = SHF_ALLOC + SHF_WRITE;
4355
0
    }
4356
4357
0
  return bfd_elf_tls_setup (obfd, info);
4358
0
}
4359
4360
/* Return TRUE iff REL is a branch reloc with a global symbol matching
4361
   HASH.  */
4362
4363
static bool
4364
branch_reloc_hash_match (const bfd *ibfd,
4365
       const Elf_Internal_Rela *rel,
4366
       const struct elf_link_hash_entry *hash)
4367
0
{
4368
0
  Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
4369
0
  enum elf_ppc_reloc_type r_type = ELF32_R_TYPE (rel->r_info);
4370
0
  unsigned int r_symndx = ELF32_R_SYM (rel->r_info);
4371
4372
0
  if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
4373
0
    {
4374
0
      struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
4375
0
      struct elf_link_hash_entry *h;
4376
4377
0
      h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4378
0
      while (h->root.type == bfd_link_hash_indirect
4379
0
       || h->root.type == bfd_link_hash_warning)
4380
0
  h = (struct elf_link_hash_entry *) h->root.u.i.link;
4381
0
      if (h == hash)
4382
0
  return true;
4383
0
    }
4384
0
  return false;
4385
0
}
4386
4387
/* Run through all the TLS relocs looking for optimization
4388
   opportunities.  */
4389
4390
bool
4391
ppc_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED,
4392
          struct bfd_link_info *info)
4393
0
{
4394
0
  bfd *ibfd;
4395
0
  asection *sec;
4396
0
  struct ppc_elf_link_hash_table *htab;
4397
0
  int pass;
4398
4399
0
  if (!bfd_link_executable (info))
4400
0
    return true;
4401
4402
0
  htab = ppc_elf_hash_table (info);
4403
0
  if (htab == NULL)
4404
0
    return false;
4405
4406
0
  htab->do_tls_opt = 1;
4407
4408
  /* Make two passes through the relocs.  First time check that tls
4409
     relocs involved in setting up a tls_get_addr call are indeed
4410
     followed by such a call.  If they are not, don't do any tls
4411
     optimization.  On the second pass twiddle tls_mask flags to
4412
     notify relocate_section that optimization can be done, and
4413
     adjust got and plt refcounts.  */
4414
0
  for (pass = 0; pass < 2; ++pass)
4415
0
    for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
4416
0
      {
4417
0
  Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
4418
0
  asection *got2 = bfd_get_section_by_name (ibfd, ".got2");
4419
4420
0
  for (sec = ibfd->sections; sec != NULL; sec = sec->next)
4421
0
    if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
4422
0
      {
4423
0
        Elf_Internal_Rela *relstart, *rel, *relend;
4424
0
        int expecting_tls_get_addr = 0;
4425
4426
        /* Read the relocations.  */
4427
0
        relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
4428
0
                info->keep_memory);
4429
0
        if (relstart == NULL)
4430
0
    return false;
4431
4432
0
        relend = relstart + sec->reloc_count;
4433
0
        for (rel = relstart; rel < relend; rel++)
4434
0
    {
4435
0
      enum elf_ppc_reloc_type r_type;
4436
0
      unsigned long r_symndx;
4437
0
      struct elf_link_hash_entry *h = NULL;
4438
0
      unsigned char *tls_mask;
4439
0
      unsigned char tls_set, tls_clear;
4440
0
      bool is_local;
4441
0
      bfd_signed_vma *got_count;
4442
4443
0
      r_symndx = ELF32_R_SYM (rel->r_info);
4444
0
      if (r_symndx >= symtab_hdr->sh_info)
4445
0
        {
4446
0
          struct elf_link_hash_entry **sym_hashes;
4447
4448
0
          sym_hashes = elf_sym_hashes (ibfd);
4449
0
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4450
0
          while (h->root.type == bfd_link_hash_indirect
4451
0
           || h->root.type == bfd_link_hash_warning)
4452
0
      h = (struct elf_link_hash_entry *) h->root.u.i.link;
4453
0
        }
4454
4455
0
      is_local = SYMBOL_REFERENCES_LOCAL (info, h);
4456
0
      r_type = ELF32_R_TYPE (rel->r_info);
4457
      /* If this section has old-style __tls_get_addr calls
4458
         without marker relocs, then check that each
4459
         __tls_get_addr call reloc is preceded by a reloc
4460
         that conceivably belongs to the __tls_get_addr arg
4461
         setup insn.  If we don't find matching arg setup
4462
         relocs, don't do any tls optimization.  */
4463
0
      if (pass == 0
4464
0
          && sec->nomark_tls_get_addr
4465
0
          && h != NULL
4466
0
          && h == htab->tls_get_addr
4467
0
          && !expecting_tls_get_addr
4468
0
          && is_branch_reloc (r_type))
4469
0
        {
4470
0
          info->callbacks->minfo ("%H __tls_get_addr lost arg, "
4471
0
                "TLS optimization disabled\n",
4472
0
                ibfd, sec, rel->r_offset);
4473
0
          if (elf_section_data (sec)->relocs != relstart)
4474
0
      free (relstart);
4475
0
          return true;
4476
0
        }
4477
4478
0
      expecting_tls_get_addr = 0;
4479
0
      switch (r_type)
4480
0
        {
4481
0
        case R_PPC_GOT_TLSLD16:
4482
0
        case R_PPC_GOT_TLSLD16_LO:
4483
0
          expecting_tls_get_addr = 1;
4484
          /* Fall through.  */
4485
4486
0
        case R_PPC_GOT_TLSLD16_HI:
4487
0
        case R_PPC_GOT_TLSLD16_HA:
4488
          /* These relocs should never be against a symbol
4489
       defined in a shared lib.  Leave them alone if
4490
       that turns out to be the case.  */
4491
0
          if (!is_local)
4492
0
      continue;
4493
4494
          /* LD -> LE */
4495
0
          tls_set = 0;
4496
0
          tls_clear = TLS_LD;
4497
0
          break;
4498
4499
0
        case R_PPC_GOT_TLSGD16:
4500
0
        case R_PPC_GOT_TLSGD16_LO:
4501
0
          expecting_tls_get_addr = 1;
4502
          /* Fall through.  */
4503
4504
0
        case R_PPC_GOT_TLSGD16_HI:
4505
0
        case R_PPC_GOT_TLSGD16_HA:
4506
0
          if (is_local)
4507
      /* GD -> LE */
4508
0
      tls_set = 0;
4509
0
          else
4510
      /* GD -> IE */
4511
0
      tls_set = TLS_TLS | TLS_GDIE;
4512
0
          tls_clear = TLS_GD;
4513
0
          break;
4514
4515
0
        case R_PPC_GOT_TPREL16:
4516
0
        case R_PPC_GOT_TPREL16_LO:
4517
0
        case R_PPC_GOT_TPREL16_HI:
4518
0
        case R_PPC_GOT_TPREL16_HA:
4519
0
          if (is_local)
4520
0
      {
4521
        /* IE -> LE */
4522
0
        tls_set = 0;
4523
0
        tls_clear = TLS_TPREL;
4524
0
        break;
4525
0
      }
4526
0
          else
4527
0
      continue;
4528
4529
0
        case R_PPC_TLSLD:
4530
0
          if (!is_local)
4531
0
      continue;
4532
          /* Fall through.  */
4533
0
        case R_PPC_TLSGD:
4534
0
          if (rel + 1 < relend
4535
0
        && is_plt_seq_reloc (ELF32_R_TYPE (rel[1].r_info)))
4536
0
      {
4537
0
        if (pass != 0
4538
0
            && ELF32_R_TYPE (rel[1].r_info) != R_PPC_PLTSEQ)
4539
0
          {
4540
0
            r_type = ELF32_R_TYPE (rel[1].r_info);
4541
0
            r_symndx = ELF32_R_SYM (rel[1].r_info);
4542
0
            if (r_symndx >= symtab_hdr->sh_info)
4543
0
        {
4544
0
          struct elf_link_hash_entry **sym_hashes;
4545
4546
0
          sym_hashes = elf_sym_hashes (ibfd);
4547
0
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4548
0
          while (h->root.type == bfd_link_hash_indirect
4549
0
           || h->root.type == bfd_link_hash_warning)
4550
0
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
4551
0
          if (h != NULL)
4552
0
            {
4553
0
              struct plt_entry *ent = NULL;
4554
0
              bfd_vma addend = 0;
4555
4556
0
              if (bfd_link_pic (info))
4557
0
          addend = rel->r_addend;
4558
0
              ent = find_plt_ent (&h->plt.plist,
4559
0
                got2, addend);
4560
0
              if (ent != NULL
4561
0
            && ent->plt.refcount > 0)
4562
0
          ent->plt.refcount -= 1;
4563
0
            }
4564
0
        }
4565
0
          }
4566
0
        continue;
4567
0
      }
4568
0
          expecting_tls_get_addr = 2;
4569
0
          tls_set = 0;
4570
0
          tls_clear = 0;
4571
0
          break;
4572
4573
0
        case R_PPC_TPREL16_HA:
4574
0
          if (pass == 0)
4575
0
      {
4576
0
        unsigned char buf[4];
4577
0
        unsigned int insn;
4578
0
        bfd_vma off = rel->r_offset & ~3;
4579
0
        if (!bfd_get_section_contents (ibfd, sec, buf,
4580
0
               off, 4))
4581
0
          {
4582
0
            if (elf_section_data (sec)->relocs != relstart)
4583
0
        free (relstart);
4584
0
            return false;
4585
0
          }
4586
0
        insn = bfd_get_32 (ibfd, buf);
4587
        /* addis rt,2,imm */
4588
0
        if ((insn & ((0x3fu << 26) | 0x1f << 16))
4589
0
            != ((15u << 26) | (2 << 16)))
4590
0
          {
4591
            /* xgettext:c-format */
4592
0
            info->callbacks->minfo
4593
0
        (_("%H: warning: %s unexpected insn %#x.\n"),
4594
0
         ibfd, sec, off, "R_PPC_TPREL16_HA", insn);
4595
0
            htab->do_tls_opt = 0;
4596
0
          }
4597
0
      }
4598
0
          continue;
4599
4600
0
        case R_PPC_TPREL16_HI:
4601
0
          htab->do_tls_opt = 0;
4602
0
          continue;
4603
4604
0
        default:
4605
0
          continue;
4606
0
        }
4607
4608
0
      if (pass == 0)
4609
0
        {
4610
0
          if (!expecting_tls_get_addr
4611
0
        || !sec->nomark_tls_get_addr)
4612
0
      continue;
4613
4614
0
          if (rel + 1 < relend
4615
0
        && branch_reloc_hash_match (ibfd, rel + 1,
4616
0
                  htab->tls_get_addr))
4617
0
      continue;
4618
4619
          /* Uh oh, we didn't find the expected call.  We
4620
       could just mark this symbol to exclude it
4621
       from tls optimization but it's safer to skip
4622
       the entire optimization.  */
4623
0
          info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
4624
0
            "TLS optimization disabled\n"),
4625
0
                ibfd, sec, rel->r_offset);
4626
0
          if (elf_section_data (sec)->relocs != relstart)
4627
0
      free (relstart);
4628
0
          return true;
4629
0
        }
4630
4631
0
      if (h != NULL)
4632
0
        {
4633
0
          tls_mask = &ppc_elf_hash_entry (h)->tls_mask;
4634
0
          got_count = &h->got.refcount;
4635
0
        }
4636
0
      else
4637
0
        {
4638
0
          bfd_signed_vma *lgot_refs;
4639
0
          struct plt_entry **local_plt;
4640
0
          unsigned char *lgot_masks;
4641
4642
0
          lgot_refs = elf_local_got_refcounts (ibfd);
4643
0
          if (lgot_refs == NULL)
4644
0
      abort ();
4645
0
          local_plt = (struct plt_entry **)
4646
0
      (lgot_refs + symtab_hdr->sh_info);
4647
0
          lgot_masks = (unsigned char *)
4648
0
      (local_plt + symtab_hdr->sh_info);
4649
0
          tls_mask = &lgot_masks[r_symndx];
4650
0
          got_count = &lgot_refs[r_symndx];
4651
0
        }
4652
4653
      /* If we don't have old-style __tls_get_addr calls
4654
         without TLSGD/TLSLD marker relocs, and we haven't
4655
         found a new-style __tls_get_addr call with a
4656
         marker for this symbol, then we either have a
4657
         broken object file or an -mlongcall style
4658
         indirect call to __tls_get_addr without a marker.
4659
         Disable optimization in this case.  */
4660
0
      if ((tls_clear & (TLS_GD | TLS_LD)) != 0
4661
0
          && !sec->nomark_tls_get_addr
4662
0
          && ((*tls_mask & (TLS_TLS | TLS_MARK))
4663
0
        != (TLS_TLS | TLS_MARK)))
4664
0
        continue;
4665
4666
0
      if (expecting_tls_get_addr == 1 + !sec->nomark_tls_get_addr)
4667
0
        {
4668
0
          struct plt_entry *ent;
4669
0
          bfd_vma addend = 0;
4670
4671
0
          if (bfd_link_pic (info)
4672
0
        && (ELF32_R_TYPE (rel[1].r_info) == R_PPC_PLTREL24
4673
0
            || ELF32_R_TYPE (rel[1].r_info) == R_PPC_PLTCALL))
4674
0
      addend = rel[1].r_addend;
4675
0
          ent = find_plt_ent (&htab->tls_get_addr->plt.plist,
4676
0
            got2, addend);
4677
0
          if (ent != NULL && ent->plt.refcount > 0)
4678
0
      ent->plt.refcount -= 1;
4679
0
        }
4680
0
      if (tls_clear == 0)
4681
0
        continue;
4682
4683
0
      if (tls_set == 0)
4684
0
        {
4685
          /* We managed to get rid of a got entry.  */
4686
0
          if (*got_count > 0)
4687
0
      *got_count -= 1;
4688
0
        }
4689
4690
0
      *tls_mask |= tls_set;
4691
0
      *tls_mask &= ~tls_clear;
4692
0
    }
4693
4694
0
        if (elf_section_data (sec)->relocs != relstart)
4695
0
    free (relstart);
4696
0
      }
4697
0
      }
4698
0
  return true;
4699
0
}
4700

4701
/* Return true if we have dynamic relocs against H or any of its weak
4702
   aliases, that apply to read-only sections.  Cannot be used after
4703
   size_dynamic_sections.  */
4704
4705
static bool
4706
alias_readonly_dynrelocs (struct elf_link_hash_entry *h)
4707
0
{
4708
0
  struct ppc_elf_link_hash_entry *eh = ppc_elf_hash_entry (h);
4709
0
  do
4710
0
    {
4711
0
      if (_bfd_elf_readonly_dynrelocs (&eh->elf))
4712
0
  return true;
4713
0
      eh = ppc_elf_hash_entry (eh->elf.u.alias);
4714
0
    } while (eh != NULL && &eh->elf != h);
4715
4716
0
  return false;
4717
0
}
4718
4719
/* Return whether H has pc-relative dynamic relocs.  */
4720
4721
static bool
4722
pc_dynrelocs (struct elf_link_hash_entry *h)
4723
0
{
4724
0
  struct elf_dyn_relocs *p;
4725
4726
0
  for (p = h->dyn_relocs; p != NULL; p = p->next)
4727
0
    if (p->pc_count != 0)
4728
0
      return true;
4729
0
  return false;
4730
0
}
4731
4732
/* Adjust a symbol defined by a dynamic object and referenced by a
4733
   regular object.  The current definition is in some section of the
4734
   dynamic object, but we're not including those sections.  We have to
4735
   change the definition to something the rest of the link can
4736
   understand.  */
4737
4738
static bool
4739
ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
4740
             struct elf_link_hash_entry *h)
4741
0
{
4742
0
  struct ppc_elf_link_hash_table *htab;
4743
0
  asection *s;
4744
4745
#ifdef DEBUG
4746
  fprintf (stderr, "ppc_elf_adjust_dynamic_symbol called for %s\n",
4747
     h->root.root.string);
4748
#endif
4749
4750
  /* Make sure we know what is going on here.  */
4751
0
  htab = ppc_elf_hash_table (info);
4752
0
  BFD_ASSERT (htab->elf.dynobj != NULL
4753
0
        && (h->needs_plt
4754
0
      || h->type == STT_GNU_IFUNC
4755
0
      || h->is_weakalias
4756
0
      || (h->def_dynamic
4757
0
          && h->ref_regular
4758
0
          && !h->def_regular)));
4759
4760
  /* Deal with function syms.  */
4761
0
  if (h->type == STT_FUNC
4762
0
      || h->type == STT_GNU_IFUNC
4763
0
      || h->needs_plt)
4764
0
    {
4765
0
      bool local = (SYMBOL_CALLS_LOCAL (info, h)
4766
0
         || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
4767
      /* Discard dyn_relocs when non-pic if we've decided that a
4768
   function symbol is local.  */
4769
0
      if (!bfd_link_pic (info) && local)
4770
0
  h->dyn_relocs = NULL;
4771
4772
      /* Clear procedure linkage table information for any symbol that
4773
   won't need a .plt entry.  */
4774
0
      struct plt_entry *ent;
4775
0
      for (ent = h->plt.plist; ent != NULL; ent = ent->next)
4776
0
  if (ent->plt.refcount > 0)
4777
0
    break;
4778
0
      if (ent == NULL
4779
0
    || (h->type != STT_GNU_IFUNC
4780
0
        && local
4781
0
        && (htab->can_convert_all_inline_plt
4782
0
      || (ppc_elf_hash_entry (h)->tls_mask
4783
0
          & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)))
4784
0
  {
4785
    /* A PLT entry is not required/allowed when:
4786
4787
       1. We are not using ld.so; because then the PLT entry
4788
       can't be set up, so we can't use one.  In this case,
4789
       ppc_elf_adjust_dynamic_symbol won't even be called.
4790
4791
       2. GC has rendered the entry unused.
4792
4793
       3. We know for certain that a call to this symbol
4794
       will go to this object, or will remain undefined.  */
4795
0
    h->plt.plist = NULL;
4796
0
    h->needs_plt = 0;
4797
0
    h->pointer_equality_needed = 0;
4798
0
  }
4799
0
      else
4800
0
  {
4801
    /* Taking a function's address in a read/write section
4802
       doesn't require us to define the function symbol in the
4803
       executable on a plt call stub.  A dynamic reloc can
4804
       be used instead, giving better runtime performance.
4805
       (Calls via that function pointer don't need to bounce
4806
       through the plt call stub.)  Similarly, use a dynamic
4807
       reloc for a weak reference when possible, allowing the
4808
       resolution of the symbol to be set at load time rather
4809
       than link time.  */
4810
0
    if ((h->pointer_equality_needed
4811
0
         || (h->non_got_ref
4812
0
       && !h->ref_regular_nonweak
4813
0
       && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)))
4814
0
        && htab->elf.target_os != is_vxworks
4815
0
        && !ppc_elf_hash_entry (h)->has_sda_refs
4816
0
        && !_bfd_elf_readonly_dynrelocs (h))
4817
0
      {
4818
0
        h->pointer_equality_needed = 0;
4819
        /* If we haven't seen a branch reloc and the symbol
4820
     isn't an ifunc then we don't need a plt entry.  */
4821
0
        if (!h->needs_plt && h->type != STT_GNU_IFUNC)
4822
0
    h->plt.plist = NULL;
4823
0
      }
4824
0
    else if (!bfd_link_pic (info))
4825
      /* We are going to be defining the function symbol on the
4826
         plt stub, so no dyn_relocs needed when non-pic.  */
4827
0
      h->dyn_relocs = NULL;
4828
0
  }
4829
0
      h->protected_def = 0;
4830
      /* Function symbols can't have copy relocs.  */
4831
0
      return true;
4832
0
    }
4833
0
  else
4834
0
    h->plt.plist = NULL;
4835
4836
  /* If this is a weak symbol, and there is a real definition, the
4837
     processor independent code will have arranged for us to see the
4838
     real definition first, and we can just use the same value.  */
4839
0
  if (h->is_weakalias)
4840
0
    {
4841
0
      struct elf_link_hash_entry *def = weakdef (h);
4842
0
      BFD_ASSERT (def->root.type == bfd_link_hash_defined);
4843
0
      h->root.u.def.section = def->root.u.def.section;
4844
0
      h->root.u.def.value = def->root.u.def.value;
4845
0
      if (def->root.u.def.section == htab->elf.sdynbss
4846
0
    || def->root.u.def.section == htab->elf.sdynrelro
4847
0
    || def->root.u.def.section == htab->dynsbss)
4848
0
  h->dyn_relocs = NULL;
4849
0
      return true;
4850
0
    }
4851
4852
  /* This is a reference to a symbol defined by a dynamic object which
4853
     is not a function.  */
4854
4855
  /* If we are creating a shared library, we must presume that the
4856
     only references to the symbol are via the global offset table.
4857
     For such cases we need not do anything here; the relocations will
4858
     be handled correctly by relocate_section.  */
4859
0
  if (bfd_link_pic (info))
4860
0
    {
4861
0
      h->protected_def = 0;
4862
0
      return true;
4863
0
    }
4864
4865
  /* If there are no references to this symbol that do not use the
4866
     GOT, we don't need to generate a copy reloc.  */
4867
0
  if (!h->non_got_ref)
4868
0
    {
4869
0
      h->protected_def = 0;
4870
0
      return true;
4871
0
    }
4872
4873
  /* Protected variables do not work with .dynbss.  The copy in
4874
     .dynbss won't be used by the shared library with the protected
4875
     definition for the variable.  Editing to PIC, or text relocations
4876
     are preferable to an incorrect program.  */
4877
0
  if (h->protected_def)
4878
0
    {
4879
0
      if (ELIMINATE_COPY_RELOCS
4880
0
    && ppc_elf_hash_entry (h)->has_addr16_ha
4881
0
    && ppc_elf_hash_entry (h)->has_addr16_lo
4882
0
    && htab->params->pic_fixup == 0
4883
0
    && info->disable_target_specific_optimizations <= 1)
4884
0
  htab->params->pic_fixup = 1;
4885
0
      return true;
4886
0
    }
4887
4888
  /* If -z nocopyreloc was given, we won't generate them either.  */
4889
0
  if (info->nocopyreloc)
4890
0
    return true;
4891
4892
   /* If we don't find any dynamic relocs in read-only sections, then
4893
      we'll be keeping the dynamic relocs and avoiding the copy reloc.
4894
      We can't do this if there are any small data relocations.  This
4895
      doesn't work on VxWorks, where we can not have dynamic
4896
      relocations (other than copy and jump slot relocations) in an
4897
      executable.  */
4898
0
  if (ELIMINATE_COPY_RELOCS
4899
0
      && !ppc_elf_hash_entry (h)->has_sda_refs
4900
0
      && htab->elf.target_os != is_vxworks
4901
0
      && !h->def_regular
4902
0
      && !alias_readonly_dynrelocs (h))
4903
0
    return true;
4904
4905
  /* We must allocate the symbol in our .dynbss section, which will
4906
     become part of the .bss section of the executable.  There will be
4907
     an entry for this symbol in the .dynsym section.  The dynamic
4908
     object will contain position independent code, so all references
4909
     from the dynamic object to this symbol will go through the global
4910
     offset table.  The dynamic linker will use the .dynsym entry to
4911
     determine the address it must put in the global offset table, so
4912
     both the dynamic object and the regular object will refer to the
4913
     same memory location for the variable.
4914
4915
     Of course, if the symbol is referenced using SDAREL relocs, we
4916
     must instead allocate it in .sbss.  */
4917
0
  if (ppc_elf_hash_entry (h)->has_sda_refs)
4918
0
    s = htab->dynsbss;
4919
0
  else if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
4920
0
    s = htab->elf.sdynrelro;
4921
0
  else
4922
0
    s = htab->elf.sdynbss;
4923
0
  BFD_ASSERT (s != NULL);
4924
4925
0
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
4926
0
    {
4927
0
      asection *srel;
4928
4929
      /* We must generate a R_PPC_COPY reloc to tell the dynamic
4930
   linker to copy the initial value out of the dynamic object
4931
   and into the runtime process image.  */
4932
0
      if (ppc_elf_hash_entry (h)->has_sda_refs)
4933
0
  srel = htab->relsbss;
4934
0
      else if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
4935
0
  srel = htab->elf.sreldynrelro;
4936
0
      else
4937
0
  srel = htab->elf.srelbss;
4938
0
      BFD_ASSERT (srel != NULL);
4939
0
      srel->size += sizeof (Elf32_External_Rela);
4940
0
      h->needs_copy = 1;
4941
0
    }
4942
4943
  /* We no longer want dyn_relocs.  */
4944
0
  h->dyn_relocs = NULL;
4945
0
  return _bfd_elf_adjust_dynamic_copy (info, h, s);
4946
0
}
4947

4948
/* Generate a symbol to mark plt call stubs.  For non-PIC code the sym is
4949
   xxxxxxxx.plt_call32.<callee> where xxxxxxxx is a hex number, usually 0,
4950
   specifying the addend on the plt relocation.  For -fpic code, the sym
4951
   is xxxxxxxx.plt_pic32.<callee>, and for -fPIC
4952
   xxxxxxxx.got2.plt_pic32.<callee>.  */
4953
4954
static bool
4955
add_stub_sym (struct plt_entry *ent,
4956
        struct elf_link_hash_entry *h,
4957
        struct bfd_link_info *info)
4958
0
{
4959
0
  struct elf_link_hash_entry *sh;
4960
0
  size_t len1, len2, len3;
4961
0
  char *name;
4962
0
  const char *stub;
4963
0
  struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
4964
4965
0
  if (bfd_link_pic (info))
4966
0
    stub = ".plt_pic32.";
4967
0
  else
4968
0
    stub = ".plt_call32.";
4969
4970
0
  len1 = strlen (h->root.root.string);
4971
0
  len2 = strlen (stub);
4972
0
  len3 = 0;
4973
0
  if (ent->sec)
4974
0
    len3 = strlen (ent->sec->name);
4975
0
  name = bfd_alloc (info->output_bfd, len1 + len2 + len3 + 9);
4976
0
  if (name == NULL)
4977
0
    return false;
4978
0
  sprintf (name, "%08x", (unsigned) ent->addend & 0xffffffff);
4979
0
  if (ent->sec)
4980
0
    memcpy (name + 8, ent->sec->name, len3);
4981
0
  memcpy (name + 8 + len3, stub, len2);
4982
0
  memcpy (name + 8 + len3 + len2, h->root.root.string, len1 + 1);
4983
0
  sh = elf_link_hash_lookup (&htab->elf, name, true, false, false);
4984
0
  if (sh == NULL)
4985
0
    return false;
4986
0
  if (sh->root.type == bfd_link_hash_new)
4987
0
    {
4988
0
      sh->root.type = bfd_link_hash_defined;
4989
0
      sh->root.u.def.section = htab->glink;
4990
0
      sh->root.u.def.value = ent->glink_offset;
4991
0
      sh->ref_regular = 1;
4992
0
      sh->def_regular = 1;
4993
0
      sh->ref_regular_nonweak = 1;
4994
0
      sh->forced_local = 1;
4995
0
      sh->non_elf = 0;
4996
0
      sh->root.linker_def = 1;
4997
0
    }
4998
0
  return true;
4999
0
}
5000
5001
/* Allocate NEED contiguous space in .got, and return the offset.
5002
   Handles allocation of the got header when crossing 32k.  */
5003
5004
static bfd_vma
5005
allocate_got (struct ppc_elf_link_hash_table *htab, unsigned int need)
5006
0
{
5007
0
  bfd_vma where;
5008
0
  unsigned int max_before_header;
5009
5010
0
  if (htab->plt_type == PLT_VXWORKS)
5011
0
    {
5012
0
      where = htab->elf.sgot->size;
5013
0
      htab->elf.sgot->size += need;
5014
0
    }
5015
0
  else
5016
0
    {
5017
0
      max_before_header = htab->plt_type == PLT_NEW ? 32768 : 32764;
5018
0
      if (need <= htab->got_gap)
5019
0
  {
5020
0
    where = max_before_header - htab->got_gap;
5021
0
    htab->got_gap -= need;
5022
0
  }
5023
0
      else
5024
0
  {
5025
0
    if (htab->elf.sgot->size + need > max_before_header
5026
0
        && htab->elf.sgot->size <= max_before_header)
5027
0
      {
5028
0
        htab->got_gap = max_before_header - htab->elf.sgot->size;
5029
0
        htab->elf.sgot->size = max_before_header + htab->got_header_size;
5030
0
      }
5031
0
    where = htab->elf.sgot->size;
5032
0
    htab->elf.sgot->size += need;
5033
0
  }
5034
0
    }
5035
0
  return where;
5036
0
}
5037
5038
/* Calculate size of GOT entries for symbol given its TLS_MASK.
5039
   TLS_LD is excluded because those go in a special GOT slot.  */
5040
5041
static inline unsigned int
5042
got_entries_needed (int tls_mask)
5043
0
{
5044
0
  unsigned int need;
5045
0
  if ((tls_mask & TLS_TLS) == 0)
5046
0
    need = 4;
5047
0
  else
5048
0
    {
5049
0
      need = 0;
5050
0
      if ((tls_mask & TLS_GD) != 0)
5051
0
  need += 8;
5052
0
      if ((tls_mask & (TLS_TPREL | TLS_GDIE)) != 0)
5053
0
  need += 4;
5054
0
      if ((tls_mask & TLS_DTPREL) != 0)
5055
0
  need += 4;
5056
0
    }
5057
0
  return need;
5058
0
}
5059
5060
/* If H is undefined, make it dynamic if that makes sense.  */
5061
5062
static bool
5063
ensure_undef_dynamic (struct bfd_link_info *info,
5064
          struct elf_link_hash_entry *h)
5065
0
{
5066
0
  struct elf_link_hash_table *htab = elf_hash_table (info);
5067
5068
0
  if (htab->dynamic_sections_created
5069
0
      && ((info->dynamic_undefined_weak != 0
5070
0
     && h->root.type == bfd_link_hash_undefweak)
5071
0
    || h->root.type == bfd_link_hash_undefined)
5072
0
      && h->dynindx == -1
5073
0
      && !h->forced_local
5074
0
      && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
5075
0
    return bfd_elf_link_record_dynamic_symbol (info, h);
5076
0
  return true;
5077
0
}
5078
5079
/* Choose whether to use htab->iplt or htab->pltlocal rather than the
5080
   usual htab->elf.splt section for a PLT entry.  */
5081
5082
static inline
5083
bool use_local_plt (struct bfd_link_info *info,
5084
         struct elf_link_hash_entry *h)
5085
0
{
5086
0
  return (h == NULL
5087
0
    || h->dynindx == -1
5088
0
    || !elf_hash_table (info)->dynamic_sections_created);
5089
0
}
5090
5091
/* Allocate space in associated reloc sections for dynamic relocs.  */
5092
5093
static bool
5094
allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
5095
0
{
5096
0
  struct bfd_link_info *info = inf;
5097
0
  struct ppc_elf_link_hash_entry *eh;
5098
0
  struct ppc_elf_link_hash_table *htab;
5099
0
  struct elf_dyn_relocs *p;
5100
5101
0
  if (h->root.type == bfd_link_hash_indirect)
5102
0
    return true;
5103
5104
0
  htab = ppc_elf_hash_table (info);
5105
0
  eh = (struct ppc_elf_link_hash_entry *) h;
5106
0
  if (eh->elf.got.refcount > 0
5107
0
      || (ELIMINATE_COPY_RELOCS
5108
0
    && !eh->elf.def_regular
5109
0
    && eh->elf.protected_def
5110
0
    && eh->has_addr16_ha
5111
0
    && eh->has_addr16_lo
5112
0
    && htab->params->pic_fixup > 0))
5113
0
    {
5114
      /* Make sure this symbol is output as a dynamic symbol.  */
5115
0
      if (!ensure_undef_dynamic (info, &eh->elf))
5116
0
  return false;
5117
5118
0
      unsigned int need = got_entries_needed (eh->tls_mask);
5119
0
      unsigned int rel_need = need * sizeof (Elf32_External_Rela) / 4;
5120
0
      if ((eh->tls_mask & (TLS_TLS | TLS_LD)) == (TLS_TLS | TLS_LD))
5121
0
  {
5122
0
    if (SYMBOL_REFERENCES_LOCAL (info, &eh->elf))
5123
      /* We'll just use htab->tlsld_got.offset.  This should
5124
         always be the case.  It's a little odd if we have
5125
         a local dynamic reloc against a non-local symbol.  */
5126
0
      htab->tlsld_got.refcount += 1;
5127
0
    else
5128
0
      {
5129
0
        need += 8;
5130
0
        rel_need += sizeof (Elf32_External_Rela);
5131
0
      }
5132
0
  }
5133
0
      if (need == 0)
5134
0
  eh->elf.got.offset = (bfd_vma) -1;
5135
0
      else
5136
0
  {
5137
0
    eh->elf.got.offset = allocate_got (htab, need);
5138
0
    if (((bfd_link_pic (info)
5139
0
    && !((eh->tls_mask & TLS_TLS) != 0
5140
0
         && bfd_link_executable (info)
5141
0
         && SYMBOL_REFERENCES_LOCAL (info, &eh->elf))
5142
0
    && !bfd_is_abs_symbol (&h->root))
5143
0
         || (htab->elf.dynamic_sections_created
5144
0
       && eh->elf.dynindx != -1
5145
0
       && !SYMBOL_REFERENCES_LOCAL (info, &eh->elf)))
5146
0
        && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, &eh->elf))
5147
0
      {
5148
0
        asection *rsec;
5149
5150
0
        rsec = htab->elf.srelgot;
5151
0
        if (eh->elf.type == STT_GNU_IFUNC)
5152
0
    rsec = htab->elf.irelplt;
5153
0
        rsec->size += rel_need;
5154
0
      }
5155
0
  }
5156
0
    }
5157
0
  else
5158
0
    eh->elf.got.offset = (bfd_vma) -1;
5159
5160
  /* If no dynamic sections we can't have dynamic relocs, except for
5161
     IFUNCs which are handled even in static executables.  */
5162
0
  if (!htab->elf.dynamic_sections_created
5163
0
      && h->type != STT_GNU_IFUNC)
5164
0
    h->dyn_relocs = NULL;
5165
5166
  /* Discard relocs on undefined symbols that must be local.  */
5167
0
  else if (h->root.type == bfd_link_hash_undefined
5168
0
     && ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
5169
0
    h->dyn_relocs = NULL;
5170
5171
  /* Also discard relocs on undefined weak syms with non-default
5172
     visibility, or when dynamic_undefined_weak says so.  */
5173
0
  else if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
5174
0
    h->dyn_relocs = NULL;
5175
5176
0
  if (h->dyn_relocs == NULL)
5177
0
    ;
5178
5179
  /* In the shared -Bsymbolic case, discard space allocated for
5180
     dynamic pc-relative relocs against symbols which turn out to be
5181
     defined in regular objects.  For the normal shared case, discard
5182
     space for relocs that have become local due to symbol visibility
5183
     changes.  */
5184
0
  else if (bfd_link_pic (info))
5185
0
    {
5186
      /* Relocs that use pc_count are those that appear on a call insn,
5187
   or certain REL relocs (see must_be_dyn_reloc) that can be
5188
   generated via assembly.  We want calls to protected symbols to
5189
   resolve directly to the function rather than going via the plt.
5190
   If people want function pointer comparisons to work as expected
5191
   then they should avoid writing weird assembly.  */
5192
0
      if (SYMBOL_CALLS_LOCAL (info, h))
5193
0
  {
5194
0
    struct elf_dyn_relocs **pp;
5195
5196
0
    for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
5197
0
      {
5198
0
        p->count -= p->pc_count;
5199
0
        p->pc_count = 0;
5200
0
        if (p->count == 0)
5201
0
    *pp = p->next;
5202
0
        else
5203
0
    pp = &p->next;
5204
0
      }
5205
0
  }
5206
5207
0
      if (htab->elf.target_os == is_vxworks)
5208
0
  {
5209
0
    struct elf_dyn_relocs **pp;
5210
5211
0
    for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
5212
0
      {
5213
0
        if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
5214
0
    *pp = p->next;
5215
0
        else
5216
0
    pp = &p->next;
5217
0
      }
5218
0
  }
5219
5220
0
      if (h->dyn_relocs != NULL)
5221
0
  {
5222
    /* Make sure this symbol is output as a dynamic symbol.  */
5223
0
    if (!ensure_undef_dynamic (info, h))
5224
0
      return false;
5225
0
  }
5226
0
    }
5227
0
  else if (ELIMINATE_COPY_RELOCS)
5228
0
    {
5229
      /* For the non-pic case, discard space for relocs against
5230
   symbols which turn out to need copy relocs or are not
5231
   dynamic.  */
5232
0
      if ((h->dynamic_adjusted
5233
0
     || (h->ref_regular
5234
0
         && h->root.type == bfd_link_hash_undefweak
5235
0
         && (info->dynamic_undefined_weak > 0
5236
0
       || !_bfd_elf_readonly_dynrelocs (h))))
5237
0
    && !h->def_regular
5238
0
    && !ELF_COMMON_DEF_P (h)
5239
0
    && !(h->protected_def
5240
0
         && eh->has_addr16_ha
5241
0
         && eh->has_addr16_lo
5242
0
         && htab->params->pic_fixup > 0))
5243
0
  {
5244
    /* Make sure this symbol is output as a dynamic symbol.  */
5245
0
    if (!ensure_undef_dynamic (info, h))
5246
0
      return false;
5247
5248
0
    if (h->dynindx == -1)
5249
0
      h->dyn_relocs = NULL;
5250
0
  }
5251
0
      else
5252
0
  h->dyn_relocs = NULL;
5253
0
    }
5254
5255
  /* Allocate space.  */
5256
0
  for (p = h->dyn_relocs; p != NULL; p = p->next)
5257
0
    if (!discarded_section (p->sec))
5258
0
      {
5259
0
  asection *sreloc = elf_section_data (p->sec)->sreloc;
5260
0
  if (eh->elf.type == STT_GNU_IFUNC)
5261
0
    sreloc = htab->elf.irelplt;
5262
0
  sreloc->size += p->count * sizeof (Elf32_External_Rela);
5263
0
      }
5264
5265
  /* Handle PLT relocs.  Done last, after dynindx has settled.
5266
     We might need a PLT entry when the symbol
5267
     a) is dynamic, or
5268
     b) is an ifunc, or
5269
     c) has plt16 relocs and has been processed by adjust_dynamic_symbol, or
5270
     d) has plt16 relocs and we are linking statically.  */
5271
0
  if ((htab->elf.dynamic_sections_created && h->dynindx != -1)
5272
0
      || h->type == STT_GNU_IFUNC
5273
0
      || (h->needs_plt && h->dynamic_adjusted)
5274
0
      || (h->needs_plt
5275
0
    && h->def_regular
5276
0
    && !htab->elf.dynamic_sections_created
5277
0
    && !htab->can_convert_all_inline_plt
5278
0
    && (ppc_elf_hash_entry (h)->tls_mask
5279
0
        & (TLS_TLS | PLT_KEEP)) == PLT_KEEP))
5280
0
    {
5281
0
      struct plt_entry *ent;
5282
0
      bool doneone = false;
5283
0
      bfd_vma plt_offset = 0, glink_offset = (bfd_vma) -1;
5284
5285
0
      for (ent = h->plt.plist; ent != NULL; ent = ent->next)
5286
0
  if (ent->plt.refcount > 0)
5287
0
    {
5288
0
      asection *s;
5289
0
      bool dyn;
5290
5291
0
      if (!ensure_undef_dynamic (info, h))
5292
0
        return false;
5293
5294
0
      dyn = !use_local_plt (info, h);
5295
0
      s = htab->elf.splt;
5296
0
      if (!dyn)
5297
0
        {
5298
0
    if (h->type == STT_GNU_IFUNC)
5299
0
      s = htab->elf.iplt;
5300
0
    else
5301
0
      s = htab->pltlocal;
5302
0
        }
5303
5304
0
      if (htab->plt_type == PLT_NEW || !dyn)
5305
0
        {
5306
0
    if (!doneone)
5307
0
      {
5308
0
        plt_offset = s->size;
5309
0
        s->size += 4;
5310
0
      }
5311
0
    ent->plt.offset = plt_offset;
5312
5313
0
    if (s == htab->pltlocal)
5314
0
      ent->glink_offset = glink_offset;
5315
0
    else
5316
0
      {
5317
0
        s = htab->glink;
5318
0
        if (!doneone || bfd_link_pic (info))
5319
0
          {
5320
0
      glink_offset = s->size;
5321
0
      s->size += GLINK_ENTRY_SIZE (htab, h);
5322
0
          }
5323
0
        if (!doneone
5324
0
      && !bfd_link_pic (info)
5325
0
      && h->def_dynamic
5326
0
      && !h->def_regular)
5327
0
          {
5328
0
      h->root.u.def.section = s;
5329
0
      h->root.u.def.value = glink_offset;
5330
0
          }
5331
0
        ent->glink_offset = glink_offset;
5332
5333
0
        if (htab->params->emit_stub_syms
5334
0
      && !add_stub_sym (ent, h, info))
5335
0
          return false;
5336
0
      }
5337
0
        }
5338
0
      else
5339
0
        {
5340
0
    if (!doneone)
5341
0
      {
5342
        /* If this is the first .plt entry, make room
5343
           for the special first entry.  */
5344
0
        if (s->size == 0)
5345
0
          s->size += htab->plt_initial_entry_size;
5346
5347
        /* The PowerPC PLT is actually composed of two
5348
           parts, the first part is 2 words (for a load
5349
           and a jump), and then there is a remaining
5350
           word available at the end.  */
5351
0
        plt_offset = (htab->plt_initial_entry_size
5352
0
          + (htab->plt_slot_size
5353
0
             * ((s->size
5354
0
           - htab->plt_initial_entry_size)
5355
0
          / htab->plt_entry_size)));
5356
5357
        /* If this symbol is not defined in a regular
5358
           file, and we are not generating a shared
5359
           library, then set the symbol to this location
5360
           in the .plt.  This is to avoid text
5361
           relocations, and is required to make
5362
           function pointers compare as equal between
5363
           the normal executable and the shared library.  */
5364
0
        if (! bfd_link_pic (info)
5365
0
      && h->def_dynamic
5366
0
      && !h->def_regular)
5367
0
          {
5368
0
      h->root.u.def.section = s;
5369
0
      h->root.u.def.value = plt_offset;
5370
0
          }
5371
5372
        /* Make room for this entry.  */
5373
0
        s->size += htab->plt_entry_size;
5374
        /* After the 8192nd entry, room for two entries
5375
           is allocated.  */
5376
0
        if (htab->plt_type == PLT_OLD
5377
0
      && (s->size - htab->plt_initial_entry_size)
5378
0
      / htab->plt_entry_size
5379
0
      > PLT_NUM_SINGLE_ENTRIES)
5380
0
          s->size += htab->plt_entry_size;
5381
0
      }
5382
0
    ent->plt.offset = plt_offset;
5383
0
        }
5384
5385
      /* We also need to make an entry in the .rela.plt section.  */
5386
0
      if (!doneone)
5387
0
        {
5388
0
    if (!dyn)
5389
0
      {
5390
0
        if (h->type == STT_GNU_IFUNC)
5391
0
          {
5392
0
      s = htab->elf.irelplt;
5393
0
      s->size += sizeof (Elf32_External_Rela);
5394
0
          }
5395
0
        else if (bfd_link_pic (info))
5396
0
          {
5397
0
      s = htab->relpltlocal;
5398
0
      s->size += sizeof (Elf32_External_Rela);
5399
0
          }
5400
0
      }
5401
0
    else
5402
0
      {
5403
0
        htab->elf.srelplt->size += sizeof (Elf32_External_Rela);
5404
5405
0
        if (htab->plt_type == PLT_VXWORKS)
5406
0
          {
5407
      /* Allocate space for the unloaded relocations.  */
5408
0
      if (!bfd_link_pic (info)
5409
0
          && htab->elf.dynamic_sections_created)
5410
0
        {
5411
0
          if (ent->plt.offset
5412
0
        == (bfd_vma) htab->plt_initial_entry_size)
5413
0
            {
5414
0
        htab->srelplt2->size
5415
0
          += (sizeof (Elf32_External_Rela)
5416
0
              * VXWORKS_PLTRESOLVE_RELOCS);
5417
0
            }
5418
5419
0
          htab->srelplt2->size
5420
0
            += (sizeof (Elf32_External_Rela)
5421
0
          * VXWORKS_PLT_NON_JMP_SLOT_RELOCS);
5422
0
        }
5423
5424
      /* Every PLT entry has an associated GOT entry in
5425
         .got.plt.  */
5426
0
      htab->elf.sgotplt->size += 4;
5427
0
          }
5428
0
      }
5429
0
    doneone = true;
5430
0
        }
5431
0
    }
5432
0
  else
5433
0
    ent->plt.offset = (bfd_vma) -1;
5434
5435
0
      if (!doneone)
5436
0
  {
5437
0
    h->plt.plist = NULL;
5438
0
    h->needs_plt = 0;
5439
0
  }
5440
0
    }
5441
0
  else
5442
0
    {
5443
0
      h->plt.plist = NULL;
5444
0
      h->needs_plt = 0;
5445
0
    }
5446
5447
0
  return true;
5448
0
}
5449
5450
static const unsigned char glink_eh_frame_cie[] =
5451
{
5452
  0, 0, 0, 16,        /* length.  */
5453
  0, 0, 0, 0,       /* id.  */
5454
  1,          /* CIE version.  */
5455
  'z', 'R', 0,        /* Augmentation string.  */
5456
  4,          /* Code alignment.  */
5457
  0x7c,         /* Data alignment.  */
5458
  65,         /* RA reg.  */
5459
  1,          /* Augmentation size.  */
5460
  DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding.  */
5461
  DW_CFA_def_cfa, 1, 0      /* def_cfa: r1 offset 0.  */
5462
};
5463
5464
/* Set the sizes of the dynamic sections.  */
5465
5466
static bool
5467
ppc_elf_late_size_sections (bfd *output_bfd,
5468
          struct bfd_link_info *info)
5469
0
{
5470
0
  struct ppc_elf_link_hash_table *htab;
5471
0
  asection *s;
5472
0
  bool relocs;
5473
0
  bfd *ibfd;
5474
5475
#ifdef DEBUG
5476
  fprintf (stderr, "ppc_elf_late_size_sections called\n");
5477
#endif
5478
5479
0
  htab = ppc_elf_hash_table (info);
5480
0
  if (htab->elf.dynobj == NULL)
5481
0
    return true;
5482
5483
0
  if (elf_hash_table (info)->dynamic_sections_created)
5484
0
    {
5485
      /* Set the contents of the .interp section to the interpreter.  */
5486
0
      if (bfd_link_executable (info) && !info->nointerp)
5487
0
  {
5488
0
    s = elf_hash_table (info)->interp;
5489
0
    BFD_ASSERT (s != NULL);
5490
0
    s->size = sizeof ELF_DYNAMIC_INTERPRETER;
5491
0
    s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
5492
0
    s->alloced = 1;
5493
0
  }
5494
0
    }
5495
5496
0
  if (htab->plt_type == PLT_OLD)
5497
0
    htab->got_header_size = 16;
5498
0
  else if (htab->plt_type == PLT_NEW)
5499
0
    htab->got_header_size = 12;
5500
5501
  /* Set up .got offsets for local syms, and space for local dynamic
5502
     relocs.  */
5503
0
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
5504
0
    {
5505
0
      bfd_signed_vma *local_got;
5506
0
      bfd_signed_vma *end_local_got;
5507
0
      struct plt_entry **local_plt;
5508
0
      struct plt_entry **end_local_plt;
5509
0
      char *lgot_masks;
5510
0
      bfd_size_type locsymcount;
5511
0
      Elf_Internal_Shdr *symtab_hdr;
5512
0
      Elf_Internal_Sym *local_syms;
5513
0
      Elf_Internal_Sym *isym;
5514
5515
0
      if (!is_ppc_elf (ibfd))
5516
0
  continue;
5517
5518
0
      for (s = ibfd->sections; s != NULL; s = s->next)
5519
0
  {
5520
0
    struct ppc_dyn_relocs *p;
5521
5522
0
    for (p = ((struct ppc_dyn_relocs *)
5523
0
        elf_section_data (s)->local_dynrel);
5524
0
         p != NULL;
5525
0
         p = p->next)
5526
0
      {
5527
0
        if (discarded_section (p->sec))
5528
0
    {
5529
      /* Input section has been discarded, either because
5530
         it is a copy of a linkonce section or due to
5531
         linker script /DISCARD/, so we'll be discarding
5532
         the relocs too.  */
5533
0
    }
5534
0
        else if (htab->elf.target_os == is_vxworks
5535
0
           && strcmp (p->sec->output_section->name,
5536
0
          ".tls_vars") == 0)
5537
0
    {
5538
      /* Relocations in vxworks .tls_vars sections are
5539
         handled specially by the loader.  */
5540
0
    }
5541
0
        else if (p->count != 0)
5542
0
    {
5543
0
      asection *sreloc = elf_section_data (p->sec)->sreloc;
5544
0
      if (p->ifunc)
5545
0
        sreloc = htab->elf.irelplt;
5546
0
      sreloc->size += p->count * sizeof (Elf32_External_Rela);
5547
0
      if ((p->sec->output_section->flags
5548
0
           & (SEC_READONLY | SEC_ALLOC))
5549
0
          == (SEC_READONLY | SEC_ALLOC))
5550
0
        {
5551
0
          info->flags |= DF_TEXTREL;
5552
0
          info->callbacks->minfo (_("%pB: dynamic relocation in read-only section `%pA'\n"),
5553
0
                p->sec->owner, p->sec);
5554
0
        }
5555
0
    }
5556
0
      }
5557
0
  }
5558
5559
0
      local_got = elf_local_got_refcounts (ibfd);
5560
0
      if (!local_got)
5561
0
  continue;
5562
5563
0
      symtab_hdr = &elf_symtab_hdr (ibfd);
5564
0
      locsymcount = symtab_hdr->sh_info;
5565
0
      end_local_got = local_got + locsymcount;
5566
0
      local_plt = (struct plt_entry **) end_local_got;
5567
0
      end_local_plt = local_plt + locsymcount;
5568
0
      lgot_masks = (char *) end_local_plt;
5569
0
      local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
5570
0
      if (local_syms == NULL && locsymcount != 0)
5571
0
  {
5572
0
    local_syms = bfd_elf_get_elf_syms (ibfd, symtab_hdr, locsymcount,
5573
0
               0, NULL, NULL, NULL);
5574
0
    if (local_syms == NULL)
5575
0
      return false;
5576
0
  }
5577
5578
0
      for (isym = local_syms;
5579
0
     local_got < end_local_got;
5580
0
     ++local_got, ++lgot_masks, ++isym)
5581
0
  if (*local_got > 0)
5582
0
    {
5583
0
      unsigned int need;
5584
0
      if ((*lgot_masks & (TLS_TLS | TLS_LD)) == (TLS_TLS | TLS_LD))
5585
0
        htab->tlsld_got.refcount += 1;
5586
0
      need = got_entries_needed (*lgot_masks);
5587
0
      if (need == 0)
5588
0
        *local_got = (bfd_vma) -1;
5589
0
      else
5590
0
        {
5591
0
    *local_got = allocate_got (htab, need);
5592
0
    if (bfd_link_pic (info)
5593
0
        && !((*lgot_masks & TLS_TLS) != 0
5594
0
       && bfd_link_executable (info))
5595
0
        && isym->st_shndx != SHN_ABS)
5596
0
      {
5597
0
        asection *srel;
5598
5599
0
        need *= sizeof (Elf32_External_Rela) / 4;
5600
0
        srel = htab->elf.srelgot;
5601
0
        if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
5602
0
          srel = htab->elf.irelplt;
5603
0
        srel->size += need;
5604
0
      }
5605
0
        }
5606
0
    }
5607
0
  else
5608
0
    *local_got = (bfd_vma) -1;
5609
5610
0
      if (htab->elf.target_os == is_vxworks)
5611
0
  continue;
5612
5613
      /* Allocate space for calls to local STT_GNU_IFUNC syms in .iplt.  */
5614
0
      lgot_masks = (char *) end_local_plt;
5615
0
      for (; local_plt < end_local_plt; ++local_plt, ++lgot_masks)
5616
0
  {
5617
0
    struct plt_entry *ent;
5618
0
    bool doneone = false;
5619
0
    bfd_vma plt_offset = 0, glink_offset = (bfd_vma) -1;
5620
5621
0
    for (ent = *local_plt; ent != NULL; ent = ent->next)
5622
0
      if (ent->plt.refcount > 0)
5623
0
        {
5624
0
    if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
5625
0
      s = htab->elf.iplt;
5626
0
    else if (htab->can_convert_all_inline_plt
5627
0
       || (*lgot_masks & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)
5628
0
      {
5629
0
        ent->plt.offset = (bfd_vma) -1;
5630
0
        continue;
5631
0
      }
5632
0
    else
5633
0
      s = htab->pltlocal;
5634
5635
0
    if (!doneone)
5636
0
      {
5637
0
        plt_offset = s->size;
5638
0
        s->size += 4;
5639
0
      }
5640
0
    ent->plt.offset = plt_offset;
5641
5642
0
    if (s != htab->pltlocal && (!doneone || bfd_link_pic (info)))
5643
0
      {
5644
0
        s = htab->glink;
5645
0
        glink_offset = s->size;
5646
0
        s->size += GLINK_ENTRY_SIZE (htab, NULL);
5647
0
      }
5648
0
    ent->glink_offset = glink_offset;
5649
5650
0
    if (!doneone)
5651
0
      {
5652
0
        if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
5653
0
          {
5654
0
      s = htab->elf.irelplt;
5655
0
      s->size += sizeof (Elf32_External_Rela);
5656
0
          }
5657
0
        else if (bfd_link_pic (info))
5658
0
          {
5659
0
      s = htab->relpltlocal;
5660
0
      s->size += sizeof (Elf32_External_Rela);
5661
0
          }
5662
0
        doneone = true;
5663
0
      }
5664
0
        }
5665
0
      else
5666
0
        ent->plt.offset = (bfd_vma) -1;
5667
0
  }
5668
5669
0
      if (local_syms != NULL
5670
0
    && symtab_hdr->contents != (unsigned char *) local_syms)
5671
0
  {
5672
0
    if (!info->keep_memory)
5673
0
      free (local_syms);
5674
0
    else
5675
0
      symtab_hdr->contents = (unsigned char *) local_syms;
5676
0
  }
5677
0
    }
5678
5679
  /* Allocate space for global sym dynamic relocs.  */
5680
0
  elf_link_hash_traverse (elf_hash_table (info), allocate_dynrelocs, info);
5681
5682
0
  if (htab->tlsld_got.refcount > 0)
5683
0
    {
5684
0
      htab->tlsld_got.offset = allocate_got (htab, 8);
5685
0
      if (bfd_link_dll (info))
5686
0
  htab->elf.srelgot->size += sizeof (Elf32_External_Rela);
5687
0
    }
5688
0
  else
5689
0
    htab->tlsld_got.offset = (bfd_vma) -1;
5690
5691
0
  if (htab->elf.sgot != NULL && htab->plt_type != PLT_VXWORKS)
5692
0
    {
5693
0
      unsigned int g_o_t = 32768;
5694
5695
      /* If we haven't allocated the header, do so now.  When we get here,
5696
   for old plt/got the got size will be 0 to 32764 (not allocated),
5697
   or 32780 to 65536 (header allocated).  For new plt/got, the
5698
   corresponding ranges are 0 to 32768 and 32780 to 65536.  */
5699
0
      if (htab->elf.sgot->size <= 32768)
5700
0
  {
5701
0
    g_o_t = htab->elf.sgot->size;
5702
0
    if (htab->plt_type == PLT_OLD)
5703
0
      g_o_t += 4;
5704
0
    htab->elf.sgot->size += htab->got_header_size;
5705
0
  }
5706
5707
0
      htab->elf.hgot->root.u.def.value = g_o_t;
5708
0
    }
5709
0
  if (bfd_link_pic (info))
5710
0
    {
5711
0
      struct elf_link_hash_entry *sda = htab->sdata[0].sym;
5712
5713
0
      sda->root.u.def.section = htab->elf.hgot->root.u.def.section;
5714
0
      sda->root.u.def.value = htab->elf.hgot->root.u.def.value;
5715
0
    }
5716
0
  if (info->emitrelocations)
5717
0
    {
5718
0
      struct elf_link_hash_entry *sda = htab->sdata[0].sym;
5719
5720
0
      if (sda != NULL && sda->ref_regular)
5721
0
  sda->root.u.def.section->flags |= SEC_KEEP;
5722
0
      sda = htab->sdata[1].sym;
5723
0
      if (sda != NULL && sda->ref_regular)
5724
0
  sda->root.u.def.section->flags |= SEC_KEEP;
5725
0
    }
5726
5727
0
  if (htab->glink != NULL
5728
0
      && htab->glink->size != 0
5729
0
      && htab->elf.dynamic_sections_created)
5730
0
    {
5731
0
      htab->glink_pltresolve = htab->glink->size;
5732
      /* Space for the branch table.  */
5733
0
      htab->glink->size
5734
0
  += htab->elf.srelplt->size / (sizeof (Elf32_External_Rela) / 4) - 4;
5735
      /* Pad out to align the start of PLTresolve.  */
5736
0
      htab->glink->size += -htab->glink->size & (htab->params->ppc476_workaround
5737
0
             ? 63 : 15);
5738
0
      htab->glink->size += GLINK_PLTRESOLVE;
5739
5740
0
      if (htab->params->emit_stub_syms)
5741
0
  {
5742
0
    struct elf_link_hash_entry *sh;
5743
0
    sh = elf_link_hash_lookup (&htab->elf, "__glink",
5744
0
             true, false, false);
5745
0
    if (sh == NULL)
5746
0
      return false;
5747
0
    if (sh->root.type == bfd_link_hash_new)
5748
0
      {
5749
0
        sh->root.type = bfd_link_hash_defined;
5750
0
        sh->root.u.def.section = htab->glink;
5751
0
        sh->root.u.def.value = htab->glink_pltresolve;
5752
0
        sh->ref_regular = 1;
5753
0
        sh->def_regular = 1;
5754
0
        sh->ref_regular_nonweak = 1;
5755
0
        sh->forced_local = 1;
5756
0
        sh->non_elf = 0;
5757
0
        sh->root.linker_def = 1;
5758
0
      }
5759
0
    sh = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
5760
0
             true, false, false);
5761
0
    if (sh == NULL)
5762
0
      return false;
5763
0
    if (sh->root.type == bfd_link_hash_new)
5764
0
      {
5765
0
        sh->root.type = bfd_link_hash_defined;
5766
0
        sh->root.u.def.section = htab->glink;
5767
0
        sh->root.u.def.value = htab->glink->size - GLINK_PLTRESOLVE;
5768
0
        sh->ref_regular = 1;
5769
0
        sh->def_regular = 1;
5770
0
        sh->ref_regular_nonweak = 1;
5771
0
        sh->forced_local = 1;
5772
0
        sh->non_elf = 0;
5773
0
        sh->root.linker_def = 1;
5774
0
      }
5775
0
  }
5776
0
    }
5777
5778
0
  if (htab->glink != NULL
5779
0
      && htab->glink->size != 0
5780
0
      && htab->glink_eh_frame != NULL
5781
0
      && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
5782
0
      && _bfd_elf_eh_frame_present (info))
5783
0
    {
5784
0
      s = htab->glink_eh_frame;
5785
0
      s->size = sizeof (glink_eh_frame_cie) + 20;
5786
0
      if (bfd_link_pic (info))
5787
0
  {
5788
0
    s->size += 4;
5789
0
    if (htab->glink->size - GLINK_PLTRESOLVE + 8 >= 256)
5790
0
      s->size += 4;
5791
0
  }
5792
0
    }
5793
5794
  /* We've now determined the sizes of the various dynamic sections.
5795
     Allocate memory for them.  */
5796
0
  relocs = false;
5797
0
  for (s = htab->elf.dynobj->sections; s != NULL; s = s->next)
5798
0
    {
5799
0
      bool strip_section = true;
5800
5801
0
      if ((s->flags & SEC_LINKER_CREATED) == 0)
5802
0
  continue;
5803
5804
0
      if (s == htab->elf.splt
5805
0
    || s == htab->elf.sgot)
5806
0
  {
5807
    /* We'd like to strip these sections if they aren't needed, but if
5808
       we've exported dynamic symbols from them we must leave them.
5809
       It's too late to tell BFD to get rid of the symbols.  */
5810
0
    if (htab->elf.hplt != NULL)
5811
0
      strip_section = false;
5812
    /* Strip this section if we don't need it; see the
5813
       comment below.  */
5814
0
  }
5815
0
      else if (s == htab->elf.iplt
5816
0
         || s == htab->pltlocal
5817
0
         || s == htab->glink
5818
0
         || s == htab->glink_eh_frame
5819
0
         || s == htab->elf.sgotplt
5820
0
         || s == htab->sbss
5821
0
         || s == htab->elf.sdynbss
5822
0
         || s == htab->elf.sdynrelro
5823
0
         || s == htab->dynsbss)
5824
0
  {
5825
    /* Strip these too.  */
5826
0
  }
5827
0
      else if (s == htab->sdata[0].section
5828
0
         || s == htab->sdata[1].section)
5829
0
  {
5830
0
    strip_section = (s->flags & SEC_KEEP) == 0;
5831
0
  }
5832
0
      else if (startswith (bfd_section_name (s), ".rela"))
5833
0
  {
5834
0
    if (s->size != 0)
5835
0
      {
5836
        /* Remember whether there are any relocation sections.  */
5837
0
        relocs = true;
5838
5839
        /* We use the reloc_count field as a counter if we need
5840
     to copy relocs into the output file.  */
5841
0
        s->reloc_count = 0;
5842
0
      }
5843
0
  }
5844
0
      else
5845
0
  {
5846
    /* It's not one of our sections, so don't allocate space.  */
5847
0
    continue;
5848
0
  }
5849
5850
0
      if (s->size == 0 && strip_section)
5851
0
  {
5852
    /* If we don't need this section, strip it from the
5853
       output file.  This is mostly to handle .rela.bss and
5854
       .rela.plt.  We must create both sections in
5855
       create_dynamic_sections, because they must be created
5856
       before the linker maps input sections to output
5857
       sections.  The linker does that before
5858
       adjust_dynamic_symbol is called, and it is that
5859
       function which decides whether anything needs to go
5860
       into these sections.  */
5861
0
    s->flags |= SEC_EXCLUDE;
5862
0
    continue;
5863
0
  }
5864
5865
0
      if ((s->flags & SEC_HAS_CONTENTS) == 0)
5866
0
  continue;
5867
5868
      /* Allocate memory for the section contents.  */
5869
0
      s->contents = bfd_zalloc (htab->elf.dynobj, s->size);
5870
0
      if (s->contents == NULL)
5871
0
  return false;
5872
0
      s->alloced = 1;
5873
0
    }
5874
5875
0
  if (htab->elf.dynamic_sections_created)
5876
0
    {
5877
      /* Add some entries to the .dynamic section.  We fill in the
5878
   values later, in ppc_elf_finish_dynamic_sections, but we
5879
   must add the entries now so that we get the correct size for
5880
   the .dynamic section.  The DT_DEBUG entry is filled in by the
5881
   dynamic linker and used by the debugger.  */
5882
0
#define add_dynamic_entry(TAG, VAL) \
5883
0
  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
5884
5885
0
      if (!_bfd_elf_maybe_vxworks_add_dynamic_tags (output_bfd, info,
5886
0
                relocs))
5887
0
  return false;
5888
5889
0
      if (htab->plt_type == PLT_NEW
5890
0
    && htab->glink != NULL
5891
0
    && htab->glink->size != 0)
5892
0
  {
5893
0
    if (!add_dynamic_entry (DT_PPC_GOT, 0))
5894
0
      return false;
5895
0
    if (!htab->params->no_tls_get_addr_opt
5896
0
        && htab->tls_get_addr != NULL
5897
0
        && htab->tls_get_addr->plt.plist != NULL
5898
0
        && !add_dynamic_entry (DT_PPC_OPT, PPC_OPT_TLS))
5899
0
      return false;
5900
0
  }
5901
0
   }
5902
0
#undef add_dynamic_entry
5903
5904
0
  if (htab->glink_eh_frame != NULL
5905
0
      && htab->glink_eh_frame->contents != NULL)
5906
0
    {
5907
0
      unsigned char *p = htab->glink_eh_frame->contents;
5908
0
      bfd_vma val;
5909
5910
0
      memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
5911
      /* CIE length (rewrite in case little-endian).  */
5912
0
      bfd_put_32 (htab->elf.dynobj, sizeof (glink_eh_frame_cie) - 4, p);
5913
0
      p += sizeof (glink_eh_frame_cie);
5914
      /* FDE length.  */
5915
0
      val = htab->glink_eh_frame->size - 4 - sizeof (glink_eh_frame_cie);
5916
0
      bfd_put_32 (htab->elf.dynobj, val, p);
5917
0
      p += 4;
5918
      /* CIE pointer.  */
5919
0
      val = p - htab->glink_eh_frame->contents;
5920
0
      bfd_put_32 (htab->elf.dynobj, val, p);
5921
0
      p += 4;
5922
      /* Offset to .glink.  Set later.  */
5923
0
      p += 4;
5924
      /* .glink size.  */
5925
0
      bfd_put_32 (htab->elf.dynobj, htab->glink->size, p);
5926
0
      p += 4;
5927
      /* Augmentation.  */
5928
0
      p += 1;
5929
5930
0
      if (bfd_link_pic (info)
5931
0
    && htab->elf.dynamic_sections_created)
5932
0
  {
5933
0
    bfd_vma adv = (htab->glink->size - GLINK_PLTRESOLVE + 8) >> 2;
5934
0
    if (adv < 64)
5935
0
      *p++ = DW_CFA_advance_loc + adv;
5936
0
    else if (adv < 256)
5937
0
      {
5938
0
        *p++ = DW_CFA_advance_loc1;
5939
0
        *p++ = adv;
5940
0
      }
5941
0
    else if (adv < 65536)
5942
0
      {
5943
0
        *p++ = DW_CFA_advance_loc2;
5944
0
        bfd_put_16 (htab->elf.dynobj, adv, p);
5945
0
        p += 2;
5946
0
      }
5947
0
    else
5948
0
      {
5949
0
        *p++ = DW_CFA_advance_loc4;
5950
0
        bfd_put_32 (htab->elf.dynobj, adv, p);
5951
0
        p += 4;
5952
0
      }
5953
0
    *p++ = DW_CFA_register;
5954
0
    *p++ = 65;
5955
0
    p++;
5956
0
    *p++ = DW_CFA_advance_loc + 4;
5957
0
    *p++ = DW_CFA_restore_extended;
5958
0
    *p++ = 65;
5959
0
  }
5960
0
      BFD_ASSERT ((bfd_vma) ((p + 3 - htab->glink_eh_frame->contents) & -4)
5961
0
      == htab->glink_eh_frame->size);
5962
0
    }
5963
5964
0
  return true;
5965
0
}
5966
5967
/* Arrange to have _SDA_BASE_ or _SDA2_BASE_ stripped from the output
5968
   if it looks like nothing is using them.  */
5969
5970
static void
5971
maybe_strip_sdasym (bfd *output_bfd, elf_linker_section_t *lsect)
5972
0
{
5973
0
  struct elf_link_hash_entry *sda = lsect->sym;
5974
5975
0
  if (sda != NULL && !sda->ref_regular && sda->dynindx == -1)
5976
0
    {
5977
0
      asection *s;
5978
5979
0
      s = bfd_get_section_by_name (output_bfd, lsect->name);
5980
0
      if (s == NULL || bfd_section_removed_from_list (output_bfd, s))
5981
0
  {
5982
0
    s = bfd_get_section_by_name (output_bfd, lsect->bss_name);
5983
0
    if (s == NULL || bfd_section_removed_from_list (output_bfd, s))
5984
0
      {
5985
0
        sda->def_regular = 0;
5986
        /* This is somewhat magic.  See elf_link_output_extsym.  */
5987
0
        sda->ref_dynamic = 1;
5988
0
        sda->forced_local = 0;
5989
0
      }
5990
0
  }
5991
0
    }
5992
0
}
5993
5994
void
5995
ppc_elf_maybe_strip_sdata_syms (struct bfd_link_info *info)
5996
0
{
5997
0
  struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
5998
5999
0
  if (htab != NULL)
6000
0
    {
6001
0
      maybe_strip_sdasym (info->output_bfd, &htab->sdata[0]);
6002
0
      maybe_strip_sdasym (info->output_bfd, &htab->sdata[1]);
6003
0
    }
6004
0
}
6005
6006
6007
/* Return TRUE if symbol should be hashed in the `.gnu.hash' section.  */
6008
6009
static bool
6010
ppc_elf_hash_symbol (struct elf_link_hash_entry *h)
6011
0
{
6012
0
  if (h->plt.plist != NULL
6013
0
      && !h->def_regular
6014
0
      && (!h->pointer_equality_needed
6015
0
    || !h->ref_regular_nonweak))
6016
0
    return false;
6017
6018
0
  return _bfd_elf_hash_symbol (h);
6019
0
}
6020

6021
0
#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
6022
6023
/* Relaxation trampolines.  r12 is available for clobbering (r11, is
6024
   used for some functions that are allowed to break the ABI).  */
6025
static const int shared_stub_entry[] =
6026
  {
6027
    0x7c0802a6, /* mflr 0 */
6028
    0x429f0005, /* bcl 20, 31, .Lxxx */
6029
    0x7d8802a6, /* mflr 12 */
6030
    0x3d8c0000, /* addis 12, 12, (xxx-.Lxxx)@ha */
6031
    0x398c0000, /* addi 12, 12, (xxx-.Lxxx)@l */
6032
    0x7c0803a6, /* mtlr 0 */
6033
    0x7d8903a6, /* mtctr 12 */
6034
    0x4e800420, /* bctr */
6035
  };
6036
6037
static const int stub_entry[] =
6038
  {
6039
    0x3d800000, /* lis 12,xxx@ha */
6040
    0x398c0000, /* addi 12,12,xxx@l */
6041
    0x7d8903a6, /* mtctr 12 */
6042
    0x4e800420, /* bctr */
6043
  };
6044
6045
struct ppc_elf_relax_info
6046
{
6047
  unsigned int workaround_size;
6048
  unsigned int picfixup_size;
6049
};
6050
6051
/* This function implements long branch trampolines, and the ppc476
6052
   icache bug workaround.  Any section needing trampolines or patch
6053
   space for the workaround has its size extended so that we can
6054
   add trampolines at the end of the section.  */
6055
6056
static bool
6057
ppc_elf_relax_section (bfd *abfd,
6058
           asection *isec,
6059
           struct bfd_link_info *link_info,
6060
           bool *again)
6061
0
{
6062
0
  struct one_branch_fixup
6063
0
  {
6064
0
    struct one_branch_fixup *next;
6065
0
    asection *tsec;
6066
    /* Final link, can use the symbol offset.  For a
6067
       relocatable link we use the symbol's index.  */
6068
0
    bfd_vma toff;
6069
0
    bfd_vma trampoff;
6070
0
  };
6071
6072
0
  Elf_Internal_Shdr *symtab_hdr;
6073
0
  bfd_byte *contents = NULL;
6074
0
  Elf_Internal_Sym *isymbuf = NULL;
6075
0
  Elf_Internal_Rela *internal_relocs = NULL;
6076
0
  Elf_Internal_Rela *irel, *irelend = NULL;
6077
0
  struct one_branch_fixup *branch_fixups = NULL;
6078
0
  struct ppc_elf_relax_info *relax_info = NULL;
6079
0
  unsigned changes = 0;
6080
0
  bool workaround_change;
6081
0
  struct ppc_elf_link_hash_table *htab;
6082
0
  bfd_size_type trampbase, trampoff, newsize, picfixup_size;
6083
0
  asection *got2;
6084
0
  bool maybe_pasted;
6085
6086
0
  *again = false;
6087
6088
  /* No need to do anything with non-alloc or non-code sections.  */
6089
0
  if ((isec->flags & SEC_ALLOC) == 0
6090
0
      || (isec->flags & SEC_CODE) == 0
6091
0
      || (isec->flags & SEC_HAS_CONTENTS) == 0
6092
0
      || (isec->flags & SEC_LINKER_CREATED) != 0
6093
0
      || isec->size < 4)
6094
0
    return true;
6095
6096
  /* We cannot represent the required PIC relocs in the output, so don't
6097
     do anything.  The linker doesn't support mixing -shared and -r
6098
     anyway.  */
6099
0
  if (bfd_link_relocatable (link_info) && bfd_link_pic (link_info))
6100
0
    return true;
6101
6102
0
  htab = ppc_elf_hash_table (link_info);
6103
0
  if (htab == NULL)
6104
0
    return true;
6105
6106
0
  isec->size = (isec->size + 3) & -4;
6107
0
  if (isec->rawsize == 0)
6108
0
    isec->rawsize = isec->size;
6109
0
  trampbase = isec->size;
6110
6111
0
  BFD_ASSERT (isec->sec_info_type == SEC_INFO_TYPE_NONE
6112
0
        || isec->sec_info_type == SEC_INFO_TYPE_TARGET);
6113
0
  isec->sec_info_type = SEC_INFO_TYPE_TARGET;
6114
6115
0
  if (htab->params->ppc476_workaround
6116
0
      || htab->params->pic_fixup > 0)
6117
0
    {
6118
0
      if (isec->sec_info == NULL)
6119
0
  {
6120
0
    isec->sec_info
6121
0
      = bfd_zalloc (abfd, sizeof (struct ppc_elf_relax_info));
6122
0
    if (isec->sec_info == NULL)
6123
0
      return false;
6124
0
  }
6125
0
      relax_info = isec->sec_info;
6126
0
      trampbase -= relax_info->workaround_size;
6127
0
    }
6128
6129
0
  maybe_pasted = (strcmp (isec->output_section->name, ".init") == 0
6130
0
      || strcmp (isec->output_section->name, ".fini") == 0);
6131
  /* Space for a branch around any trampolines.  */
6132
0
  trampoff = trampbase;
6133
0
  if (maybe_pasted && trampbase == isec->rawsize)
6134
0
    trampoff += 4;
6135
6136
0
  symtab_hdr = &elf_symtab_hdr (abfd);
6137
0
  picfixup_size = 0;
6138
0
  if (htab->params->branch_trampolines
6139
0
      || htab->params->pic_fixup > 0)
6140
0
    {
6141
      /* Get a copy of the native relocations.  */
6142
0
      if (isec->reloc_count != 0)
6143
0
  {
6144
0
    internal_relocs = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL,
6145
0
                   link_info->keep_memory);
6146
0
    if (internal_relocs == NULL)
6147
0
      goto error_return;
6148
0
  }
6149
6150
0
      got2 = bfd_get_section_by_name (abfd, ".got2");
6151
6152
0
      irelend = internal_relocs + isec->reloc_count;
6153
0
      for (irel = internal_relocs; irel < irelend; irel++)
6154
0
  {
6155
0
    unsigned long r_type = ELF32_R_TYPE (irel->r_info);
6156
0
    bfd_vma toff, roff;
6157
0
    asection *tsec;
6158
0
    struct one_branch_fixup *f;
6159
0
    size_t insn_offset = 0;
6160
0
    bfd_vma max_branch_offset = 0, val, reladdr;
6161
0
    bfd_byte *hit_addr;
6162
0
    unsigned long t0;
6163
0
    struct elf_link_hash_entry *h;
6164
0
    Elf_Internal_Sym *isym;
6165
0
    struct plt_entry **plist;
6166
0
    unsigned char sym_type;
6167
6168
0
    switch (r_type)
6169
0
      {
6170
0
      case R_PPC_REL24:
6171
0
      case R_PPC_LOCAL24PC:
6172
0
      case R_PPC_PLTREL24:
6173
0
      case R_PPC_PLTCALL:
6174
0
        max_branch_offset = 1 << 25;
6175
0
        break;
6176
6177
0
      case R_PPC_REL14:
6178
0
      case R_PPC_REL14_BRTAKEN:
6179
0
      case R_PPC_REL14_BRNTAKEN:
6180
0
        max_branch_offset = 1 << 15;
6181
0
        break;
6182
6183
0
      case R_PPC_ADDR16_HA:
6184
0
        if (htab->params->pic_fixup > 0)
6185
0
    break;
6186
0
        continue;
6187
6188
0
      default:
6189
0
        continue;
6190
0
      }
6191
6192
    /* Get the value of the symbol referred to by the reloc.  */
6193
0
    if (!get_sym_h (&h, &isym, &tsec, NULL, &isymbuf,
6194
0
        ELF32_R_SYM (irel->r_info), abfd))
6195
0
      goto error_return;
6196
6197
0
    if (isym != NULL)
6198
0
      {
6199
0
        if (tsec != NULL)
6200
0
    ;
6201
0
        else if (isym->st_shndx == SHN_ABS)
6202
0
    tsec = bfd_abs_section_ptr;
6203
0
        else
6204
0
    continue;
6205
6206
0
        toff = isym->st_value;
6207
0
        sym_type = ELF_ST_TYPE (isym->st_info);
6208
0
      }
6209
0
    else
6210
0
      {
6211
0
        if (tsec != NULL)
6212
0
    toff = h->root.u.def.value;
6213
0
        else if (h->root.type == bfd_link_hash_undefined
6214
0
           || h->root.type == bfd_link_hash_undefweak)
6215
0
    {
6216
0
      unsigned long indx;
6217
6218
0
      indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
6219
0
      tsec = bfd_und_section_ptr;
6220
0
      toff = bfd_link_relocatable (link_info) ? indx : 0;
6221
0
    }
6222
0
        else
6223
0
    continue;
6224
6225
        /* If this branch is to __tls_get_addr then we may later
6226
     optimise away the call.  We won't be needing a long-
6227
     branch stub in that case.  */
6228
0
        if (bfd_link_executable (link_info)
6229
0
      && h == htab->tls_get_addr
6230
0
      && irel != internal_relocs)
6231
0
    {
6232
0
      unsigned long t_symndx = ELF32_R_SYM (irel[-1].r_info);
6233
0
      unsigned long t_rtype = ELF32_R_TYPE (irel[-1].r_info);
6234
0
      unsigned int tls_mask = 0;
6235
6236
      /* The previous reloc should be one of R_PPC_TLSGD or
6237
         R_PPC_TLSLD, or for older object files, a reloc
6238
         on the __tls_get_addr arg setup insn.  Get tls
6239
         mask bits from the symbol on that reloc.  */
6240
0
      if (t_symndx < symtab_hdr->sh_info)
6241
0
        {
6242
0
          bfd_vma *local_got_offsets = elf_local_got_offsets (abfd);
6243
6244
0
          if (local_got_offsets != NULL)
6245
0
      {
6246
0
        struct plt_entry **local_plt = (struct plt_entry **)
6247
0
          (local_got_offsets + symtab_hdr->sh_info);
6248
0
        char *lgot_masks = (char *)
6249
0
          (local_plt + symtab_hdr->sh_info);
6250
0
        tls_mask = lgot_masks[t_symndx];
6251
0
      }
6252
0
        }
6253
0
      else
6254
0
        {
6255
0
          struct elf_link_hash_entry *th
6256
0
      = elf_sym_hashes (abfd)[t_symndx - symtab_hdr->sh_info];
6257
6258
0
          while (th->root.type == bfd_link_hash_indirect
6259
0
           || th->root.type == bfd_link_hash_warning)
6260
0
      th = (struct elf_link_hash_entry *) th->root.u.i.link;
6261
6262
0
          tls_mask
6263
0
      = ((struct ppc_elf_link_hash_entry *) th)->tls_mask;
6264
0
        }
6265
6266
      /* The mask bits tell us if the call will be
6267
         optimised away.  */
6268
0
      if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
6269
0
          && (t_rtype == R_PPC_TLSGD
6270
0
        || t_rtype == R_PPC_GOT_TLSGD16
6271
0
        || t_rtype == R_PPC_GOT_TLSGD16_LO))
6272
0
        continue;
6273
0
      if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
6274
0
          && (t_rtype == R_PPC_TLSLD
6275
0
        || t_rtype == R_PPC_GOT_TLSLD16
6276
0
        || t_rtype == R_PPC_GOT_TLSLD16_LO))
6277
0
        continue;
6278
0
    }
6279
6280
0
        sym_type = h->type;
6281
0
      }
6282
6283
0
    if (r_type == R_PPC_ADDR16_HA)
6284
0
      {
6285
0
        if (h != NULL
6286
0
      && !h->def_regular
6287
0
      && h->protected_def
6288
0
      && ppc_elf_hash_entry (h)->has_addr16_ha
6289
0
      && ppc_elf_hash_entry (h)->has_addr16_lo)
6290
0
    picfixup_size += 12;
6291
0
        continue;
6292
0
      }
6293
6294
    /* The condition here under which we call find_plt_ent must
6295
       match that in relocate_section.  If we call find_plt_ent here
6296
       but not in relocate_section, or vice versa, then the branch
6297
       destination used here may be incorrect.  */
6298
0
    plist = NULL;
6299
0
    if (h != NULL)
6300
0
      {
6301
        /* We know is_branch_reloc (r_type) is true.  */
6302
0
        if (h->type == STT_GNU_IFUNC
6303
0
      || r_type == R_PPC_PLTREL24)
6304
0
    plist = &h->plt.plist;
6305
0
      }
6306
0
    else if (sym_type == STT_GNU_IFUNC
6307
0
       && elf_local_got_offsets (abfd) != NULL)
6308
0
      {
6309
0
        bfd_vma *local_got_offsets = elf_local_got_offsets (abfd);
6310
0
        struct plt_entry **local_plt = (struct plt_entry **)
6311
0
    (local_got_offsets + symtab_hdr->sh_info);
6312
0
        plist = local_plt + ELF32_R_SYM (irel->r_info);
6313
0
      }
6314
0
    if (plist != NULL)
6315
0
      {
6316
0
        bfd_vma addend = 0;
6317
0
        struct plt_entry *ent;
6318
6319
0
        if (r_type == R_PPC_PLTREL24 && bfd_link_pic (link_info))
6320
0
    addend = irel->r_addend;
6321
0
        ent = find_plt_ent (plist, got2, addend);
6322
0
        if (ent != NULL)
6323
0
    {
6324
0
      if (htab->plt_type == PLT_NEW
6325
0
          || h == NULL
6326
0
          || !htab->elf.dynamic_sections_created
6327
0
          || h->dynindx == -1)
6328
0
        {
6329
0
          tsec = htab->glink;
6330
0
          toff = ent->glink_offset;
6331
0
        }
6332
0
      else
6333
0
        {
6334
0
          tsec = htab->elf.splt;
6335
0
          toff = ent->plt.offset;
6336
0
        }
6337
0
    }
6338
0
      }
6339
6340
    /* If the branch and target are in the same section, you have
6341
       no hope of adding stubs.  We'll error out later should the
6342
       branch overflow.  */
6343
0
    if (tsec == isec)
6344
0
      continue;
6345
6346
    /* toff is used for the symbol index when the symbol is
6347
       undefined and we're doing a relocatable link, so we can't
6348
       support addends.  It would be possible to do so by
6349
       putting the addend in one_branch_fixup but addends on
6350
       branches are rare so it hardly seems worth supporting.  */
6351
0
    if (bfd_link_relocatable (link_info)
6352
0
        && tsec == bfd_und_section_ptr
6353
0
        && r_type != R_PPC_PLTREL24
6354
0
        && irel->r_addend != 0)
6355
0
      continue;
6356
6357
    /* There probably isn't any reason to handle symbols in
6358
       SEC_MERGE sections;  SEC_MERGE doesn't seem a likely
6359
       attribute for a code section, and we are only looking at
6360
       branches.  However, implement it correctly here as a
6361
       reference for other target relax_section functions.  */
6362
0
    if (0 && tsec->sec_info_type == SEC_INFO_TYPE_MERGE)
6363
0
      {
6364
        /* At this stage in linking, no SEC_MERGE symbol has been
6365
     adjusted, so all references to such symbols need to be
6366
     passed through _bfd_merged_section_offset.  (Later, in
6367
     relocate_section, all SEC_MERGE symbols *except* for
6368
     section symbols have been adjusted.)
6369
6370
     gas may reduce relocations against symbols in SEC_MERGE
6371
     sections to a relocation against the section symbol when
6372
     the original addend was zero.  When the reloc is against
6373
     a section symbol we should include the addend in the
6374
     offset passed to _bfd_merged_section_offset, since the
6375
     location of interest is the original symbol.  On the
6376
     other hand, an access to "sym+addend" where "sym" is not
6377
     a section symbol should not include the addend;  Such an
6378
     access is presumed to be an offset from "sym";  The
6379
     location of interest is just "sym".  */
6380
0
        if (sym_type == STT_SECTION
6381
0
      && r_type != R_PPC_PLTREL24)
6382
0
    toff += irel->r_addend;
6383
6384
0
        toff
6385
0
    = _bfd_merged_section_offset (abfd, &tsec, toff);
6386
6387
0
        if (sym_type != STT_SECTION
6388
0
      && r_type != R_PPC_PLTREL24)
6389
0
    toff += irel->r_addend;
6390
0
      }
6391
    /* PLTREL24 addends are special.  */
6392
0
    else if (r_type != R_PPC_PLTREL24)
6393
0
      toff += irel->r_addend;
6394
6395
    /* Attempted -shared link of non-pic code loses.  */
6396
0
    if ((!bfd_link_relocatable (link_info)
6397
0
         && tsec == bfd_und_section_ptr)
6398
0
        || tsec->output_section == NULL
6399
0
        || (tsec->owner != NULL
6400
0
      && (tsec->owner->flags & BFD_PLUGIN) != 0))
6401
0
      continue;
6402
6403
0
    roff = irel->r_offset;
6404
0
    reladdr = isec->output_section->vma + isec->output_offset + roff;
6405
6406
    /* Avoid creating a lot of unnecessary fixups when
6407
       relocatable if the output section size is such that a
6408
       fixup can be created at final link.
6409
       The max_branch_offset adjustment allows for some number
6410
       of other fixups being needed at final link.  */
6411
0
    if (bfd_link_relocatable (link_info)
6412
0
        && (isec->output_section->rawsize - (isec->output_offset + roff)
6413
0
      < max_branch_offset - (max_branch_offset >> 4)))
6414
0
      continue;
6415
6416
    /* If the branch is in range, no need to do anything.  */
6417
0
    if (tsec != bfd_und_section_ptr
6418
0
        && (!bfd_link_relocatable (link_info)
6419
      /* A relocatable link may have sections moved during
6420
         final link, so do not presume they remain in range.  */
6421
0
      || tsec->output_section == isec->output_section))
6422
0
      {
6423
0
        bfd_vma symaddr;
6424
6425
0
        symaddr = tsec->output_section->vma + tsec->output_offset + toff;
6426
0
        if (symaddr - reladdr + max_branch_offset
6427
0
      < 2 * max_branch_offset)
6428
0
    continue;
6429
0
      }
6430
6431
    /* Look for an existing fixup to this address.  */
6432
0
    for (f = branch_fixups; f ; f = f->next)
6433
0
      if (f->tsec == tsec && f->toff == toff)
6434
0
        break;
6435
6436
0
    if (f == NULL)
6437
0
      {
6438
0
        size_t size;
6439
0
        unsigned long stub_rtype;
6440
6441
0
        val = trampoff - roff;
6442
0
        if (val >= max_branch_offset)
6443
    /* Oh dear, we can't reach a trampoline.  Don't try to add
6444
       one.  We'll report an error later.  */
6445
0
    continue;
6446
6447
0
        if (bfd_link_pic (link_info))
6448
0
    {
6449
0
      size = 4 * ARRAY_SIZE (shared_stub_entry);
6450
0
      insn_offset = 12;
6451
0
    }
6452
0
        else
6453
0
    {
6454
0
      size = 4 * ARRAY_SIZE (stub_entry);
6455
0
      insn_offset = 0;
6456
0
    }
6457
0
        stub_rtype = R_PPC_RELAX;
6458
0
        if (tsec == htab->elf.splt
6459
0
      || tsec == htab->glink)
6460
0
    {
6461
0
      stub_rtype = R_PPC_RELAX_PLT;
6462
0
      if (r_type == R_PPC_PLTREL24)
6463
0
        stub_rtype = R_PPC_RELAX_PLTREL24;
6464
0
    }
6465
6466
        /* Hijack the old relocation.  Since we need two
6467
     relocations for this use a "composite" reloc.  */
6468
0
        irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
6469
0
             stub_rtype);
6470
0
        irel->r_offset = trampoff + insn_offset;
6471
0
        if (r_type == R_PPC_PLTREL24
6472
0
      && stub_rtype != R_PPC_RELAX_PLTREL24)
6473
0
    irel->r_addend = 0;
6474
6475
        /* Record the fixup so we don't do it again this section.  */
6476
0
        f = bfd_malloc (sizeof (*f));
6477
0
        f->next = branch_fixups;
6478
0
        f->tsec = tsec;
6479
0
        f->toff = toff;
6480
0
        f->trampoff = trampoff;
6481
0
        branch_fixups = f;
6482
6483
0
        trampoff += size;
6484
0
        changes++;
6485
0
      }
6486
0
    else
6487
0
      {
6488
0
        val = f->trampoff - roff;
6489
0
        if (val >= max_branch_offset)
6490
0
    continue;
6491
6492
        /* Nop out the reloc, since we're finalizing things here.  */
6493
0
        irel->r_info = ELF32_R_INFO (0, R_PPC_NONE);
6494
0
      }
6495
6496
0
    link_info->callbacks->minfo
6497
0
      (_("%pB: Adjusting branch at 0x%V towards \"%s\" in section %s\n"),
6498
0
       abfd, reladdr,
6499
0
       (h && h->root.root.string? h->root.root.string : "<unknown>"),
6500
0
       f->tsec->name);
6501
6502
    /* Get the section contents.  */
6503
0
    if (contents == NULL)
6504
0
      {
6505
        /* Get cached copy if it exists.  */
6506
0
        if (elf_section_data (isec)->this_hdr.contents != NULL)
6507
0
    contents = elf_section_data (isec)->this_hdr.contents;
6508
        /* Go get them off disk.  */
6509
0
        else if (!bfd_malloc_and_get_section (abfd, isec, &contents))
6510
0
    goto error_return;
6511
0
      }
6512
6513
    /* Fix up the existing branch to hit the trampoline.  */
6514
0
    hit_addr = contents + roff;
6515
0
    switch (r_type)
6516
0
      {
6517
0
      case R_PPC_REL24:
6518
0
      case R_PPC_LOCAL24PC:
6519
0
      case R_PPC_PLTREL24:
6520
0
        t0 = bfd_get_32 (abfd, hit_addr);
6521
0
        t0 &= ~0x3fffffc;
6522
0
        t0 |= val & 0x3fffffc;
6523
0
        bfd_put_32 (abfd, t0, hit_addr);
6524
0
        break;
6525
6526
0
      case R_PPC_REL14:
6527
0
      case R_PPC_REL14_BRTAKEN:
6528
0
      case R_PPC_REL14_BRNTAKEN:
6529
0
        t0 = bfd_get_32 (abfd, hit_addr);
6530
0
        t0 &= ~0xfffc;
6531
0
        t0 |= val & 0xfffc;
6532
0
        bfd_put_32 (abfd, t0, hit_addr);
6533
0
        break;
6534
0
      }
6535
0
  }
6536
6537
0
      while (branch_fixups != NULL)
6538
0
  {
6539
0
    struct one_branch_fixup *f = branch_fixups;
6540
0
    branch_fixups = branch_fixups->next;
6541
0
    free (f);
6542
0
  }
6543
0
    }
6544
6545
0
  workaround_change = false;
6546
0
  newsize = trampoff;
6547
0
  if (htab->params->ppc476_workaround
6548
0
      && (!bfd_link_relocatable (link_info)
6549
0
    || isec->output_section->alignment_power >= htab->params->pagesize_p2))
6550
0
    {
6551
0
      bfd_vma addr, end_addr;
6552
0
      unsigned int crossings;
6553
0
      bfd_vma pagesize = (bfd_vma) 1 << htab->params->pagesize_p2;
6554
6555
0
      addr = isec->output_section->vma + isec->output_offset;
6556
0
      end_addr = addr + trampoff;
6557
0
      addr &= -pagesize;
6558
0
      crossings = ((end_addr & -pagesize) - addr) >> htab->params->pagesize_p2;
6559
0
      if (crossings != 0)
6560
0
  {
6561
    /* Keep space aligned, to ensure the patch code itself does
6562
       not cross a page.  Don't decrease size calculated on a
6563
       previous pass as otherwise we might never settle on a layout.  */
6564
0
    newsize = 15 - ((end_addr - 1) & 15);
6565
0
    newsize += crossings * 16;
6566
0
    if (relax_info->workaround_size < newsize)
6567
0
      {
6568
0
        relax_info->workaround_size = newsize;
6569
0
        workaround_change = true;
6570
0
      }
6571
    /* Ensure relocate_section is called.  */
6572
0
    isec->flags |= SEC_RELOC;
6573
0
  }
6574
0
      newsize = trampoff + relax_info->workaround_size;
6575
0
    }
6576
6577
0
  if (htab->params->pic_fixup > 0)
6578
0
    {
6579
0
      picfixup_size -= relax_info->picfixup_size;
6580
0
      if (picfixup_size != 0)
6581
0
  relax_info->picfixup_size += picfixup_size;
6582
0
      newsize += relax_info->picfixup_size;
6583
0
    }
6584
6585
0
  if (changes != 0 || picfixup_size != 0 || workaround_change)
6586
0
    isec->size = newsize;
6587
6588
0
  if (isymbuf != NULL
6589
0
      && symtab_hdr->contents != (unsigned char *) isymbuf)
6590
0
    {
6591
0
      if (! link_info->keep_memory)
6592
0
  free (isymbuf);
6593
0
      else
6594
0
  {
6595
    /* Cache the symbols for elf_link_input_bfd.  */
6596
0
    symtab_hdr->contents = (unsigned char *) isymbuf;
6597
0
  }
6598
0
    }
6599
6600
0
  if (contents != NULL
6601
0
      && elf_section_data (isec)->this_hdr.contents != contents)
6602
0
    {
6603
0
      if (!changes && !link_info->keep_memory)
6604
0
  free (contents);
6605
0
      else
6606
0
  {
6607
    /* Cache the section contents for elf_link_input_bfd.  */
6608
0
    elf_section_data (isec)->this_hdr.contents = contents;
6609
0
  }
6610
0
    }
6611
6612
0
  changes += picfixup_size;
6613
0
  if (changes != 0)
6614
0
    {
6615
      /* Append sufficient NOP relocs so we can write out relocation
6616
   information for the trampolines.  */
6617
0
      size_t old_size = isec->reloc_count * sizeof (*internal_relocs);
6618
0
      size_t extra_size = changes * sizeof (*internal_relocs);
6619
0
      internal_relocs = bfd_realloc (internal_relocs, old_size + extra_size);
6620
0
      elf_section_data (isec)->relocs = internal_relocs;
6621
0
      if (!internal_relocs)
6622
0
  goto error_return;
6623
0
      memset ((char *) internal_relocs + old_size, 0, extra_size);
6624
0
      isec->reloc_count += changes;
6625
0
      Elf_Internal_Shdr *rel_hdr = _bfd_elf_single_rel_hdr (isec);
6626
0
      rel_hdr->sh_size += changes * rel_hdr->sh_entsize;
6627
0
    }
6628
0
  else if (elf_section_data (isec)->relocs != internal_relocs)
6629
0
    free (internal_relocs);
6630
6631
0
  *again = changes != 0 || workaround_change;
6632
0
  return true;
6633
6634
0
 error_return:
6635
0
  while (branch_fixups != NULL)
6636
0
    {
6637
0
      struct one_branch_fixup *f = branch_fixups;
6638
0
      branch_fixups = branch_fixups->next;
6639
0
      free (f);
6640
0
    }
6641
0
  if ((unsigned char *) isymbuf != symtab_hdr->contents)
6642
0
    free (isymbuf);
6643
0
  if (elf_section_data (isec)->this_hdr.contents != contents)
6644
0
    free (contents);
6645
0
  if (elf_section_data (isec)->relocs != internal_relocs)
6646
0
    free (internal_relocs);
6647
0
  return false;
6648
0
}
6649

6650
/* What to do when ld finds relocations against symbols defined in
6651
   discarded sections.  */
6652
6653
static unsigned int
6654
ppc_elf_action_discarded (asection *sec)
6655
0
{
6656
0
  if (strcmp (".fixup", sec->name) == 0)
6657
0
    return 0;
6658
6659
0
  if (strcmp (".got2", sec->name) == 0)
6660
0
    return 0;
6661
6662
0
  return _bfd_elf_default_action_discarded (sec);
6663
0
}
6664

6665
/* Fill in the address for a pointer generated in a linker section.  */
6666
6667
static bfd_vma
6668
elf_finish_pointer_linker_section (bfd *input_bfd,
6669
           elf_linker_section_t *lsect,
6670
           struct elf_link_hash_entry *h,
6671
           bfd_vma relocation,
6672
           const Elf_Internal_Rela *rel)
6673
0
{
6674
0
  elf_linker_section_pointers_t *linker_section_ptr;
6675
6676
0
  BFD_ASSERT (lsect != NULL);
6677
6678
0
  if (h != NULL)
6679
0
    {
6680
      /* Handle global symbol.  */
6681
0
      struct ppc_elf_link_hash_entry *eh;
6682
6683
0
      eh = (struct ppc_elf_link_hash_entry *) h;
6684
0
      BFD_ASSERT (eh->elf.def_regular);
6685
0
      linker_section_ptr = eh->linker_section_pointer;
6686
0
    }
6687
0
  else
6688
0
    {
6689
      /* Handle local symbol.  */
6690
0
      unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
6691
6692
0
      BFD_ASSERT (is_ppc_elf (input_bfd));
6693
0
      BFD_ASSERT (elf_local_ptr_offsets (input_bfd) != NULL);
6694
0
      linker_section_ptr = elf_local_ptr_offsets (input_bfd)[r_symndx];
6695
0
    }
6696
6697
0
  linker_section_ptr = elf_find_pointer_linker_section (linker_section_ptr,
6698
0
              rel->r_addend,
6699
0
              lsect);
6700
0
  BFD_ASSERT (linker_section_ptr != NULL);
6701
6702
  /* Offset will always be a multiple of four, so use the bottom bit
6703
     as a "written" flag.  */
6704
0
  if ((linker_section_ptr->offset & 1) == 0)
6705
0
    {
6706
0
      bfd_put_32 (lsect->section->owner,
6707
0
      relocation + linker_section_ptr->addend,
6708
0
      lsect->section->contents + linker_section_ptr->offset);
6709
0
      linker_section_ptr->offset += 1;
6710
0
    }
6711
6712
0
  relocation = (lsect->section->output_section->vma
6713
0
    + lsect->section->output_offset
6714
0
    + linker_section_ptr->offset - 1
6715
0
    - SYM_VAL (lsect->sym));
6716
6717
#ifdef DEBUG
6718
  fprintf (stderr,
6719
     "Finish pointer in linker section %s, offset = %ld (0x%lx)\n",
6720
     lsect->name, (long) relocation, (long) relocation);
6721
#endif
6722
6723
0
  return relocation;
6724
0
}
6725
6726
#define PPC_LO(v) ((v) & 0xffff)
6727
0
#define PPC_HI(v) (((v) >> 16) & 0xffff)
6728
0
#define PPC_HA(v) PPC_HI ((v) + 0x8000)
6729
6730
static void
6731
write_glink_stub (struct elf_link_hash_entry *h, struct plt_entry *ent,
6732
      asection *plt_sec, unsigned char *p,
6733
      struct bfd_link_info *info)
6734
0
{
6735
0
  struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
6736
0
  bfd *output_bfd = info->output_bfd;
6737
0
  bfd_vma plt;
6738
0
  unsigned char *end = p + GLINK_ENTRY_SIZE (htab, h);
6739
6740
0
  if (h != NULL
6741
0
      && h == htab->tls_get_addr
6742
0
      && !htab->params->no_tls_get_addr_opt)
6743
0
    {
6744
0
      bfd_put_32 (output_bfd, LWZ_11_3, p);
6745
0
      p += 4;
6746
0
      bfd_put_32 (output_bfd, LWZ_12_3 + 4, p);
6747
0
      p += 4;
6748
0
      bfd_put_32 (output_bfd, MR_0_3, p);
6749
0
      p += 4;
6750
0
      bfd_put_32 (output_bfd, CMPWI_11_0, p);
6751
0
      p += 4;
6752
0
      bfd_put_32 (output_bfd, ADD_3_12_2, p);
6753
0
      p += 4;
6754
0
      bfd_put_32 (output_bfd, BEQLR, p);
6755
0
      p += 4;
6756
0
      bfd_put_32 (output_bfd, MR_3_0, p);
6757
0
      p += 4;
6758
0
      bfd_put_32 (output_bfd, NOP, p);
6759
0
      p += 4;
6760
0
    }
6761
6762
0
  plt = ((ent->plt.offset & ~1)
6763
0
   + plt_sec->output_section->vma
6764
0
   + plt_sec->output_offset);
6765
6766
0
  if (bfd_link_pic (info))
6767
0
    {
6768
0
      bfd_vma got = 0;
6769
6770
0
      if (ent->addend >= 32768)
6771
0
  got = (ent->addend
6772
0
         + ent->sec->output_section->vma
6773
0
         + ent->sec->output_offset);
6774
0
      else if (htab->elf.hgot != NULL)
6775
0
  got = SYM_VAL (htab->elf.hgot);
6776
6777
0
      plt -= got;
6778
6779
0
      if (plt + 0x8000 < 0x10000)
6780
0
  bfd_put_32 (output_bfd, LWZ_11_30 + PPC_LO (plt), p);
6781
0
      else
6782
0
  {
6783
0
    bfd_put_32 (output_bfd, ADDIS_11_30 + PPC_HA (plt), p);
6784
0
    p += 4;
6785
0
    bfd_put_32 (output_bfd, LWZ_11_11 + PPC_LO (plt), p);
6786
0
  }
6787
0
    }
6788
0
  else
6789
0
    {
6790
0
      bfd_put_32 (output_bfd, LIS_11 + PPC_HA (plt), p);
6791
0
      p += 4;
6792
0
      bfd_put_32 (output_bfd, LWZ_11_11 + PPC_LO (plt), p);
6793
0
    }
6794
0
  p += 4;
6795
0
  bfd_put_32 (output_bfd, MTCTR_11, p);
6796
0
  p += 4;
6797
0
  bfd_put_32 (output_bfd, BCTR, p);
6798
0
  p += 4;
6799
0
  while (p < end)
6800
0
    {
6801
0
      bfd_put_32 (output_bfd, htab->params->ppc476_workaround ? BA : NOP, p);
6802
0
      p += 4;
6803
0
    }
6804
0
}
6805
6806
/* Return true if symbol is defined statically.  */
6807
6808
static bool
6809
is_static_defined (struct elf_link_hash_entry *h)
6810
0
{
6811
0
  return ((h->root.type == bfd_link_hash_defined
6812
0
     || h->root.type == bfd_link_hash_defweak)
6813
0
    && h->root.u.def.section != NULL
6814
0
    && h->root.u.def.section->output_section != NULL);
6815
0
}
6816
6817
/* If INSN is an opcode that may be used with an @tls operand, return
6818
   the transformed insn for TLS optimisation, otherwise return 0.  If
6819
   REG is non-zero only match an insn with RB or RA equal to REG.  */
6820
6821
unsigned int
6822
bfd_elf_ppc_at_tls_transform (unsigned int insn, unsigned int reg)
6823
0
{
6824
0
  unsigned int rtra;
6825
6826
0
  if ((insn & (0x3fu << 26)) != 31 << 26)
6827
0
    return 0;
6828
6829
0
  if (reg == 0 || ((insn >> 11) & 0x1f) == reg)
6830
0
    rtra = insn & ((1 << 26) - (1 << 16));
6831
0
  else if (((insn >> 16) & 0x1f) == reg)
6832
0
    rtra = (insn & (0x1f << 21)) | ((insn & (0x1f << 11)) << 5);
6833
0
  else
6834
0
    return 0;
6835
6836
0
  if ((insn & (0x3ff << 1)) == 266 << 1)
6837
    /* add -> addi.  */
6838
0
    insn = 14 << 26;
6839
0
  else if ((insn & (0x1f << 1)) == 23 << 1
6840
0
     && ((insn & (0x1f << 6)) < 14 << 6
6841
0
         || ((insn & (0x1f << 6)) >= 16 << 6
6842
0
       && (insn & (0x1f << 6)) < 24 << 6)))
6843
    /* load and store indexed -> dform.  */
6844
0
    insn = (32u | ((insn >> 6) & 0x1f)) << 26;
6845
0
  else if ((insn & (((0x1a << 5) | 0x1f) << 1)) == 21 << 1)
6846
    /* ldx, ldux, stdx, stdux -> ld, ldu, std, stdu.  */
6847
0
    insn = ((58u | ((insn >> 6) & 4)) << 26) | ((insn >> 6) & 1);
6848
0
  else if ((insn & (((0x1f << 5) | 0x1f) << 1)) == 341 << 1)
6849
    /* lwax -> lwa.  */
6850
0
    insn = (58u << 26) | 2;
6851
0
  else
6852
0
    return 0;
6853
0
  insn |= rtra;
6854
0
  return insn;
6855
0
}
6856
6857
/* If INSN is an opcode that may be used with an @tprel operand, return
6858
   the transformed insn for an undefined weak symbol, ie. with the
6859
   thread pointer REG operand removed.  Otherwise return 0.  */
6860
6861
unsigned int
6862
_bfd_elf_ppc_at_tprel_transform (unsigned int insn, unsigned int reg)
6863
0
{
6864
0
  if ((insn & (0x1f << 16)) == reg << 16
6865
0
      && ((insn & (0x3fu << 26)) == 14u << 26 /* addi */
6866
0
    || (insn & (0x3fu << 26)) == 15u << 26 /* addis */
6867
0
    || (insn & (0x3fu << 26)) == 32u << 26 /* lwz */
6868
0
    || (insn & (0x3fu << 26)) == 34u << 26 /* lbz */
6869
0
    || (insn & (0x3fu << 26)) == 36u << 26 /* stw */
6870
0
    || (insn & (0x3fu << 26)) == 38u << 26 /* stb */
6871
0
    || (insn & (0x3fu << 26)) == 40u << 26 /* lhz */
6872
0
    || (insn & (0x3fu << 26)) == 42u << 26 /* lha */
6873
0
    || (insn & (0x3fu << 26)) == 44u << 26 /* sth */
6874
0
    || (insn & (0x3fu << 26)) == 46u << 26 /* lmw */
6875
0
    || (insn & (0x3fu << 26)) == 47u << 26 /* stmw */
6876
0
    || (insn & (0x3fu << 26)) == 48u << 26 /* lfs */
6877
0
    || (insn & (0x3fu << 26)) == 50u << 26 /* lfd */
6878
0
    || (insn & (0x3fu << 26)) == 52u << 26 /* stfs */
6879
0
    || (insn & (0x3fu << 26)) == 54u << 26 /* stfd */
6880
0
    || ((insn & (0x3fu << 26)) == 58u << 26 /* lwa,ld,lmd */
6881
0
        && (insn & 3) != 1)
6882
0
    || ((insn & (0x3fu << 26)) == 62u << 26 /* std, stmd */
6883
0
        && ((insn & 3) == 0 || (insn & 3) == 3))))
6884
0
    {
6885
0
      insn &= ~(0x1f << 16);
6886
0
    }
6887
0
  else if ((insn & (0x1f << 21)) == reg << 21
6888
0
     && ((insn & (0x3eu << 26)) == 24u << 26 /* ori, oris */
6889
0
         || (insn & (0x3eu << 26)) == 26u << 26 /* xori,xoris */
6890
0
         || (insn & (0x3eu << 26)) == 28u << 26 /* andi,andis */))
6891
0
    {
6892
0
      insn &= ~(0x1f << 21);
6893
0
      insn |= (insn & (0x1f << 16)) << 5;
6894
0
      if ((insn & (0x3eu << 26)) == 26u << 26 /* xori,xoris */)
6895
0
  insn -= 2 >> 26;  /* convert to ori,oris */
6896
0
    }
6897
0
  else
6898
0
    insn = 0;
6899
0
  return insn;
6900
0
}
6901
6902
static bool
6903
is_insn_ds_form (unsigned int insn)
6904
0
{
6905
0
  return ((insn & (0x3fu << 26)) == 58u << 26 /* ld,ldu,lwa */
6906
0
    || (insn & (0x3fu << 26)) == 62u << 26 /* std,stdu,stq */
6907
0
    || (insn & (0x3fu << 26)) == 57u << 26 /* lfdp */
6908
0
    || (insn & (0x3fu << 26)) == 61u << 26 /* stfdp */);
6909
0
}
6910
6911
static bool
6912
is_insn_dq_form (unsigned int insn)
6913
0
{
6914
0
  return ((insn & (0x3fu << 26)) == 56u << 26 /* lq */
6915
0
    || ((insn & (0x3fu << 26)) == (61u << 26) /* lxv, stxv */
6916
0
        && (insn & 3) == 1));
6917
0
}
6918
6919
static bool
6920
swap_reloc_out (bfd *obfd, Elf_Internal_Rela *rel, bfd_byte *loc, asection *s)
6921
0
{
6922
0
  if ((size_t) (loc - s->contents) >= s->size)
6923
0
    return false;
6924
0
  bfd_elf32_swap_reloca_out (obfd, rel, loc);
6925
0
  return true;
6926
0
}
6927
6928
static bool
6929
count_and_swap_reloc_out (bfd *obfd, Elf_Internal_Rela *rel, asection *s)
6930
0
{
6931
0
  bfd_byte *loc = s->contents;
6932
0
  loc += s->reloc_count++ * sizeof (Elf32_External_Rela);
6933
0
  return swap_reloc_out (obfd, rel, loc, s);
6934
0
}
6935
6936
/* The RELOCATE_SECTION function is called by the ELF backend linker
6937
   to handle the relocations for a section.
6938
6939
   The relocs are always passed as Rela structures; if the section
6940
   actually uses Rel structures, the r_addend field will always be
6941
   zero.
6942
6943
   This function is responsible for adjust the section contents as
6944
   necessary, and (if using Rela relocs and generating a
6945
   relocatable output file) adjusting the reloc addend as
6946
   necessary.
6947
6948
   This function does not have to worry about setting the reloc
6949
   address or the reloc symbol index.
6950
6951
   LOCAL_SYMS is a pointer to the swapped in local symbols.
6952
6953
   LOCAL_SECTIONS is an array giving the section in the input file
6954
   corresponding to the st_shndx field of each local symbol.
6955
6956
   The global hash table entry for the global symbols can be found
6957
   via elf_sym_hashes (input_bfd).
6958
6959
   When generating relocatable output, this function must handle
6960
   STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
6961
   going to be the section symbol corresponding to the output
6962
   section, which means that the addend must be adjusted
6963
   accordingly.  */
6964
6965
static int
6966
ppc_elf_relocate_section (bfd *output_bfd,
6967
        struct bfd_link_info *info,
6968
        bfd *input_bfd,
6969
        asection *input_section,
6970
        bfd_byte *contents,
6971
        Elf_Internal_Rela *relocs,
6972
        Elf_Internal_Sym *local_syms,
6973
        asection **local_sections)
6974
0
{
6975
0
  Elf_Internal_Shdr *symtab_hdr;
6976
0
  struct elf_link_hash_entry **sym_hashes;
6977
0
  struct ppc_elf_link_hash_table *htab;
6978
0
  Elf_Internal_Rela *rel;
6979
0
  Elf_Internal_Rela *wrel;
6980
0
  Elf_Internal_Rela *relend;
6981
0
  Elf_Internal_Rela outrel;
6982
0
  asection *got2;
6983
0
  bfd_vma *local_got_offsets;
6984
0
  bool ret = true;
6985
0
  bfd_vma d_offset = (bfd_big_endian (input_bfd) ? 2 : 0);
6986
0
  bool is_vxworks_tls;
6987
0
  unsigned int picfixup_size = 0;
6988
0
  struct ppc_elf_relax_info *relax_info = NULL;
6989
6990
#ifdef DEBUG
6991
  _bfd_error_handler ("ppc_elf_relocate_section called for %pB section %pA, "
6992
          "%ld relocations%s",
6993
          input_bfd, input_section,
6994
          (long) input_section->reloc_count,
6995
          (bfd_link_relocatable (info)) ? " (relocatable)" : "");
6996
#endif
6997
6998
0
  if (!is_ppc_elf (input_bfd))
6999
0
    {
7000
0
      bfd_set_error (bfd_error_wrong_format);
7001
0
      return false;
7002
0
    }
7003
7004
0
  got2 = bfd_get_section_by_name (input_bfd, ".got2");
7005
7006
  /* Initialize howto table if not already done.  */
7007
0
  if (!ppc_elf_howto_table[R_PPC_ADDR32])
7008
0
    ppc_elf_howto_init ();
7009
7010
0
  htab = ppc_elf_hash_table (info);
7011
0
  local_got_offsets = elf_local_got_offsets (input_bfd);
7012
0
  symtab_hdr = &elf_symtab_hdr (input_bfd);
7013
0
  sym_hashes = elf_sym_hashes (input_bfd);
7014
  /* We have to handle relocations in vxworks .tls_vars sections
7015
     specially, because the dynamic loader is 'weird'.  */
7016
0
  is_vxworks_tls = (htab->elf.target_os == is_vxworks && bfd_link_pic (info)
7017
0
        && !strcmp (input_section->output_section->name,
7018
0
        ".tls_vars"));
7019
0
  if (input_section->sec_info_type == SEC_INFO_TYPE_TARGET)
7020
0
    relax_info = input_section->sec_info;
7021
0
  rel = wrel = relocs;
7022
0
  relend = relocs + input_section->reloc_count;
7023
0
  for (; rel < relend; wrel++, rel++)
7024
0
    {
7025
0
      enum elf_ppc_reloc_type r_type;
7026
0
      bfd_vma addend;
7027
0
      bfd_reloc_status_type r;
7028
0
      Elf_Internal_Sym *sym;
7029
0
      asection *sec;
7030
0
      struct elf_link_hash_entry *h;
7031
0
      const char *sym_name;
7032
0
      reloc_howto_type *howto;
7033
0
      unsigned long r_symndx;
7034
0
      bfd_vma relocation;
7035
0
      bfd_vma branch_bit, from;
7036
0
      bool unresolved_reloc, save_unresolved_reloc;
7037
0
      bool warned;
7038
0
      unsigned int tls_type, tls_mask, tls_gd;
7039
0
      struct plt_entry **ifunc, **plt_list;
7040
0
      struct reloc_howto_struct alt_howto;
7041
7042
0
    again:
7043
0
      r_type = ELF32_R_TYPE (rel->r_info);
7044
0
      sym = NULL;
7045
0
      sec = NULL;
7046
0
      h = NULL;
7047
0
      unresolved_reloc = false;
7048
0
      warned = false;
7049
0
      r_symndx = ELF32_R_SYM (rel->r_info);
7050
7051
0
      if (r_symndx < symtab_hdr->sh_info)
7052
0
  {
7053
0
    sym = local_syms + r_symndx;
7054
0
    sec = local_sections[r_symndx];
7055
0
    sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
7056
7057
0
    relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
7058
0
  }
7059
0
      else
7060
0
  {
7061
0
    bool ignored;
7062
7063
0
    RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
7064
0
           r_symndx, symtab_hdr, sym_hashes,
7065
0
           h, sec, relocation,
7066
0
           unresolved_reloc, warned, ignored);
7067
7068
0
    sym_name = h->root.root.string;
7069
0
  }
7070
7071
0
      if (sec != NULL && discarded_section (sec))
7072
0
  {
7073
    /* For relocs against symbols from removed linkonce sections,
7074
       or sections discarded by a linker script, we just want the
7075
       section contents zeroed.  Avoid any special processing.  */
7076
0
    if (r_type < ARRAY_SIZE (ppc_elf_howto_table)
7077
0
        && ppc_elf_howto_table[r_type] != NULL)
7078
0
      _bfd_clear_contents (ppc_elf_howto_table[r_type],
7079
0
         input_bfd, input_section,
7080
0
         contents, rel->r_offset);
7081
0
    wrel->r_offset = rel->r_offset;
7082
0
    wrel->r_info = 0;
7083
0
    wrel->r_addend = 0;
7084
7085
    /* For ld -r, remove relocations in debug sections against
7086
       symbols defined in discarded sections.  Not done for
7087
       non-debug to preserve relocs in .eh_frame which the
7088
       eh_frame editing code expects to be present.  */
7089
0
    if (bfd_link_relocatable (info)
7090
0
        && (input_section->flags & SEC_DEBUGGING))
7091
0
      wrel--;
7092
7093
0
    continue;
7094
0
  }
7095
7096
0
      if (bfd_link_relocatable (info))
7097
0
  {
7098
0
    if (got2 != NULL
7099
0
        && r_type == R_PPC_PLTREL24
7100
0
        && rel->r_addend != 0)
7101
0
      {
7102
        /* R_PPC_PLTREL24 is rather special.  If non-zero, the
7103
     addend specifies the GOT pointer offset within .got2.  */
7104
0
        rel->r_addend += got2->output_offset;
7105
0
      }
7106
0
    if (r_type != R_PPC_RELAX_PLT
7107
0
        && r_type != R_PPC_RELAX_PLTREL24
7108
0
        && r_type != R_PPC_RELAX)
7109
0
      goto copy_reloc;
7110
0
  }
7111
7112
      /* TLS optimizations.  Replace instruction sequences and relocs
7113
   based on information we collected in tls_optimize.  We edit
7114
   RELOCS so that --emit-relocs will output something sensible
7115
   for the final instruction stream.  */
7116
0
      tls_mask = 0;
7117
0
      tls_gd = 0;
7118
0
      if (h != NULL)
7119
0
  tls_mask = ((struct ppc_elf_link_hash_entry *) h)->tls_mask;
7120
0
      else if (local_got_offsets != NULL)
7121
0
  {
7122
0
    struct plt_entry **local_plt;
7123
0
    char *lgot_masks;
7124
0
    local_plt
7125
0
      = (struct plt_entry **) (local_got_offsets + symtab_hdr->sh_info);
7126
0
    lgot_masks = (char *) (local_plt + symtab_hdr->sh_info);
7127
0
    tls_mask = lgot_masks[r_symndx];
7128
0
  }
7129
7130
      /* Ensure reloc mapping code below stays sane.  */
7131
0
      if ((R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TLSGD16 & 3)
7132
0
    || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TLSGD16_LO & 3)
7133
0
    || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TLSGD16_HI & 3)
7134
0
    || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TLSGD16_HA & 3)
7135
0
    || (R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TPREL16 & 3)
7136
0
    || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TPREL16_LO & 3)
7137
0
    || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TPREL16_HI & 3)
7138
0
    || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TPREL16_HA & 3))
7139
0
  abort ();
7140
0
      switch (r_type)
7141
0
  {
7142
0
  default:
7143
0
    break;
7144
7145
0
  case R_PPC_GOT_TPREL16:
7146
0
  case R_PPC_GOT_TPREL16_LO:
7147
0
    if ((tls_mask & TLS_TLS) != 0
7148
0
        && (tls_mask & TLS_TPREL) == 0
7149
0
        && offset_in_range (input_section, rel->r_offset - d_offset, 4))
7150
0
      {
7151
0
        bfd_vma insn;
7152
7153
0
        insn = bfd_get_32 (input_bfd,
7154
0
         contents + rel->r_offset - d_offset);
7155
0
        insn &= 31 << 21;
7156
0
        insn |= 0x3c020000; /* addis 0,2,0 */
7157
0
        bfd_put_32 (input_bfd, insn,
7158
0
        contents + rel->r_offset - d_offset);
7159
0
        r_type = R_PPC_TPREL16_HA;
7160
0
        rel->r_info = ELF32_R_INFO (r_symndx, r_type);
7161
0
      }
7162
0
    break;
7163
7164
0
  case R_PPC_TLS:
7165
0
    if ((tls_mask & TLS_TLS) != 0
7166
0
        && (tls_mask & TLS_TPREL) == 0
7167
0
        && offset_in_range (input_section, rel->r_offset, 4))
7168
0
      {
7169
0
        bfd_vma insn;
7170
7171
0
        insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
7172
0
        insn = bfd_elf_ppc_at_tls_transform (insn, 2);
7173
0
        if (insn == 0)
7174
0
    abort ();
7175
0
        bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
7176
0
        r_type = R_PPC_TPREL16_LO;
7177
0
        rel->r_info = ELF32_R_INFO (r_symndx, r_type);
7178
7179
        /* Was PPC_TLS which sits on insn boundary, now
7180
     PPC_TPREL16_LO which is at low-order half-word.  */
7181
0
        rel->r_offset += d_offset;
7182
0
      }
7183
0
    break;
7184
7185
0
  case R_PPC_GOT_TLSGD16_HI:
7186
0
  case R_PPC_GOT_TLSGD16_HA:
7187
0
    tls_gd = TLS_GDIE;
7188
0
    if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
7189
0
        && offset_in_range (input_section, rel->r_offset - d_offset, 4))
7190
0
      goto tls_gdld_hi;
7191
0
    break;
7192
7193
0
  case R_PPC_GOT_TLSLD16_HI:
7194
0
  case R_PPC_GOT_TLSLD16_HA:
7195
0
    if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
7196
0
        && offset_in_range (input_section, rel->r_offset - d_offset, 4))
7197
0
      {
7198
0
      tls_gdld_hi:
7199
0
        if ((tls_mask & tls_gd) != 0)
7200
0
    r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
7201
0
        + R_PPC_GOT_TPREL16);
7202
0
        else
7203
0
    {
7204
0
      rel->r_offset -= d_offset;
7205
0
      bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
7206
0
      r_type = R_PPC_NONE;
7207
0
    }
7208
0
        rel->r_info = ELF32_R_INFO (r_symndx, r_type);
7209
0
      }
7210
0
    break;
7211
7212
0
  case R_PPC_GOT_TLSGD16:
7213
0
  case R_PPC_GOT_TLSGD16_LO:
7214
0
    tls_gd = TLS_GDIE;
7215
0
    if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
7216
0
        && offset_in_range (input_section, rel->r_offset - d_offset, 4))
7217
0
      goto tls_ldgd_opt;
7218
0
    break;
7219
7220
0
  case R_PPC_GOT_TLSLD16:
7221
0
  case R_PPC_GOT_TLSLD16_LO:
7222
0
    if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
7223
0
        && offset_in_range (input_section, rel->r_offset - d_offset, 4))
7224
0
      {
7225
0
        unsigned int insn1, insn2;
7226
0
        bfd_vma offset;
7227
7228
0
      tls_ldgd_opt:
7229
0
        offset = (bfd_vma) -1;
7230
        /* If not using the newer R_PPC_TLSGD/LD to mark
7231
     __tls_get_addr calls, we must trust that the call
7232
     stays with its arg setup insns, ie. that the next
7233
     reloc is the __tls_get_addr call associated with
7234
     the current reloc.  Edit both insns.  */
7235
0
        if (input_section->nomark_tls_get_addr
7236
0
      && rel + 1 < relend
7237
0
      && branch_reloc_hash_match (input_bfd, rel + 1,
7238
0
                htab->tls_get_addr))
7239
0
    offset = rel[1].r_offset;
7240
        /* We read the low GOT_TLS insn because we need to keep
7241
     the destination reg.  It may be something other than
7242
     the usual r3, and moved to r3 before the call by
7243
     intervening code.  */
7244
0
        insn1 = bfd_get_32 (input_bfd,
7245
0
          contents + rel->r_offset - d_offset);
7246
0
        if ((tls_mask & tls_gd) != 0)
7247
0
    {
7248
      /* IE */
7249
0
      insn1 &= (0x1f << 21) | (0x1f << 16);
7250
0
      insn1 |= 32u << 26; /* lwz */
7251
0
      if (offset != (bfd_vma) -1
7252
0
          && offset_in_range (input_section, offset, 4))
7253
0
        {
7254
0
          rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE);
7255
0
          insn2 = 0x7c631214; /* add 3,3,2 */
7256
0
          bfd_put_32 (input_bfd, insn2, contents + offset);
7257
0
        }
7258
0
      r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
7259
0
          + R_PPC_GOT_TPREL16);
7260
0
      rel->r_info = ELF32_R_INFO (r_symndx, r_type);
7261
0
    }
7262
0
        else
7263
0
    {
7264
      /* LE */
7265
0
      insn1 &= 0x1f << 21;
7266
0
      insn1 |= 0x3c020000;  /* addis r,2,0 */
7267
0
      if (tls_gd == 0)
7268
0
        {
7269
          /* Was an LD reloc.  */
7270
0
          for (r_symndx = 0;
7271
0
         r_symndx < symtab_hdr->sh_info;
7272
0
         r_symndx++)
7273
0
      if (local_sections[r_symndx] == sec)
7274
0
        break;
7275
0
          if (r_symndx >= symtab_hdr->sh_info)
7276
0
      r_symndx = STN_UNDEF;
7277
0
          rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
7278
0
          if (r_symndx != STN_UNDEF)
7279
0
      rel->r_addend -= (local_syms[r_symndx].st_value
7280
0
            + sec->output_offset
7281
0
            + sec->output_section->vma);
7282
0
        }
7283
0
      r_type = R_PPC_TPREL16_HA;
7284
0
      rel->r_info = ELF32_R_INFO (r_symndx, r_type);
7285
0
      if (offset != (bfd_vma) -1
7286
0
          && offset_in_range (input_section, offset, 4))
7287
0
        {
7288
0
          rel[1].r_info = ELF32_R_INFO (r_symndx, R_PPC_TPREL16_LO);
7289
0
          rel[1].r_offset = offset + d_offset;
7290
0
          rel[1].r_addend = rel->r_addend;
7291
0
          insn2 = 0x38630000; /* addi 3,3,0 */
7292
0
          bfd_put_32 (input_bfd, insn2, contents + offset);
7293
0
        }
7294
0
    }
7295
0
        bfd_put_32 (input_bfd, insn1,
7296
0
        contents + rel->r_offset - d_offset);
7297
0
        if (tls_gd == 0)
7298
0
    {
7299
      /* We changed the symbol on an LD reloc.  Start over
7300
         in order to get h, sym, sec etc. right.  */
7301
0
      goto again;
7302
0
    }
7303
0
      }
7304
0
    break;
7305
7306
0
  case R_PPC_TLSGD:
7307
0
    if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
7308
0
        && rel + 1 < relend
7309
0
        && offset_in_range (input_section, rel->r_offset, 4))
7310
0
      {
7311
0
        unsigned int insn2;
7312
0
        bfd_vma offset = rel->r_offset;
7313
7314
0
        if (is_plt_seq_reloc (ELF32_R_TYPE (rel[1].r_info)))
7315
0
    {
7316
0
      bfd_put_32 (input_bfd, NOP, contents + offset);
7317
0
      rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE);
7318
0
      break;
7319
0
    }
7320
7321
0
        if ((tls_mask & TLS_GDIE) != 0)
7322
0
    {
7323
      /* IE */
7324
0
      r_type = R_PPC_NONE;
7325
0
      insn2 = 0x7c631214; /* add 3,3,2 */
7326
0
    }
7327
0
        else
7328
0
    {
7329
      /* LE */
7330
0
      r_type = R_PPC_TPREL16_LO;
7331
0
      rel->r_offset += d_offset;
7332
0
      insn2 = 0x38630000; /* addi 3,3,0 */
7333
0
    }
7334
0
        rel->r_info = ELF32_R_INFO (r_symndx, r_type);
7335
0
        bfd_put_32 (input_bfd, insn2, contents + offset);
7336
        /* Zap the reloc on the _tls_get_addr call too.  */
7337
0
        BFD_ASSERT (offset == rel[1].r_offset);
7338
0
        rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE);
7339
0
      }
7340
0
    break;
7341
7342
0
  case R_PPC_TLSLD:
7343
0
    if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
7344
0
        && rel + 1 < relend
7345
0
        && offset_in_range (input_section, rel->r_offset, 4))
7346
0
      {
7347
0
        unsigned int insn2;
7348
7349
0
        if (is_plt_seq_reloc (ELF32_R_TYPE (rel[1].r_info)))
7350
0
    {
7351
0
      bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
7352
0
      rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE);
7353
0
      break;
7354
0
    }
7355
7356
0
        for (r_symndx = 0;
7357
0
       r_symndx < symtab_hdr->sh_info;
7358
0
       r_symndx++)
7359
0
    if (local_sections[r_symndx] == sec)
7360
0
      break;
7361
0
        if (r_symndx >= symtab_hdr->sh_info)
7362
0
    r_symndx = STN_UNDEF;
7363
0
        rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
7364
0
        if (r_symndx != STN_UNDEF)
7365
0
    rel->r_addend -= (local_syms[r_symndx].st_value
7366
0
          + sec->output_offset
7367
0
          + sec->output_section->vma);
7368
7369
0
        rel->r_info = ELF32_R_INFO (r_symndx, R_PPC_TPREL16_LO);
7370
0
        rel->r_offset += d_offset;
7371
0
        insn2 = 0x38630000; /* addi 3,3,0 */
7372
0
        bfd_put_32 (input_bfd, insn2,
7373
0
        contents + rel->r_offset - d_offset);
7374
        /* Zap the reloc on the _tls_get_addr call too.  */
7375
0
        BFD_ASSERT (rel->r_offset - d_offset == rel[1].r_offset);
7376
0
        rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE);
7377
0
        goto again;
7378
0
      }
7379
0
    break;
7380
0
  }
7381
7382
      /* Handle other relocations that tweak non-addend part of insn.  */
7383
0
      branch_bit = 0;
7384
0
      switch (r_type)
7385
0
  {
7386
0
  default:
7387
0
    break;
7388
7389
    /* Branch taken prediction relocations.  */
7390
0
  case R_PPC_ADDR14_BRTAKEN:
7391
0
  case R_PPC_REL14_BRTAKEN:
7392
0
    branch_bit = BRANCH_PREDICT_BIT;
7393
    /* Fall through.  */
7394
7395
    /* Branch not taken prediction relocations.  */
7396
0
  case R_PPC_ADDR14_BRNTAKEN:
7397
0
  case R_PPC_REL14_BRNTAKEN:
7398
0
    if (offset_in_range (input_section, rel->r_offset, 4))
7399
0
      {
7400
0
        unsigned int insn;
7401
7402
0
        insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
7403
0
        insn &= ~BRANCH_PREDICT_BIT;
7404
0
        insn |= branch_bit;
7405
7406
0
        from = (rel->r_offset
7407
0
          + input_section->output_offset
7408
0
          + input_section->output_section->vma);
7409
7410
        /* Invert 'y' bit if not the default.  */
7411
0
        if ((bfd_signed_vma) (relocation + rel->r_addend - from) < 0)
7412
0
    insn ^= BRANCH_PREDICT_BIT;
7413
7414
0
        bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
7415
0
      }
7416
0
    break;
7417
7418
0
  case R_PPC_PLT16_HA:
7419
0
    if (offset_in_range (input_section, rel->r_offset - d_offset, 4))
7420
0
      {
7421
0
        unsigned int insn;
7422
7423
0
        insn = bfd_get_32 (input_bfd,
7424
0
         contents + rel->r_offset - d_offset);
7425
0
        if ((insn & (0x3fu << 26)) == 15u << 26
7426
0
      && (insn & (0x1f << 16)) != 0)
7427
0
    {
7428
0
      if (!bfd_link_pic (info))
7429
0
        {
7430
          /* Convert addis to lis.  */
7431
0
          insn &= ~(0x1f << 16);
7432
0
          bfd_put_32 (input_bfd, insn,
7433
0
          contents + rel->r_offset - d_offset);
7434
0
        }
7435
0
    }
7436
0
        else if (bfd_link_pic (info))
7437
0
    info->callbacks->einfo
7438
0
      (_("%P: %H: error: %s with unexpected instruction %x\n"),
7439
0
       input_bfd, input_section, rel->r_offset,
7440
0
       "R_PPC_PLT16_HA", insn);
7441
0
      }
7442
0
    break;
7443
0
  }
7444
7445
0
      if (ELIMINATE_COPY_RELOCS
7446
0
    && h != NULL
7447
0
    && !h->def_regular
7448
0
    && h->protected_def
7449
0
    && ppc_elf_hash_entry (h)->has_addr16_ha
7450
0
    && ppc_elf_hash_entry (h)->has_addr16_lo
7451
0
    && htab->params->pic_fixup > 0)
7452
0
  {
7453
    /* Convert lis;addi or lis;load/store accessing a protected
7454
       variable defined in a shared library to PIC.  */
7455
0
    unsigned int insn;
7456
7457
0
    if (r_type == R_PPC_ADDR16_HA
7458
0
        && offset_in_range (input_section, rel->r_offset - d_offset, 4))
7459
0
      {
7460
0
        insn = bfd_get_32 (input_bfd,
7461
0
         contents + rel->r_offset - d_offset);
7462
0
        if ((insn & (0x3fu << 26)) == (15u << 26)
7463
0
      && (insn & (0x1f << 16)) == 0 /* lis */)
7464
0
    {
7465
0
      bfd_byte *p;
7466
0
      bfd_vma off;
7467
0
      bfd_vma got_addr;
7468
7469
0
      p = (contents + input_section->size
7470
0
           - relax_info->workaround_size
7471
0
           - relax_info->picfixup_size
7472
0
           + picfixup_size);
7473
0
      off = (p - contents) - (rel->r_offset - d_offset);
7474
0
      if (off > 0x1fffffc || (off & 3) != 0)
7475
0
        info->callbacks->einfo
7476
0
          (_("%H: fixup branch overflow\n"),
7477
0
           input_bfd, input_section, rel->r_offset);
7478
7479
0
      bfd_put_32 (input_bfd, B | off,
7480
0
            contents + rel->r_offset - d_offset);
7481
0
      got_addr = (htab->elf.sgot->output_section->vma
7482
0
            + htab->elf.sgot->output_offset
7483
0
            + (h->got.offset & ~1));
7484
0
      wrel->r_offset = (p - contents) + d_offset;
7485
0
      wrel->r_info = ELF32_R_INFO (0, R_PPC_ADDR16_HA);
7486
0
      wrel->r_addend = got_addr;
7487
0
      insn &= ~0xffff;
7488
0
      insn |= ((unsigned int) (got_addr + 0x8000) >> 16) & 0xffff;
7489
0
      bfd_put_32 (input_bfd, insn, p);
7490
7491
      /* Convert lis to lwz, loading address from GOT.  */
7492
0
      insn &= ~0xffff;
7493
0
      insn ^= (32u ^ 15u) << 26;
7494
0
      insn |= (insn & (0x1f << 21)) >> 5;
7495
0
      insn |= got_addr & 0xffff;
7496
0
      bfd_put_32 (input_bfd, insn, p + 4);
7497
7498
0
      bfd_put_32 (input_bfd, B | ((-4 - off) & 0x3ffffff), p + 8);
7499
0
      picfixup_size += 12;
7500
7501
      /* Use one of the spare relocs, so --emit-relocs
7502
         output is reasonable.  */
7503
0
      memmove (rel + 1, rel, (relend - rel - 1) * sizeof (*rel));
7504
0
      wrel++, rel++;
7505
0
      rel->r_offset = wrel[-1].r_offset + 4;
7506
0
      rel->r_info = ELF32_R_INFO (0, R_PPC_ADDR16_LO);
7507
0
      rel->r_addend = wrel[-1].r_addend;
7508
7509
      /* Continue on as if we had a got reloc, to output
7510
         dynamic reloc.  */
7511
0
      r_type = R_PPC_GOT16_LO;
7512
0
    }
7513
0
        else
7514
0
    _bfd_error_handler
7515
      /* xgettext:c-format */
7516
0
      (_("%pB(%pA+%#" PRIx64 "): error: "
7517
0
         "%s with unexpected instruction %#x"),
7518
0
       input_bfd, input_section, (uint64_t) rel->r_offset,
7519
0
       "R_PPC_ADDR16_HA", insn);
7520
0
      }
7521
0
    else if (r_type == R_PPC_ADDR16_LO
7522
0
       && offset_in_range (input_section,
7523
0
               rel->r_offset - d_offset, 4))
7524
0
      {
7525
0
        insn = bfd_get_32 (input_bfd,
7526
0
         contents + rel->r_offset - d_offset);
7527
0
        if ((insn & (0x3fu << 26)) == 14u << 26    /* addi */
7528
0
      || (insn & (0x3fu << 26)) == 32u << 26 /* lwz */
7529
0
      || (insn & (0x3fu << 26)) == 34u << 26 /* lbz */
7530
0
      || (insn & (0x3fu << 26)) == 36u << 26 /* stw */
7531
0
      || (insn & (0x3fu << 26)) == 38u << 26 /* stb */
7532
0
      || (insn & (0x3fu << 26)) == 40u << 26 /* lhz */
7533
0
      || (insn & (0x3fu << 26)) == 42u << 26 /* lha */
7534
0
      || (insn & (0x3fu << 26)) == 44u << 26 /* sth */
7535
0
      || (insn & (0x3fu << 26)) == 46u << 26 /* lmw */
7536
0
      || (insn & (0x3fu << 26)) == 47u << 26 /* stmw */
7537
0
      || (insn & (0x3fu << 26)) == 48u << 26 /* lfs */
7538
0
      || (insn & (0x3fu << 26)) == 50u << 26 /* lfd */
7539
0
      || (insn & (0x3fu << 26)) == 52u << 26 /* stfs */
7540
0
      || (insn & (0x3fu << 26)) == 54u << 26 /* stfd */
7541
0
      || ((insn & (0x3fu << 26)) == 58u << 26 /* lwa,ld,lmd */
7542
0
          && (insn & 3) != 1)
7543
0
      || ((insn & (0x3fu << 26)) == 62u << 26 /* std, stmd */
7544
0
          && ((insn & 3) == 0 || (insn & 3) == 3)))
7545
0
    {
7546
      /* Arrange to apply the reloc addend, if any.  */
7547
0
      relocation = 0;
7548
0
      unresolved_reloc = false;
7549
0
      rel->r_info = ELF32_R_INFO (0, r_type);
7550
0
    }
7551
0
        else
7552
0
    _bfd_error_handler
7553
      /* xgettext:c-format */
7554
0
      (_("%pB(%pA+%#" PRIx64 "): error: "
7555
0
         "%s with unexpected instruction %#x"),
7556
0
       input_bfd, input_section, (uint64_t) rel->r_offset,
7557
0
       "R_PPC_ADDR16_LO", insn);
7558
0
      }
7559
0
  }
7560
7561
0
      ifunc = NULL;
7562
0
      if (htab->elf.target_os != is_vxworks)
7563
0
  {
7564
0
    struct plt_entry *ent;
7565
7566
0
    if (h != NULL)
7567
0
      {
7568
0
        if (h->type == STT_GNU_IFUNC)
7569
0
    ifunc = &h->plt.plist;
7570
0
      }
7571
0
    else if (local_got_offsets != NULL
7572
0
       && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
7573
0
      {
7574
0
        struct plt_entry **local_plt;
7575
7576
0
        local_plt = (struct plt_entry **) (local_got_offsets
7577
0
             + symtab_hdr->sh_info);
7578
0
        ifunc = local_plt + r_symndx;
7579
0
      }
7580
7581
0
    ent = NULL;
7582
0
    if (ifunc != NULL
7583
0
        && (!bfd_link_pic (info)
7584
0
      || is_branch_reloc (r_type)
7585
0
      || r_type == R_PPC_PLT16_LO
7586
0
      || r_type == R_PPC_PLT16_HI
7587
0
      || r_type == R_PPC_PLT16_HA))
7588
0
      {
7589
0
        addend = 0;
7590
0
        if (bfd_link_pic (info)
7591
0
      && (r_type == R_PPC_PLTREL24
7592
0
          || r_type == R_PPC_PLT16_LO
7593
0
          || r_type == R_PPC_PLT16_HI
7594
0
          || r_type == R_PPC_PLT16_HA))
7595
0
    addend = rel->r_addend;
7596
0
        ent = find_plt_ent (ifunc, got2, addend);
7597
0
      }
7598
0
    if (ent != NULL)
7599
0
      {
7600
0
        if (bfd_link_pic (info)
7601
0
      && ent->sec != got2
7602
0
      && htab->plt_type != PLT_NEW
7603
0
      && (!htab->elf.dynamic_sections_created
7604
0
          || h == NULL
7605
0
          || h->dynindx == -1))
7606
0
    {
7607
      /* Uh oh, we are going to create a pic glink stub
7608
         for an ifunc (here for h == NULL and later in
7609
         finish_dynamic_symbol for h != NULL), and
7610
         apparently are using code compiled with
7611
         -mbss-plt.  The difficulty is that -mbss-plt code
7612
         gives no indication via a magic PLTREL24 addend
7613
         whether r30 is equal to _GLOBAL_OFFSET_TABLE_ or
7614
         is pointing into a .got2 section (and how far
7615
         into .got2).  */
7616
0
        info->callbacks->einfo
7617
          /* xgettext:c-format */
7618
0
          (_("%X%H: unsupported bss-plt -fPIC ifunc %s\n"),
7619
0
           input_bfd, input_section, rel->r_offset, sym_name);
7620
0
    }
7621
7622
0
        unresolved_reloc = false;
7623
0
        if (htab->plt_type == PLT_NEW
7624
0
      || !htab->elf.dynamic_sections_created
7625
0
      || h == NULL
7626
0
      || h->dynindx == -1)
7627
0
    relocation = (htab->glink->output_section->vma
7628
0
            + htab->glink->output_offset
7629
0
            + (ent->glink_offset & ~1));
7630
0
        else
7631
0
    relocation = (htab->elf.splt->output_section->vma
7632
0
            + htab->elf.splt->output_offset
7633
0
            + ent->plt.offset);
7634
0
      }
7635
0
  }
7636
7637
0
      addend = rel->r_addend;
7638
0
      save_unresolved_reloc = unresolved_reloc;
7639
0
      howto = NULL;
7640
0
      if (r_type < ARRAY_SIZE (ppc_elf_howto_table))
7641
0
  howto = ppc_elf_howto_table[r_type];
7642
7643
0
      tls_type = 0;
7644
0
      switch (r_type)
7645
0
  {
7646
0
  default:
7647
0
  de_fault:
7648
0
    if (howto)
7649
      /* xgettext:c-format */
7650
0
      _bfd_error_handler (_("%pB: %s unsupported"),
7651
0
        input_bfd, howto->name);
7652
0
    else
7653
      /* xgettext:c-format */
7654
0
      _bfd_error_handler (_("%pB: reloc %#x unsupported"),
7655
0
        input_bfd, r_type);
7656
7657
0
    bfd_set_error (bfd_error_bad_value);
7658
0
    ret = false;
7659
0
    goto copy_reloc;
7660
7661
0
  case R_PPC_NONE:
7662
0
  case R_PPC_TLS:
7663
0
  case R_PPC_TLSGD:
7664
0
  case R_PPC_TLSLD:
7665
0
  case R_PPC_EMB_MRKREF:
7666
0
  case R_PPC_GNU_VTINHERIT:
7667
0
  case R_PPC_GNU_VTENTRY:
7668
0
    goto copy_reloc;
7669
7670
    /* GOT16 relocations.  Like an ADDR16 using the symbol's
7671
       address in the GOT as relocation value instead of the
7672
       symbol's value itself.  Also, create a GOT entry for the
7673
       symbol and put the symbol value there.  */
7674
0
  case R_PPC_GOT_TLSGD16:
7675
0
  case R_PPC_GOT_TLSGD16_LO:
7676
0
  case R_PPC_GOT_TLSGD16_HI:
7677
0
  case R_PPC_GOT_TLSGD16_HA:
7678
0
    tls_type = TLS_TLS | TLS_GD;
7679
0
    goto dogot;
7680
7681
0
  case R_PPC_GOT_TLSLD16:
7682
0
  case R_PPC_GOT_TLSLD16_LO:
7683
0
  case R_PPC_GOT_TLSLD16_HI:
7684
0
  case R_PPC_GOT_TLSLD16_HA:
7685
0
    tls_type = TLS_TLS | TLS_LD;
7686
0
    goto dogot;
7687
7688
0
  case R_PPC_GOT_TPREL16:
7689
0
  case R_PPC_GOT_TPREL16_LO:
7690
0
  case R_PPC_GOT_TPREL16_HI:
7691
0
  case R_PPC_GOT_TPREL16_HA:
7692
0
    tls_type = TLS_TLS | TLS_TPREL;
7693
0
    goto dogot;
7694
7695
0
  case R_PPC_GOT_DTPREL16:
7696
0
  case R_PPC_GOT_DTPREL16_LO:
7697
0
  case R_PPC_GOT_DTPREL16_HI:
7698
0
  case R_PPC_GOT_DTPREL16_HA:
7699
0
    tls_type = TLS_TLS | TLS_DTPREL;
7700
0
    goto dogot;
7701
7702
0
  case R_PPC_GOT16:
7703
0
  case R_PPC_GOT16_LO:
7704
0
  case R_PPC_GOT16_HI:
7705
0
  case R_PPC_GOT16_HA:
7706
0
    tls_mask = 0;
7707
0
  dogot:
7708
0
    {
7709
      /* Relocation is to the entry for this symbol in the global
7710
         offset table.  */
7711
0
      bfd_vma off;
7712
0
      bfd_vma *offp;
7713
0
      unsigned long indx;
7714
7715
0
      if (htab->elf.sgot == NULL)
7716
0
        abort ();
7717
7718
0
      indx = 0;
7719
0
      if (tls_type == (TLS_TLS | TLS_LD)
7720
0
    && SYMBOL_REFERENCES_LOCAL (info, h))
7721
0
        offp = &htab->tlsld_got.offset;
7722
0
      else if (h != NULL)
7723
0
        {
7724
0
    if (!htab->elf.dynamic_sections_created
7725
0
        || h->dynindx == -1
7726
0
        || SYMBOL_REFERENCES_LOCAL (info, h)
7727
0
        || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
7728
      /* This is actually a static link, or it is a
7729
         -Bsymbolic link and the symbol is defined
7730
         locally, or the symbol was forced to be local
7731
         because of a version file.  */
7732
0
      ;
7733
0
    else
7734
0
      {
7735
0
        indx = h->dynindx;
7736
0
        unresolved_reloc = false;
7737
0
      }
7738
0
    offp = &h->got.offset;
7739
0
        }
7740
0
      else
7741
0
        {
7742
0
    if (local_got_offsets == NULL)
7743
0
      abort ();
7744
0
    offp = &local_got_offsets[r_symndx];
7745
0
        }
7746
7747
      /* The offset must always be a multiple of 4.  We use the
7748
         least significant bit to record whether we have already
7749
         processed this entry.  */
7750
0
      off = *offp;
7751
0
      if ((off & 1) != 0)
7752
0
        off &= ~1;
7753
0
      else
7754
0
        {
7755
0
    unsigned int tls_m = ((tls_mask & TLS_TLS) != 0
7756
0
              ? tls_mask & (TLS_LD | TLS_GD | TLS_DTPREL
7757
0
                | TLS_TPREL | TLS_GDIE)
7758
0
              : 0);
7759
7760
0
    if (offp == &htab->tlsld_got.offset)
7761
0
      tls_m = TLS_LD;
7762
0
    else if ((tls_m & TLS_LD) != 0
7763
0
       && SYMBOL_REFERENCES_LOCAL (info, h))
7764
0
      tls_m &= ~TLS_LD;
7765
7766
    /* We might have multiple got entries for this sym.
7767
       Initialize them all.  */
7768
0
    do
7769
0
      {
7770
0
        int tls_ty = 0;
7771
7772
0
        if ((tls_m & TLS_LD) != 0)
7773
0
          {
7774
0
      tls_ty = TLS_TLS | TLS_LD;
7775
0
      tls_m &= ~TLS_LD;
7776
0
          }
7777
0
        else if ((tls_m & TLS_GD) != 0)
7778
0
          {
7779
0
      tls_ty = TLS_TLS | TLS_GD;
7780
0
      tls_m &= ~TLS_GD;
7781
0
          }
7782
0
        else if ((tls_m & TLS_DTPREL) != 0)
7783
0
          {
7784
0
      tls_ty = TLS_TLS | TLS_DTPREL;
7785
0
      tls_m &= ~TLS_DTPREL;
7786
0
          }
7787
0
        else if ((tls_m & (TLS_TPREL | TLS_GDIE)) != 0)
7788
0
          {
7789
0
      tls_ty = TLS_TLS | TLS_TPREL;
7790
0
      tls_m = 0;
7791
0
          }
7792
7793
        /* Generate relocs for the dynamic linker.  */
7794
0
        if (indx != 0
7795
0
      || (bfd_link_pic (info)
7796
0
          && (h == NULL
7797
0
        || !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
7798
0
          && !(tls_ty != 0
7799
0
         && bfd_link_executable (info)
7800
0
         && SYMBOL_REFERENCES_LOCAL (info, h))
7801
0
          && (h != NULL
7802
0
        ? !bfd_is_abs_symbol (&h->root)
7803
0
        : sym->st_shndx != SHN_ABS)))
7804
0
          {
7805
0
      asection *rsec = htab->elf.srelgot;
7806
7807
0
      if (ifunc != NULL)
7808
0
        {
7809
0
          rsec = htab->elf.irelplt;
7810
0
          if (indx == 0)
7811
0
            htab->local_ifunc_resolver = 1;
7812
0
          else if (is_static_defined (h))
7813
0
            htab->maybe_local_ifunc_resolver = 1;
7814
0
        }
7815
0
      outrel.r_offset = (htab->elf.sgot->output_section->vma
7816
0
             + htab->elf.sgot->output_offset
7817
0
             + off);
7818
0
      outrel.r_addend = 0;
7819
0
      if (tls_ty & (TLS_LD | TLS_GD))
7820
0
        {
7821
0
          outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPMOD32);
7822
0
          if (tls_ty == (TLS_TLS | TLS_GD))
7823
0
            {
7824
0
        BFD_ASSERT (count_and_swap_reloc_out (output_bfd,
7825
0
                      &outrel,
7826
0
                      rsec));
7827
0
        outrel.r_offset += 4;
7828
0
        outrel.r_info
7829
0
          = ELF32_R_INFO (indx, R_PPC_DTPREL32);
7830
0
            }
7831
0
        }
7832
0
      else if (tls_ty == (TLS_TLS | TLS_DTPREL))
7833
0
        outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPREL32);
7834
0
      else if (tls_ty == (TLS_TLS | TLS_TPREL))
7835
0
        outrel.r_info = ELF32_R_INFO (indx, R_PPC_TPREL32);
7836
0
      else if (indx != 0)
7837
0
        outrel.r_info = ELF32_R_INFO (indx, R_PPC_GLOB_DAT);
7838
0
      else if (ifunc != NULL)
7839
0
        outrel.r_info = ELF32_R_INFO (0, R_PPC_IRELATIVE);
7840
0
      else
7841
0
        outrel.r_info = ELF32_R_INFO (0, R_PPC_RELATIVE);
7842
0
      if (indx == 0 && tls_ty != (TLS_TLS | TLS_LD))
7843
0
        {
7844
0
          outrel.r_addend += relocation;
7845
0
          if (tls_ty & (TLS_GD | TLS_DTPREL | TLS_TPREL))
7846
0
            {
7847
0
        if (htab->elf.tls_sec == NULL)
7848
0
          outrel.r_addend = 0;
7849
0
        else
7850
0
          outrel.r_addend -= htab->elf.tls_sec->vma;
7851
0
            }
7852
0
        }
7853
0
      BFD_ASSERT (count_and_swap_reloc_out (output_bfd,
7854
0
                    &outrel, rsec));
7855
0
          }
7856
7857
        /* Init the .got section contents if we're not
7858
           emitting a reloc.  */
7859
0
        else
7860
0
          {
7861
0
      bfd_vma value = relocation;
7862
7863
0
      if (tls_ty != 0)
7864
0
        {
7865
0
          if (htab->elf.tls_sec == NULL)
7866
0
            value = 0;
7867
0
          else
7868
0
            {
7869
0
        if (tls_ty & TLS_LD)
7870
0
          value = 0;
7871
0
        else
7872
0
          value -= htab->elf.tls_sec->vma + DTP_OFFSET;
7873
0
        if (tls_ty & TLS_TPREL)
7874
0
          value += DTP_OFFSET - TP_OFFSET;
7875
0
            }
7876
7877
0
          if (tls_ty & (TLS_LD | TLS_GD))
7878
0
            {
7879
0
        bfd_put_32 (input_bfd, value,
7880
0
              htab->elf.sgot->contents + off + 4);
7881
0
        value = 1;
7882
0
            }
7883
0
        }
7884
0
      bfd_put_32 (input_bfd, value,
7885
0
            htab->elf.sgot->contents + off);
7886
0
          }
7887
7888
0
        off += 4;
7889
0
        if (tls_ty & (TLS_LD | TLS_GD))
7890
0
          off += 4;
7891
0
      }
7892
0
    while (tls_m != 0);
7893
7894
0
    off = *offp;
7895
0
    *offp = off | 1;
7896
0
        }
7897
7898
0
      if (off >= (bfd_vma) -2)
7899
0
        abort ();
7900
7901
0
      if ((tls_type & TLS_TLS) != 0)
7902
0
        {
7903
0
    if (tls_type != (TLS_TLS | TLS_LD))
7904
0
      {
7905
0
        if ((tls_mask & TLS_LD) != 0
7906
0
      && !SYMBOL_REFERENCES_LOCAL (info, h))
7907
0
          off += 8;
7908
0
        if (tls_type != (TLS_TLS | TLS_GD))
7909
0
          {
7910
0
      if ((tls_mask & TLS_GD) != 0)
7911
0
        off += 8;
7912
0
      if (tls_type != (TLS_TLS | TLS_DTPREL))
7913
0
        {
7914
0
          if ((tls_mask & TLS_DTPREL) != 0)
7915
0
            off += 4;
7916
0
        }
7917
0
          }
7918
0
      }
7919
0
        }
7920
7921
      /* If here for a picfixup, we're done.  */
7922
0
      if (r_type != ELF32_R_TYPE (rel->r_info))
7923
0
        goto copy_reloc;
7924
7925
0
      relocation = (htab->elf.sgot->output_section->vma
7926
0
        + htab->elf.sgot->output_offset
7927
0
        + off
7928
0
        - SYM_VAL (htab->elf.hgot));
7929
7930
      /* Addends on got relocations don't make much sense.
7931
         x+off@got is actually x@got+off, and since the got is
7932
         generated by a hash table traversal, the value in the
7933
         got at entry m+n bears little relation to the entry m.  */
7934
0
      if (addend != 0)
7935
0
        info->callbacks->einfo
7936
    /* xgettext:c-format */
7937
0
    (_("%H: non-zero addend on %s reloc against `%s'\n"),
7938
0
     input_bfd, input_section, rel->r_offset,
7939
0
     howto->name,
7940
0
     sym_name);
7941
0
    }
7942
0
    break;
7943
7944
    /* Relocations that need no special processing.  */
7945
0
  case R_PPC_LOCAL24PC:
7946
    /* It makes no sense to point a local relocation
7947
       at a symbol not in this object.  */
7948
0
    if (unresolved_reloc)
7949
0
      {
7950
0
        (*info->callbacks->undefined_symbol) (info,
7951
0
                h->root.root.string,
7952
0
                input_bfd,
7953
0
                input_section,
7954
0
                rel->r_offset,
7955
0
                true);
7956
0
        goto copy_reloc;
7957
0
      }
7958
0
    if (h != NULL && h->type == STT_GNU_IFUNC && bfd_link_pic (info))
7959
0
      {
7960
        /* @local on an ifunc does not really make sense since
7961
     the ifunc resolver can take you anywhere.  More
7962
     seriously, calls to ifuncs must go through a plt call
7963
     stub, and for pic the plt call stubs uses r30 to
7964
     access the PLT.  The problem is that a call that is
7965
     local won't have the +32k reloc addend trick marking
7966
     -fPIC code, so the linker won't know whether r30 is
7967
     _GLOBAL_OFFSET_TABLE_ or pointing into a .got2 section.  */
7968
        /* xgettext:c-format */
7969
0
        info->callbacks->einfo (_("%X%H: @local call to ifunc %s\n"),
7970
0
              input_bfd, input_section, rel->r_offset,
7971
0
              h->root.root.string);
7972
0
      }
7973
0
    break;
7974
7975
0
  case R_PPC_DTPREL16:
7976
0
  case R_PPC_DTPREL16_LO:
7977
0
  case R_PPC_DTPREL16_HI:
7978
0
  case R_PPC_DTPREL16_HA:
7979
0
    if (htab->elf.tls_sec != NULL)
7980
0
      addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
7981
0
    break;
7982
7983
    /* Relocations that may need to be propagated if this is a shared
7984
       object.  */
7985
0
  case R_PPC_TPREL16:
7986
0
  case R_PPC_TPREL16_LO:
7987
0
  case R_PPC_TPREL16_HI:
7988
0
  case R_PPC_TPREL16_HA:
7989
0
    if (h != NULL
7990
0
        && h->root.type == bfd_link_hash_undefweak
7991
0
        && h->dynindx == -1
7992
0
        && offset_in_range (input_section, rel->r_offset - d_offset, 4))
7993
0
      {
7994
        /* Make this relocation against an undefined weak symbol
7995
     resolve to zero.  This is really just a tweak, since
7996
     code using weak externs ought to check that they are
7997
     defined before using them.  */
7998
0
        bfd_byte *p = contents + rel->r_offset - d_offset;
7999
0
        unsigned int insn = bfd_get_32 (input_bfd, p);
8000
0
        insn = _bfd_elf_ppc_at_tprel_transform (insn, 2);
8001
0
        if (insn != 0)
8002
0
    bfd_put_32 (input_bfd, insn, p);
8003
0
        break;
8004
0
      }
8005
0
    if (htab->elf.tls_sec != NULL)
8006
0
      addend -= htab->elf.tls_sec->vma + TP_OFFSET;
8007
    /* The TPREL16 relocs shouldn't really be used in shared
8008
       libs or with non-local symbols as that will result in
8009
       DT_TEXTREL being set, but support them anyway.  */
8010
0
    goto dodyn;
8011
8012
0
  case R_PPC_TPREL32:
8013
0
    if (htab->elf.tls_sec != NULL)
8014
0
      addend -= htab->elf.tls_sec->vma + TP_OFFSET;
8015
0
    goto dodyn;
8016
8017
0
  case R_PPC_DTPREL32:
8018
0
    if (htab->elf.tls_sec != NULL)
8019
0
      addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
8020
0
    goto dodyn;
8021
8022
0
  case R_PPC_DTPMOD32:
8023
0
    relocation = 1;
8024
0
    addend = 0;
8025
0
    goto dodyn;
8026
8027
0
  case R_PPC_REL16:
8028
0
  case R_PPC_REL16_LO:
8029
0
  case R_PPC_REL16_HI:
8030
0
  case R_PPC_REL16_HA:
8031
0
  case R_PPC_REL16DX_HA:
8032
0
    break;
8033
8034
0
  case R_PPC_REL32:
8035
0
    if (h == NULL || h == htab->elf.hgot)
8036
0
      break;
8037
    /* fall through */
8038
8039
0
  case R_PPC_ADDR32:
8040
0
  case R_PPC_ADDR16:
8041
0
  case R_PPC_ADDR16_LO:
8042
0
  case R_PPC_ADDR16_HI:
8043
0
  case R_PPC_ADDR16_HA:
8044
0
  case R_PPC_UADDR32:
8045
0
  case R_PPC_UADDR16:
8046
0
    goto dodyn;
8047
8048
0
  case R_PPC_VLE_REL8:
8049
0
  case R_PPC_VLE_REL15:
8050
0
  case R_PPC_VLE_REL24:
8051
0
  case R_PPC_REL24:
8052
0
  case R_PPC_REL14:
8053
0
  case R_PPC_REL14_BRTAKEN:
8054
0
  case R_PPC_REL14_BRNTAKEN:
8055
    /* If these relocations are not to a named symbol, they can be
8056
       handled right here, no need to bother the dynamic linker.  */
8057
0
    if (SYMBOL_CALLS_LOCAL (info, h)
8058
0
        || h == htab->elf.hgot)
8059
0
      break;
8060
    /* fall through */
8061
8062
0
  case R_PPC_ADDR24:
8063
0
  case R_PPC_ADDR14:
8064
0
  case R_PPC_ADDR14_BRTAKEN:
8065
0
  case R_PPC_ADDR14_BRNTAKEN:
8066
0
    if (h != NULL && !bfd_link_pic (info))
8067
0
      break;
8068
    /* fall through */
8069
8070
0
  dodyn:
8071
0
    if ((input_section->flags & SEC_ALLOC) == 0
8072
0
        || is_vxworks_tls)
8073
0
      break;
8074
8075
0
    if (bfd_link_pic (info)
8076
0
        ? ((h == NULL
8077
0
      || h->dyn_relocs != NULL)
8078
0
     && ((h != NULL && pc_dynrelocs (h))
8079
0
         || must_be_dyn_reloc (info, r_type)))
8080
0
        : (h != NULL
8081
0
     && h->dyn_relocs != NULL))
8082
0
      {
8083
0
        int skip;
8084
0
        asection *sreloc;
8085
0
        long indx = 0;
8086
8087
#ifdef DEBUG
8088
        fprintf (stderr, "ppc_elf_relocate_section needs to "
8089
           "create relocation for %s\n",
8090
           (h && h->root.root.string
8091
      ? h->root.root.string : "<unknown>"));
8092
#endif
8093
8094
        /* When generating a shared object, these relocations
8095
     are copied into the output file to be resolved at run
8096
     time.  */
8097
0
        skip = 0;
8098
0
        outrel.r_offset = _bfd_elf_section_offset (output_bfd, info,
8099
0
               input_section,
8100
0
               rel->r_offset);
8101
0
        if (outrel.r_offset == (bfd_vma) -1
8102
0
      || outrel.r_offset == (bfd_vma) -2)
8103
0
    skip = (int) outrel.r_offset;
8104
0
        outrel.r_offset += (input_section->output_section->vma
8105
0
          + input_section->output_offset);
8106
8107
        /* Optimize unaligned reloc use.  */
8108
0
        if ((r_type == R_PPC_ADDR32 && (outrel.r_offset & 3) != 0)
8109
0
      || (r_type == R_PPC_UADDR32 && (outrel.r_offset & 3) == 0))
8110
0
    r_type ^= R_PPC_ADDR32 ^ R_PPC_UADDR32;
8111
0
        if ((r_type == R_PPC_ADDR16 && (outrel.r_offset & 1) != 0)
8112
0
      || (r_type == R_PPC_UADDR16 && (outrel.r_offset & 1) == 0))
8113
0
    r_type ^= R_PPC_ADDR16 ^ R_PPC_UADDR16;
8114
8115
0
        if (skip)
8116
0
    memset (&outrel, 0, sizeof outrel);
8117
0
        else if (!SYMBOL_REFERENCES_LOCAL (info, h))
8118
0
    {
8119
0
      indx = h->dynindx;
8120
0
      BFD_ASSERT (indx != -1);
8121
0
      unresolved_reloc = false;
8122
0
      outrel.r_info = ELF32_R_INFO (indx, r_type);
8123
0
      outrel.r_addend = rel->r_addend;
8124
0
    }
8125
0
        else
8126
0
    {
8127
0
      outrel.r_addend = relocation + rel->r_addend;
8128
8129
0
      if (r_type != R_PPC_ADDR32)
8130
0
        {
8131
0
          if (ifunc != NULL)
8132
0
      {
8133
        /* If we get here when building a static
8134
           executable, then the libc startup function
8135
           responsible for applying indirect function
8136
           relocations is going to complain about
8137
           the reloc type.
8138
           If we get here when building a dynamic
8139
           executable, it will be because we have
8140
           a text relocation.  The dynamic loader
8141
           will set the text segment writable and
8142
           non-executable to apply text relocations.
8143
           So we'll segfault when trying to run the
8144
           indirection function to resolve the reloc.  */
8145
0
        info->callbacks->einfo
8146
          /* xgettext:c-format */
8147
0
          (_("%H: relocation %s for indirect "
8148
0
             "function %s unsupported\n"),
8149
0
           input_bfd, input_section, rel->r_offset,
8150
0
           howto->name,
8151
0
           sym_name);
8152
0
        ret = false;
8153
0
      }
8154
0
          else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
8155
0
      ;
8156
0
          else if (sec == NULL || sec->owner == NULL)
8157
0
      {
8158
0
        bfd_set_error (bfd_error_bad_value);
8159
0
        ret = false;
8160
0
      }
8161
0
          else
8162
0
      {
8163
0
        asection *osec;
8164
8165
        /* We are turning this relocation into one
8166
           against a section symbol.  It would be
8167
           proper to subtract the symbol's value,
8168
           osec->vma, from the emitted reloc addend,
8169
           but ld.so expects buggy relocs.
8170
           FIXME: Why not always use a zero index?  */
8171
0
        osec = sec->output_section;
8172
0
        if ((osec->flags & SEC_THREAD_LOCAL) != 0)
8173
0
          {
8174
0
            osec = htab->elf.tls_sec;
8175
0
            indx = 0;
8176
0
          }
8177
0
        else
8178
0
          {
8179
0
            indx = elf_section_data (osec)->dynindx;
8180
0
            if (indx == 0)
8181
0
        {
8182
0
          osec = htab->elf.text_index_section;
8183
0
          indx = elf_section_data (osec)->dynindx;
8184
0
        }
8185
0
            BFD_ASSERT (indx != 0);
8186
0
          }
8187
8188
        /* ld.so doesn't expect buggy TLS relocs.
8189
           Don't leave the symbol value in the
8190
           addend for them.  */
8191
0
        if (IS_PPC_TLS_RELOC (r_type))
8192
0
          outrel.r_addend -= osec->vma;
8193
0
      }
8194
8195
0
          outrel.r_info = ELF32_R_INFO (indx, r_type);
8196
0
        }
8197
0
      else if (ifunc != NULL)
8198
0
        outrel.r_info = ELF32_R_INFO (0, R_PPC_IRELATIVE);
8199
0
      else
8200
0
        outrel.r_info = ELF32_R_INFO (0, R_PPC_RELATIVE);
8201
0
    }
8202
8203
0
        sreloc = elf_section_data (input_section)->sreloc;
8204
0
        if (ifunc)
8205
0
    {
8206
0
      sreloc = htab->elf.irelplt;
8207
0
      if (indx == 0)
8208
0
        htab->local_ifunc_resolver = 1;
8209
0
      else if (is_static_defined (h))
8210
0
        htab->maybe_local_ifunc_resolver = 1;
8211
0
    }
8212
0
        if (sreloc == NULL)
8213
0
    return false;
8214
8215
0
        BFD_ASSERT (count_and_swap_reloc_out (output_bfd, &outrel,
8216
0
                sreloc));
8217
8218
0
        if (skip == -1)
8219
0
    goto copy_reloc;
8220
8221
        /* This reloc will be computed at runtime.  Clear the memory
8222
     so that it contains a predictable value for prelink.  */
8223
0
        if (!skip)
8224
0
    {
8225
0
      relocation = howto->pc_relative ? outrel.r_offset : 0;
8226
0
      addend = 0;
8227
0
      break;
8228
0
    }
8229
0
      }
8230
0
    break;
8231
8232
0
  case R_PPC_RELAX_PLT:
8233
0
  case R_PPC_RELAX_PLTREL24:
8234
0
    if (h != NULL)
8235
0
      {
8236
0
        struct plt_entry *ent;
8237
0
        bfd_vma got2_addend = 0;
8238
8239
0
        if (r_type == R_PPC_RELAX_PLTREL24)
8240
0
    {
8241
0
      if (bfd_link_pic (info))
8242
0
        got2_addend = addend;
8243
0
      addend = 0;
8244
0
    }
8245
0
        ent = find_plt_ent (&h->plt.plist, got2, got2_addend);
8246
0
        if (htab->plt_type == PLT_NEW)
8247
0
    relocation = (htab->glink->output_section->vma
8248
0
            + htab->glink->output_offset
8249
0
            + ent->glink_offset);
8250
0
        else
8251
0
    relocation = (htab->elf.splt->output_section->vma
8252
0
            + htab->elf.splt->output_offset
8253
0
            + ent->plt.offset);
8254
0
      }
8255
    /* Fall through.  */
8256
8257
0
  case R_PPC_RELAX:
8258
0
    if (bfd_link_pic (info)
8259
0
        ? offset_in_range (input_section, rel->r_offset - 12,
8260
0
         ARRAY_SIZE (shared_stub_entry) * 4)
8261
0
        : offset_in_range (input_section, rel->r_offset,
8262
0
         ARRAY_SIZE (stub_entry) * 4))
8263
0
      {
8264
0
        const int *stub;
8265
0
        size_t size;
8266
0
        size_t insn_offset = rel->r_offset;
8267
0
        unsigned int insn;
8268
8269
0
        if (bfd_link_pic (info))
8270
0
    {
8271
0
      relocation -= (input_section->output_section->vma
8272
0
         + input_section->output_offset
8273
0
         + rel->r_offset - 4);
8274
0
      stub = shared_stub_entry;
8275
0
      bfd_put_32 (input_bfd, stub[0], contents + insn_offset - 12);
8276
0
      bfd_put_32 (input_bfd, stub[1], contents + insn_offset - 8);
8277
0
      bfd_put_32 (input_bfd, stub[2], contents + insn_offset - 4);
8278
0
      stub += 3;
8279
0
      size = ARRAY_SIZE (shared_stub_entry) - 3;
8280
0
    }
8281
0
        else
8282
0
    {
8283
0
      stub = stub_entry;
8284
0
      size = ARRAY_SIZE (stub_entry);
8285
0
    }
8286
8287
0
        relocation += addend;
8288
0
        if (bfd_link_relocatable (info))
8289
0
    relocation = 0;
8290
8291
        /* First insn is HA, second is LO.  */
8292
0
        insn = *stub++;
8293
0
        insn |= ((relocation + 0x8000) >> 16) & 0xffff;
8294
0
        bfd_put_32 (input_bfd, insn, contents + insn_offset);
8295
0
        insn_offset += 4;
8296
8297
0
        insn = *stub++;
8298
0
        insn |= relocation & 0xffff;
8299
0
        bfd_put_32 (input_bfd, insn, contents + insn_offset);
8300
0
        insn_offset += 4;
8301
0
        size -= 2;
8302
8303
0
        while (size != 0)
8304
0
    {
8305
0
      insn = *stub++;
8306
0
      --size;
8307
0
      bfd_put_32 (input_bfd, insn, contents + insn_offset);
8308
0
      insn_offset += 4;
8309
0
    }
8310
8311
        /* Rewrite the reloc and convert one of the trailing nop
8312
     relocs to describe this relocation.  */
8313
0
        BFD_ASSERT (ELF32_R_TYPE (relend[-1].r_info) == R_PPC_NONE);
8314
        /* The relocs are at the bottom 2 bytes */
8315
0
        wrel->r_offset = rel->r_offset + d_offset;
8316
0
        wrel->r_info = ELF32_R_INFO (r_symndx, R_PPC_ADDR16_HA);
8317
0
        wrel->r_addend = rel->r_addend;
8318
0
        memmove (wrel + 1, wrel, (relend - wrel - 1) * sizeof (*wrel));
8319
0
        wrel++, rel++;
8320
0
        wrel->r_offset += 4;
8321
0
        wrel->r_info = ELF32_R_INFO (r_symndx, R_PPC_ADDR16_LO);
8322
0
      }
8323
0
    else
8324
0
      goto de_fault;
8325
0
    continue;
8326
8327
    /* Indirect .sdata relocation.  */
8328
0
  case R_PPC_EMB_SDAI16:
8329
0
    BFD_ASSERT (htab->sdata[0].section != NULL);
8330
0
    if (!is_static_defined (htab->sdata[0].sym))
8331
0
      {
8332
0
        unresolved_reloc = true;
8333
0
        break;
8334
0
      }
8335
0
    relocation
8336
0
      = elf_finish_pointer_linker_section (input_bfd, &htab->sdata[0],
8337
0
             h, relocation, rel);
8338
0
    addend = 0;
8339
0
    break;
8340
8341
    /* Indirect .sdata2 relocation.  */
8342
0
  case R_PPC_EMB_SDA2I16:
8343
0
    BFD_ASSERT (htab->sdata[1].section != NULL);
8344
0
    if (!is_static_defined (htab->sdata[1].sym))
8345
0
      {
8346
0
        unresolved_reloc = true;
8347
0
        break;
8348
0
      }
8349
0
    relocation
8350
0
      = elf_finish_pointer_linker_section (input_bfd, &htab->sdata[1],
8351
0
             h, relocation, rel);
8352
0
    addend = 0;
8353
0
    break;
8354
8355
    /* Handle the TOC16 reloc.  We want to use the offset within the .got
8356
       section, not the actual VMA.  This is appropriate when generating
8357
       an embedded ELF object, for which the .got section acts like the
8358
       AIX .toc section.  */
8359
0
  case R_PPC_TOC16:     /* phony GOT16 relocations */
8360
0
    if (sec == NULL || sec->output_section == NULL)
8361
0
      {
8362
0
        unresolved_reloc = true;
8363
0
        break;
8364
0
      }
8365
0
    BFD_ASSERT (strcmp (bfd_section_name (sec), ".got") == 0
8366
0
          || strcmp (bfd_section_name (sec), ".cgot") == 0);
8367
8368
0
    addend -= sec->output_section->vma + sec->output_offset + 0x8000;
8369
0
    break;
8370
8371
0
  case R_PPC_PLTREL24:
8372
0
    if (h != NULL && ifunc == NULL)
8373
0
      {
8374
0
        struct plt_entry *ent;
8375
8376
0
        ent = find_plt_ent (&h->plt.plist, got2,
8377
0
          bfd_link_pic (info) ? addend : 0);
8378
0
        if (ent == NULL
8379
0
      || htab->elf.splt == NULL)
8380
0
    {
8381
      /* We didn't make a PLT entry for this symbol.  This
8382
         happens when statically linking PIC code, or when
8383
         using -Bsymbolic.  */
8384
0
    }
8385
0
        else
8386
0
    {
8387
      /* Relocation is to the entry for this symbol in the
8388
         procedure linkage table.  */
8389
0
      unresolved_reloc = false;
8390
0
      if (htab->plt_type == PLT_NEW)
8391
0
        relocation = (htab->glink->output_section->vma
8392
0
          + htab->glink->output_offset
8393
0
          + ent->glink_offset);
8394
0
      else
8395
0
        relocation = (htab->elf.splt->output_section->vma
8396
0
          + htab->elf.splt->output_offset
8397
0
          + ent->plt.offset);
8398
0
    }
8399
0
      }
8400
8401
    /* R_PPC_PLTREL24 is rather special.  If non-zero, the
8402
       addend specifies the GOT pointer offset within .got2.
8403
       Don't apply it to the relocation field.  */
8404
0
    addend = 0;
8405
0
    break;
8406
8407
0
  case R_PPC_PLTSEQ:
8408
0
  case R_PPC_PLTCALL:
8409
0
  case R_PPC_PLT16_LO:
8410
0
  case R_PPC_PLT16_HI:
8411
0
  case R_PPC_PLT16_HA:
8412
0
    plt_list = NULL;
8413
0
    if (h != NULL)
8414
0
      plt_list = &h->plt.plist;
8415
0
    else if (ifunc != NULL)
8416
0
      plt_list = ifunc;
8417
0
    else if (local_got_offsets != NULL)
8418
0
      {
8419
0
        struct plt_entry **local_plt;
8420
0
        local_plt = (struct plt_entry **) (local_got_offsets
8421
0
             + symtab_hdr->sh_info);
8422
0
        plt_list = local_plt + r_symndx;
8423
0
      }
8424
0
    unresolved_reloc = true;
8425
0
    if (plt_list != NULL)
8426
0
      {
8427
0
        struct plt_entry *ent;
8428
8429
0
        ent = find_plt_ent (plt_list, got2,
8430
0
          bfd_link_pic (info) ? addend : 0);
8431
0
        if (ent != NULL && ent->plt.offset != (bfd_vma) -1)
8432
0
    {
8433
0
      asection *plt;
8434
8435
0
      unresolved_reloc = false;
8436
0
      plt = htab->elf.splt;
8437
0
      if (use_local_plt (info, h))
8438
0
        {
8439
0
          if (ifunc != NULL)
8440
0
      plt = htab->elf.iplt;
8441
0
          else
8442
0
      plt = htab->pltlocal;
8443
0
        }
8444
0
      relocation = (plt->output_section->vma
8445
0
        + plt->output_offset
8446
0
        + ent->plt.offset);
8447
0
      if (bfd_link_pic (info))
8448
0
        {
8449
0
          bfd_vma got = 0;
8450
8451
0
          if (ent->addend >= 32768)
8452
0
      got = (ent->addend
8453
0
             + ent->sec->output_section->vma
8454
0
             + ent->sec->output_offset);
8455
0
          else
8456
0
      got = SYM_VAL (htab->elf.hgot);
8457
0
          relocation -= got;
8458
0
        }
8459
0
    }
8460
0
      }
8461
0
    addend = 0;
8462
0
    break;
8463
8464
    /* Relocate against _SDA_BASE_.  */
8465
0
  case R_PPC_SDAREL16:
8466
0
    {
8467
0
      const char *name;
8468
0
      struct elf_link_hash_entry *sda = htab->sdata[0].sym;
8469
8470
0
      if (sec == NULL
8471
0
    || sec->output_section == NULL
8472
0
    || !is_static_defined (sda))
8473
0
        {
8474
0
    unresolved_reloc = true;
8475
0
    break;
8476
0
        }
8477
0
      addend -= SYM_VAL (sda);
8478
8479
0
      name = bfd_section_name (sec->output_section);
8480
0
      if (!(strcmp (name, ".sdata") == 0
8481
0
      || strcmp (name, ".sbss") == 0))
8482
0
        {
8483
0
    _bfd_error_handler
8484
      /* xgettext:c-format */
8485
0
      (_("%pB: the target (%s) of a %s relocation is "
8486
0
         "in the wrong output section (%s)"),
8487
0
       input_bfd,
8488
0
       sym_name,
8489
0
       howto->name,
8490
0
       name);
8491
0
        }
8492
0
    }
8493
0
    break;
8494
8495
    /* Relocate against _SDA2_BASE_.  */
8496
0
  case R_PPC_EMB_SDA2REL:
8497
0
    {
8498
0
      const char *name;
8499
0
      struct elf_link_hash_entry *sda = htab->sdata[1].sym;
8500
8501
0
      if (sec == NULL
8502
0
    || sec->output_section == NULL
8503
0
    || !is_static_defined (sda))
8504
0
        {
8505
0
    unresolved_reloc = true;
8506
0
    break;
8507
0
        }
8508
0
      addend -= SYM_VAL (sda);
8509
8510
0
      name = bfd_section_name (sec->output_section);
8511
0
      if (!(strcmp (name, ".sdata2") == 0
8512
0
      || strcmp (name, ".sbss2") == 0))
8513
0
        {
8514
0
    _bfd_error_handler
8515
      /* xgettext:c-format */
8516
0
      (_("%pB: the target (%s) of a %s relocation is "
8517
0
         "in the wrong output section (%s)"),
8518
0
       input_bfd,
8519
0
       sym_name,
8520
0
       howto->name,
8521
0
       name);
8522
0
        }
8523
0
    }
8524
0
    break;
8525
8526
0
  case R_PPC_VLE_LO16A:
8527
0
    relocation = relocation + addend;
8528
0
    r = ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
8529
0
           contents + rel->r_offset, relocation,
8530
0
           split16a_type,
8531
0
           htab->params->vle_reloc_fixup);
8532
0
    goto report_reloc;
8533
8534
0
  case R_PPC_VLE_LO16D:
8535
0
    relocation = relocation + addend;
8536
0
    r = ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
8537
0
           contents + rel->r_offset, relocation,
8538
0
           split16d_type,
8539
0
           htab->params->vle_reloc_fixup);
8540
0
    goto report_reloc;
8541
8542
0
  case R_PPC_VLE_HI16A:
8543
0
    relocation = (relocation + addend) >> 16;
8544
0
    r = ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
8545
0
           contents + rel->r_offset, relocation,
8546
0
           split16a_type,
8547
0
           htab->params->vle_reloc_fixup);
8548
0
    goto report_reloc;
8549
8550
0
  case R_PPC_VLE_HI16D:
8551
0
    relocation = (relocation + addend) >> 16;
8552
0
    r = ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
8553
0
           contents + rel->r_offset, relocation,
8554
0
           split16d_type,
8555
0
           htab->params->vle_reloc_fixup);
8556
0
    goto report_reloc;
8557
8558
0
  case R_PPC_VLE_HA16A:
8559
0
    relocation = (relocation + addend + 0x8000) >> 16;
8560
0
    r = ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
8561
0
           contents + rel->r_offset, relocation,
8562
0
           split16a_type,
8563
0
           htab->params->vle_reloc_fixup);
8564
0
    goto report_reloc;
8565
8566
0
  case R_PPC_VLE_HA16D:
8567
0
    relocation = (relocation + addend + 0x8000) >> 16;
8568
0
    r = ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
8569
0
           contents + rel->r_offset, relocation,
8570
0
           split16d_type,
8571
0
           htab->params->vle_reloc_fixup);
8572
0
    goto report_reloc;
8573
8574
    /* Relocate against either _SDA_BASE_, _SDA2_BASE_, or 0.  */
8575
0
  case R_PPC_EMB_SDA21:
8576
0
  case R_PPC_VLE_SDA21:
8577
0
  case R_PPC_EMB_RELSDA:
8578
0
  case R_PPC_VLE_SDA21_LO:
8579
0
    if (!offset_in_range (input_section, rel->r_offset, 4))
8580
0
      {
8581
0
        r = bfd_reloc_outofrange;
8582
0
        goto report_reloc;
8583
0
      }
8584
0
    else
8585
0
      {
8586
0
        const char *name;
8587
0
        int reg;
8588
0
        unsigned int insn;
8589
0
        struct elf_link_hash_entry *sda = NULL;
8590
8591
0
        if (sec == NULL || sec->output_section == NULL)
8592
0
    {
8593
0
      unresolved_reloc = true;
8594
0
      break;
8595
0
    }
8596
8597
0
        name = bfd_section_name (sec->output_section);
8598
0
        if (strcmp (name, ".sdata") == 0
8599
0
      || strcmp (name, ".sbss") == 0)
8600
0
    {
8601
0
      reg = 13;
8602
0
      sda = htab->sdata[0].sym;
8603
0
    }
8604
0
        else if (strcmp (name, ".sdata2") == 0
8605
0
           || strcmp (name, ".sbss2") == 0)
8606
0
    {
8607
0
      reg = 2;
8608
0
      sda = htab->sdata[1].sym;
8609
0
    }
8610
0
        else if (strcmp (name, ".PPC.EMB.sdata0") == 0
8611
0
           || strcmp (name, ".PPC.EMB.sbss0") == 0)
8612
0
    {
8613
0
      reg = 0;
8614
0
    }
8615
0
        else
8616
0
    {
8617
0
      _bfd_error_handler
8618
        /* xgettext:c-format */
8619
0
        (_("%pB: the target (%s) of a %s relocation is "
8620
0
           "in the wrong output section (%s)"),
8621
0
         input_bfd,
8622
0
         sym_name,
8623
0
         howto->name,
8624
0
         name);
8625
8626
0
      bfd_set_error (bfd_error_bad_value);
8627
0
      ret = false;
8628
0
      goto copy_reloc;
8629
0
    }
8630
8631
0
        if (sda != NULL)
8632
0
    {
8633
0
      if (!is_static_defined (sda))
8634
0
        {
8635
0
          unresolved_reloc = true;
8636
0
          break;
8637
0
        }
8638
0
      addend -= SYM_VAL (sda);
8639
0
    }
8640
8641
0
        if (r_type == R_PPC_EMB_RELSDA)
8642
0
    break;
8643
8644
        /* The PowerPC Embedded Application Binary Interface
8645
     version 1.0 insanely chose to specify R_PPC_EMB_SDA21
8646
     operating on a 24-bit field at r_offset.  GNU as and
8647
     GNU ld have always assumed R_PPC_EMB_SDA21 operates on
8648
     a 32-bit bit insn at r_offset.  Cope with object file
8649
     producers that possibly comply with the EABI in
8650
     generating an odd r_offset for big-endian objects.  */
8651
0
        if (r_type == R_PPC_EMB_SDA21)
8652
0
    rel->r_offset &= ~1;
8653
8654
0
        insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
8655
0
        if (reg == 0
8656
0
      && (r_type == R_PPC_VLE_SDA21
8657
0
          || r_type == R_PPC_VLE_SDA21_LO))
8658
0
    {
8659
0
      relocation = relocation + addend;
8660
0
      addend = 0;
8661
8662
      /* Force e_li insn, keeping RT from original insn.  */
8663
0
      insn &= 0x1f << 21;
8664
0
      insn |= 28u << 26;
8665
8666
      /* We have an li20 field, bits 17..20, 11..15, 21..31.  */
8667
      /* Top 4 bits of value to 17..20.  */
8668
0
      insn |= (relocation & 0xf0000) >> 5;
8669
      /* Next 5 bits of the value to 11..15.  */
8670
0
      insn |= (relocation & 0xf800) << 5;
8671
      /* And the final 11 bits of the value to bits 21 to 31.  */
8672
0
      insn |= relocation & 0x7ff;
8673
8674
0
      bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
8675
8676
0
      r = bfd_reloc_ok;
8677
0
      if (r_type == R_PPC_VLE_SDA21
8678
0
          && ((relocation + 0x80000) & 0xffffffff) > 0x100000)
8679
0
        r = bfd_reloc_overflow;
8680
0
      goto report_reloc;
8681
0
    }
8682
        /* Fill in register field.  */
8683
0
        insn = (insn & ~RA_REGISTER_MASK) | (reg << RA_REGISTER_SHIFT);
8684
0
        bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
8685
0
      }
8686
0
    break;
8687
8688
0
  case R_PPC_VLE_SDAREL_LO16A:
8689
0
  case R_PPC_VLE_SDAREL_LO16D:
8690
0
  case R_PPC_VLE_SDAREL_HI16A:
8691
0
  case R_PPC_VLE_SDAREL_HI16D:
8692
0
  case R_PPC_VLE_SDAREL_HA16A:
8693
0
  case R_PPC_VLE_SDAREL_HA16D:
8694
0
    if (!offset_in_range (input_section, rel->r_offset, 4))
8695
0
      r = bfd_reloc_outofrange;
8696
0
    else
8697
0
      {
8698
0
        bfd_vma value;
8699
0
        const char *name;
8700
0
        struct elf_link_hash_entry *sda = NULL;
8701
8702
0
        if (sec == NULL || sec->output_section == NULL)
8703
0
    {
8704
0
      unresolved_reloc = true;
8705
0
      break;
8706
0
    }
8707
8708
0
        name = bfd_section_name (sec->output_section);
8709
0
        if (strcmp (name, ".sdata") == 0
8710
0
      || strcmp (name, ".sbss") == 0)
8711
0
    sda = htab->sdata[0].sym;
8712
0
        else if (strcmp (name, ".sdata2") == 0
8713
0
           || strcmp (name, ".sbss2") == 0)
8714
0
    sda = htab->sdata[1].sym;
8715
0
        else
8716
0
    {
8717
0
      _bfd_error_handler
8718
        /* xgettext:c-format */
8719
0
        (_("%pB: the target (%s) of a %s relocation is "
8720
0
           "in the wrong output section (%s)"),
8721
0
         input_bfd,
8722
0
         sym_name,
8723
0
         howto->name,
8724
0
         name);
8725
8726
0
      bfd_set_error (bfd_error_bad_value);
8727
0
      ret = false;
8728
0
      goto copy_reloc;
8729
0
    }
8730
8731
0
        if (sda == NULL || !is_static_defined (sda))
8732
0
    {
8733
0
      unresolved_reloc = true;
8734
0
      break;
8735
0
    }
8736
0
        value = relocation + addend - SYM_VAL (sda);
8737
8738
0
        if (r_type == R_PPC_VLE_SDAREL_LO16A)
8739
0
    r = ppc_elf_vle_split16 (input_bfd, input_section,
8740
0
           rel->r_offset,
8741
0
           contents + rel->r_offset, value,
8742
0
           split16a_type,
8743
0
           htab->params->vle_reloc_fixup);
8744
0
        else if (r_type == R_PPC_VLE_SDAREL_LO16D)
8745
0
    r = ppc_elf_vle_split16 (input_bfd, input_section,
8746
0
           rel->r_offset,
8747
0
           contents + rel->r_offset, value,
8748
0
           split16d_type,
8749
0
           htab->params->vle_reloc_fixup);
8750
0
        else if (r_type == R_PPC_VLE_SDAREL_HI16A)
8751
0
    {
8752
0
      value = value >> 16;
8753
0
      r = ppc_elf_vle_split16 (input_bfd, input_section,
8754
0
             rel->r_offset,
8755
0
             contents + rel->r_offset, value,
8756
0
             split16a_type,
8757
0
             htab->params->vle_reloc_fixup);
8758
0
    }
8759
0
        else if (r_type == R_PPC_VLE_SDAREL_HI16D)
8760
0
    {
8761
0
      value = value >> 16;
8762
0
      r = ppc_elf_vle_split16 (input_bfd, input_section,
8763
0
             rel->r_offset,
8764
0
             contents + rel->r_offset, value,
8765
0
             split16d_type,
8766
0
             htab->params->vle_reloc_fixup);
8767
0
    }
8768
0
        else if (r_type == R_PPC_VLE_SDAREL_HA16A)
8769
0
    {
8770
0
      value = (value + 0x8000) >> 16;
8771
0
      r = ppc_elf_vle_split16 (input_bfd, input_section,
8772
0
             rel->r_offset,
8773
0
             contents + rel->r_offset, value,
8774
0
             split16a_type,
8775
0
             htab->params->vle_reloc_fixup);
8776
0
    }
8777
0
        else if (r_type == R_PPC_VLE_SDAREL_HA16D)
8778
0
    {
8779
0
      value = (value + 0x8000) >> 16;
8780
0
      r = ppc_elf_vle_split16 (input_bfd, input_section,
8781
0
             rel->r_offset,
8782
0
             contents + rel->r_offset, value,
8783
0
             split16d_type,
8784
0
             htab->params->vle_reloc_fixup);
8785
0
    }
8786
0
        else
8787
0
    abort ();
8788
0
      }
8789
0
    goto report_reloc;
8790
8791
0
  case R_PPC_VLE_ADDR20:
8792
0
    if (!offset_in_range (input_section, rel->r_offset, 4))
8793
0
      r = bfd_reloc_outofrange;
8794
0
    else
8795
0
      {
8796
0
        ppc_elf_vle_split20 (output_bfd, contents + rel->r_offset,
8797
0
           relocation);
8798
0
        r = bfd_reloc_ok;
8799
0
      }
8800
0
    goto report_reloc;
8801
8802
    /* Relocate against the beginning of the section.  */
8803
0
  case R_PPC_SECTOFF:
8804
0
  case R_PPC_SECTOFF_LO:
8805
0
  case R_PPC_SECTOFF_HI:
8806
0
  case R_PPC_SECTOFF_HA:
8807
0
    if (sec == NULL || sec->output_section == NULL)
8808
0
      {
8809
0
        unresolved_reloc = true;
8810
0
        break;
8811
0
      }
8812
0
    addend -= sec->output_section->vma;
8813
0
    break;
8814
8815
    /* Negative relocations.  */
8816
0
  case R_PPC_EMB_NADDR32:
8817
0
  case R_PPC_EMB_NADDR16:
8818
0
  case R_PPC_EMB_NADDR16_LO:
8819
0
  case R_PPC_EMB_NADDR16_HI:
8820
0
  case R_PPC_EMB_NADDR16_HA:
8821
0
    addend -= 2 * relocation;
8822
0
    break;
8823
8824
0
  case R_PPC_COPY:
8825
0
  case R_PPC_GLOB_DAT:
8826
0
  case R_PPC_JMP_SLOT:
8827
0
  case R_PPC_RELATIVE:
8828
0
  case R_PPC_IRELATIVE:
8829
0
  case R_PPC_PLT32:
8830
0
  case R_PPC_PLTREL32:
8831
0
  case R_PPC_ADDR30:
8832
0
  case R_PPC_EMB_RELSEC16:
8833
0
  case R_PPC_EMB_RELST_LO:
8834
0
  case R_PPC_EMB_RELST_HI:
8835
0
  case R_PPC_EMB_RELST_HA:
8836
0
  case R_PPC_EMB_BIT_FLD:
8837
    /* xgettext:c-format */
8838
0
    _bfd_error_handler (_("%pB: %s unsupported"),
8839
0
            input_bfd, howto->name);
8840
8841
0
    bfd_set_error (bfd_error_invalid_operation);
8842
0
    ret = false;
8843
0
    goto copy_reloc;
8844
0
  }
8845
8846
0
      switch (r_type)
8847
0
  {
8848
0
  default:
8849
0
    break;
8850
8851
0
  case R_PPC_TPREL16_HA:
8852
0
    if (htab->do_tls_opt
8853
0
        && relocation + addend + 0x8000 < 0x10000
8854
0
        && offset_in_range (input_section, rel->r_offset & ~3, 4))
8855
8856
0
      {
8857
0
        bfd_byte *p = contents + (rel->r_offset & ~3);
8858
0
        bfd_put_32 (input_bfd, NOP, p);
8859
0
      }
8860
0
    break;
8861
8862
0
  case R_PPC_TPREL16_LO:
8863
0
    if (htab->do_tls_opt
8864
0
        && relocation + addend + 0x8000 < 0x10000
8865
0
        && offset_in_range (input_section, rel->r_offset & ~3, 4))
8866
0
      {
8867
0
        bfd_byte *p = contents + (rel->r_offset & ~3);
8868
0
        unsigned int insn = bfd_get_32 (input_bfd, p);
8869
0
        insn &= ~(0x1f << 16);
8870
0
        insn |= 2 << 16;
8871
0
        bfd_put_32 (input_bfd, insn, p);
8872
0
      }
8873
0
    break;
8874
0
  }
8875
8876
0
      switch (r_type)
8877
0
  {
8878
0
  default:
8879
0
    break;
8880
8881
0
  case R_PPC_PLTCALL:
8882
0
    if (unresolved_reloc)
8883
0
      {
8884
0
        if (offset_in_range (input_section, rel->r_offset, 4))
8885
0
    {
8886
0
      bfd_byte *p = contents + rel->r_offset;
8887
0
      unsigned int insn = bfd_get_32 (input_bfd, p);
8888
0
      insn &= 1;
8889
0
      bfd_put_32 (input_bfd, B | insn, p);
8890
0
      unresolved_reloc = save_unresolved_reloc;
8891
0
      r_type = R_PPC_REL24;
8892
0
      howto = ppc_elf_howto_table[r_type];
8893
0
    }
8894
0
      }
8895
0
    else if (htab->plt_type != PLT_NEW)
8896
0
      info->callbacks->einfo
8897
0
        (_("%X%P: %H: %s relocation unsupported for bss-plt\n"),
8898
0
         input_bfd, input_section, rel->r_offset,
8899
0
         howto->name);
8900
0
    break;
8901
8902
0
  case R_PPC_PLTSEQ:
8903
0
  case R_PPC_PLT16_HA:
8904
0
  case R_PPC_PLT16_LO:
8905
0
    if (unresolved_reloc)
8906
0
      {
8907
0
        if (offset_in_range (input_section, rel->r_offset & ~3, 4))
8908
0
    {
8909
0
      bfd_byte *p = contents + (rel->r_offset & ~3);
8910
0
      bfd_put_32 (input_bfd, NOP, p);
8911
0
      unresolved_reloc = false;
8912
0
      r_type = R_PPC_NONE;
8913
0
      howto = ppc_elf_howto_table[r_type];
8914
0
    }
8915
0
      }
8916
0
    else if (htab->plt_type != PLT_NEW)
8917
0
      info->callbacks->einfo
8918
0
        (_("%X%P: %H: %s relocation unsupported for bss-plt\n"),
8919
0
         input_bfd, input_section, rel->r_offset,
8920
0
         howto->name);
8921
0
    break;
8922
0
  }
8923
8924
      /* Do any further special processing.  */
8925
0
      switch (r_type)
8926
0
  {
8927
0
  default:
8928
0
    break;
8929
8930
0
  case R_PPC_ADDR16_HA:
8931
0
  case R_PPC_REL16_HA:
8932
0
  case R_PPC_REL16DX_HA:
8933
0
  case R_PPC_SECTOFF_HA:
8934
0
  case R_PPC_TPREL16_HA:
8935
0
  case R_PPC_DTPREL16_HA:
8936
0
  case R_PPC_EMB_NADDR16_HA:
8937
0
  case R_PPC_EMB_RELST_HA:
8938
    /* It's just possible that this symbol is a weak symbol
8939
       that's not actually defined anywhere.  In that case,
8940
       'sec' would be NULL, and we should leave the symbol
8941
       alone (it will be set to zero elsewhere in the link).  */
8942
0
    if (sec == NULL)
8943
0
      break;
8944
    /* Fall through.  */
8945
8946
0
  case R_PPC_PLT16_HA:
8947
0
  case R_PPC_GOT16_HA:
8948
0
  case R_PPC_GOT_TLSGD16_HA:
8949
0
  case R_PPC_GOT_TLSLD16_HA:
8950
0
  case R_PPC_GOT_TPREL16_HA:
8951
0
  case R_PPC_GOT_DTPREL16_HA:
8952
    /* Add 0x10000 if sign bit in 0:15 is set.
8953
       Bits 0:15 are not used.  */
8954
0
    addend += 0x8000;
8955
0
    break;
8956
8957
0
  case R_PPC_ADDR16:
8958
0
  case R_PPC_ADDR16_LO:
8959
0
  case R_PPC_GOT16:
8960
0
  case R_PPC_GOT16_LO:
8961
0
  case R_PPC_SDAREL16:
8962
0
  case R_PPC_SECTOFF:
8963
0
  case R_PPC_SECTOFF_LO:
8964
0
  case R_PPC_DTPREL16:
8965
0
  case R_PPC_DTPREL16_LO:
8966
0
  case R_PPC_TPREL16:
8967
0
  case R_PPC_TPREL16_LO:
8968
0
  case R_PPC_GOT_TLSGD16:
8969
0
  case R_PPC_GOT_TLSGD16_LO:
8970
0
  case R_PPC_GOT_TLSLD16:
8971
0
  case R_PPC_GOT_TLSLD16_LO:
8972
0
  case R_PPC_GOT_DTPREL16:
8973
0
  case R_PPC_GOT_DTPREL16_LO:
8974
0
  case R_PPC_GOT_TPREL16:
8975
0
  case R_PPC_GOT_TPREL16_LO:
8976
0
    if (offset_in_range (input_section, rel->r_offset - d_offset, 4))
8977
0
      {
8978
        /* The 32-bit ABI lacks proper relocations to deal with
8979
     certain 64-bit instructions.  Prevent damage to bits
8980
     that make up part of the insn opcode.  */
8981
0
        unsigned int insn, mask, lobit;
8982
8983
0
        insn = bfd_get_32 (input_bfd,
8984
0
         contents + rel->r_offset - d_offset);
8985
0
        mask = 0;
8986
0
        if (is_insn_ds_form (insn))
8987
0
    mask = 3;
8988
0
        else if (is_insn_dq_form (insn))
8989
0
    mask = 15;
8990
0
        else
8991
0
    break;
8992
0
        relocation += addend;
8993
0
        addend = insn & mask;
8994
0
        lobit = mask & relocation;
8995
0
        if (lobit != 0)
8996
0
    {
8997
0
      relocation ^= lobit;
8998
0
      info->callbacks->einfo
8999
        /* xgettext:c-format */
9000
0
        (_("%H: error: %s against `%s' not a multiple of %u\n"),
9001
0
         input_bfd, input_section, rel->r_offset,
9002
0
         howto->name, sym_name, mask + 1);
9003
0
      bfd_set_error (bfd_error_bad_value);
9004
0
      ret = false;
9005
0
    }
9006
0
      }
9007
0
    break;
9008
0
  }
9009
9010
#ifdef DEBUG
9011
      fprintf (stderr, "\ttype = %s (%d), name = %s, symbol index = %ld, "
9012
         "offset = %ld, addend = %ld\n",
9013
         howto->name,
9014
         (int) r_type,
9015
         sym_name,
9016
         r_symndx,
9017
         (long) rel->r_offset,
9018
         (long) addend);
9019
#endif
9020
9021
0
      if (unresolved_reloc
9022
0
    && !((input_section->flags & SEC_DEBUGGING) != 0
9023
0
         && h->def_dynamic)
9024
0
    && _bfd_elf_section_offset (output_bfd, info, input_section,
9025
0
              rel->r_offset) != (bfd_vma) -1)
9026
0
  {
9027
0
    info->callbacks->einfo
9028
      /* xgettext:c-format */
9029
0
      (_("%H: unresolvable %s relocation against symbol `%s'\n"),
9030
0
       input_bfd, input_section, rel->r_offset,
9031
0
       howto->name,
9032
0
       sym_name);
9033
0
    ret = false;
9034
0
  }
9035
9036
      /* 16-bit fields in insns mostly have signed values, but a
9037
   few insns have 16-bit unsigned values.  Really, we should
9038
   have different reloc types.  */
9039
0
      if (howto->complain_on_overflow != complain_overflow_dont
9040
0
    && howto->dst_mask == 0xffff
9041
0
    && (input_section->flags & SEC_CODE) != 0
9042
0
    && offset_in_range (input_section, rel->r_offset & ~3, 4))
9043
0
  {
9044
0
    enum complain_overflow complain = complain_overflow_signed;
9045
9046
0
    if ((elf_section_flags (input_section) & SHF_PPC_VLE) == 0)
9047
0
      {
9048
0
        unsigned int insn;
9049
9050
0
        insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
9051
0
        if ((insn & (0x3fu << 26)) == 10u << 26 /* cmpli */)
9052
0
    complain = complain_overflow_bitfield;
9053
0
        else if ((insn & (0x3fu << 26)) == 28u << 26 /* andi */
9054
0
           || (insn & (0x3fu << 26)) == 24u << 26 /* ori */
9055
0
           || (insn & (0x3fu << 26)) == 26u << 26 /* xori */)
9056
0
    complain = complain_overflow_unsigned;
9057
0
      }
9058
0
    if (howto->complain_on_overflow != complain)
9059
0
      {
9060
0
        alt_howto = *howto;
9061
0
        alt_howto.complain_on_overflow = complain;
9062
0
        howto = &alt_howto;
9063
0
      }
9064
0
  }
9065
9066
0
      if (r_type == R_PPC_REL16DX_HA)
9067
0
  {
9068
    /* Split field reloc isn't handled by _bfd_final_link_relocate.  */
9069
0
    if (offset_in_range (input_section, rel->r_offset, 4))
9070
0
      r = bfd_reloc_outofrange;
9071
0
    else
9072
0
      {
9073
0
        unsigned int insn;
9074
9075
0
        relocation += addend;
9076
0
        relocation -= (rel->r_offset
9077
0
           + input_section->output_offset
9078
0
           + input_section->output_section->vma);
9079
0
        relocation >>= 16;
9080
0
        insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
9081
0
        insn &= ~0x1fffc1;
9082
0
        insn |= (relocation & 0xffc1) | ((relocation & 0x3e) << 15);
9083
0
        bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
9084
0
        r = bfd_reloc_ok;
9085
0
      }
9086
0
  }
9087
0
      else
9088
0
  r = _bfd_final_link_relocate (howto, input_bfd, input_section, contents,
9089
0
              rel->r_offset, relocation, addend);
9090
9091
0
    report_reloc:
9092
0
      if (r != bfd_reloc_ok)
9093
0
  {
9094
0
    if (r == bfd_reloc_overflow)
9095
0
      {
9096
        /* On code like "if (foo) foo();" don't report overflow
9097
     on a branch to zero when foo is undefined.  */
9098
0
        if (!warned
9099
0
      && !(h != NULL
9100
0
           && (h->root.type == bfd_link_hash_undefweak
9101
0
         || h->root.type == bfd_link_hash_undefined)
9102
0
           && is_branch_reloc (r_type)))
9103
0
    info->callbacks->reloc_overflow
9104
0
      (info, (h ? &h->root : NULL), sym_name, howto->name,
9105
0
       rel->r_addend, input_bfd, input_section, rel->r_offset);
9106
0
      }
9107
0
    else
9108
0
      {
9109
0
        info->callbacks->einfo
9110
    /* xgettext:c-format */
9111
0
    (_("%H: %s reloc against `%s': error %d\n"),
9112
0
     input_bfd, input_section, rel->r_offset,
9113
0
     howto->name, sym_name, (int) r);
9114
0
        ret = false;
9115
0
      }
9116
0
  }
9117
0
    copy_reloc:
9118
0
      if (wrel != rel)
9119
0
  *wrel = *rel;
9120
0
    }
9121
9122
0
  if (wrel != rel)
9123
0
    {
9124
0
      Elf_Internal_Shdr *rel_hdr;
9125
0
      size_t deleted = rel - wrel;
9126
9127
0
      rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
9128
0
      rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
9129
0
      relend = wrel;
9130
0
      rel_hdr = _bfd_elf_single_rel_hdr (input_section);
9131
0
      rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
9132
0
      input_section->reloc_count -= deleted;
9133
0
    }
9134
9135
#ifdef DEBUG
9136
  fprintf (stderr, "\n");
9137
#endif
9138
9139
0
  if (input_section->sec_info_type == SEC_INFO_TYPE_TARGET
9140
0
      && input_section->size != input_section->rawsize
9141
0
      && (strcmp (input_section->output_section->name, ".init") == 0
9142
0
    || strcmp (input_section->output_section->name, ".fini") == 0))
9143
0
    {
9144
      /* Branch around the trampolines.  */
9145
0
      unsigned int insn = B + input_section->size - input_section->rawsize;
9146
0
      bfd_put_32 (input_bfd, insn, contents + input_section->rawsize);
9147
0
    }
9148
9149
0
  if (htab->params->ppc476_workaround
9150
0
      && input_section->sec_info_type == SEC_INFO_TYPE_TARGET
9151
0
      && (!bfd_link_relocatable (info)
9152
0
    || (input_section->output_section->alignment_power
9153
0
        >= htab->params->pagesize_p2)))
9154
0
    {
9155
0
      bfd_vma start_addr, end_addr, addr;
9156
0
      bfd_vma pagesize = (bfd_vma) 1 << htab->params->pagesize_p2;
9157
9158
0
      if (relax_info->workaround_size != 0)
9159
0
  {
9160
0
    bfd_byte *p;
9161
0
    unsigned int n;
9162
0
    bfd_byte fill[4];
9163
9164
0
    bfd_put_32 (input_bfd, BA, fill);
9165
0
    p = contents + input_section->size - relax_info->workaround_size;
9166
0
    n = relax_info->workaround_size >> 2;
9167
0
    while (n--)
9168
0
      {
9169
0
        memcpy (p, fill, 4);
9170
0
        p += 4;
9171
0
      }
9172
0
  }
9173
9174
      /* The idea is: Replace the last instruction on a page with a
9175
   branch to a patch area.  Put the insn there followed by a
9176
   branch back to the next page.  Complicated a little by
9177
   needing to handle moved conditional branches, and by not
9178
   wanting to touch data-in-text.  */
9179
9180
0
      start_addr = (input_section->output_section->vma
9181
0
        + input_section->output_offset);
9182
0
      end_addr = (start_addr + input_section->size
9183
0
      - relax_info->workaround_size);
9184
0
      for (addr = ((start_addr & -pagesize) + pagesize - 4);
9185
0
     addr < end_addr;
9186
0
     addr += pagesize)
9187
0
  {
9188
0
    bfd_vma offset = addr - start_addr;
9189
0
    Elf_Internal_Rela *lo, *hi;
9190
0
    bool is_data;
9191
0
    bfd_vma patch_off, patch_addr;
9192
0
    unsigned int insn;
9193
9194
    /* Do we have a data reloc at this offset?  If so, leave
9195
       the word alone.  */
9196
0
    is_data = false;
9197
0
    lo = relocs;
9198
0
    hi = relend;
9199
0
    rel = NULL;
9200
0
    while (lo < hi)
9201
0
      {
9202
0
        rel = lo + (hi - lo) / 2;
9203
0
        if (rel->r_offset < offset)
9204
0
    lo = rel + 1;
9205
0
        else if (rel->r_offset > offset + 3)
9206
0
    hi = rel;
9207
0
        else
9208
0
    {
9209
0
      switch (ELF32_R_TYPE (rel->r_info))
9210
0
        {
9211
0
        case R_PPC_ADDR32:
9212
0
        case R_PPC_UADDR32:
9213
0
        case R_PPC_REL32:
9214
0
        case R_PPC_ADDR30:
9215
0
          is_data = true;
9216
0
          break;
9217
0
        default:
9218
0
          break;
9219
0
        }
9220
0
      break;
9221
0
    }
9222
0
      }
9223
0
    if (is_data)
9224
0
      continue;
9225
9226
    /* Some instructions can be left alone too.  Unconditional
9227
       branches, except for bcctr with BO=0x14 (bctr, bctrl),
9228
       avoid the icache failure.
9229
9230
       The problem occurs due to prefetch across a page boundary
9231
       where stale instructions can be fetched from the next
9232
       page, and the mechanism for flushing these bad
9233
       instructions fails under certain circumstances.  The
9234
       unconditional branches:
9235
       1) Branch: b, bl, ba, bla,
9236
       2) Branch Conditional: bc, bca, bcl, bcla,
9237
       3) Branch Conditional to Link Register: bclr, bclrl,
9238
       where (2) and (3) have BO=0x14 making them unconditional,
9239
       prevent the bad prefetch because the prefetch itself is
9240
       affected by these instructions.  This happens even if the
9241
       instruction is not executed.
9242
9243
       A bctr example:
9244
       .
9245
       .  lis 9,new_page@ha
9246
       .  addi 9,9,new_page@l
9247
       .  mtctr 9
9248
       .  bctr
9249
       .  nop
9250
       .  nop
9251
       . new_page:
9252
       .
9253
       The bctr is not predicted taken due to ctr not being
9254
       ready, so prefetch continues on past the bctr into the
9255
       new page which might have stale instructions.  If they
9256
       fail to be flushed, then they will be executed after the
9257
       bctr executes.  Either of the following modifications
9258
       prevent the bad prefetch from happening in the first
9259
       place:
9260
       .
9261
       .  lis 9,new_page@ha  lis 9,new_page@ha
9262
       .  addi 9,9,new_page@l  addi 9,9,new_page@l
9263
       .  mtctr 9      mtctr 9
9264
       .  bctr       bctr
9265
       .  nop      b somewhere_else
9266
       .  b somewhere_else   nop
9267
       . new_page:    new_page:
9268
       .  */
9269
0
    insn = bfd_get_32 (input_bfd, contents + offset);
9270
0
    if ((insn & (0x3fu << 26)) == (18u << 26)      /* b,bl,ba,bla */
9271
0
        || ((insn & (0x3fu << 26)) == (16u << 26)      /* bc,bcl,bca,bcla*/
9272
0
      && (insn & (0x14 << 21)) == (0x14 << 21)) /*   with BO=0x14 */
9273
0
        || ((insn & (0x3fu << 26)) == (19u << 26)
9274
0
      && (insn & (0x3ff << 1)) == (16u << 1)    /* bclr,bclrl */
9275
0
      && (insn & (0x14 << 21)) == (0x14 << 21)))/*   with BO=0x14 */
9276
0
      continue;
9277
9278
0
    patch_addr = (start_addr + input_section->size
9279
0
      - relax_info->workaround_size);
9280
0
    patch_addr = (patch_addr + 15) & -16;
9281
0
    patch_off = patch_addr - start_addr;
9282
0
    bfd_put_32 (input_bfd, B + patch_off - offset, contents + offset);
9283
9284
0
    if (rel != NULL
9285
0
        && rel->r_offset >= offset
9286
0
        && rel->r_offset < offset + 4)
9287
0
      {
9288
0
        asection *sreloc;
9289
9290
        /* If the insn we are patching had a reloc, adjust the
9291
     reloc r_offset so that the reloc applies to the moved
9292
     location.  This matters for -r and --emit-relocs.  */
9293
0
        if (rel + 1 != relend)
9294
0
    {
9295
0
      Elf_Internal_Rela tmp = *rel;
9296
9297
      /* Keep the relocs sorted by r_offset.  */
9298
0
      memmove (rel, rel + 1, (relend - (rel + 1)) * sizeof (*rel));
9299
0
      relend[-1] = tmp;
9300
0
    }
9301
0
        relend[-1].r_offset += patch_off - offset;
9302
9303
        /* Adjust REL16 addends too.  */
9304
0
        switch (ELF32_R_TYPE (relend[-1].r_info))
9305
0
    {
9306
0
    case R_PPC_REL16:
9307
0
    case R_PPC_REL16_LO:
9308
0
    case R_PPC_REL16_HI:
9309
0
    case R_PPC_REL16_HA:
9310
0
      relend[-1].r_addend += patch_off - offset;
9311
0
      break;
9312
0
    default:
9313
0
      break;
9314
0
    }
9315
9316
        /* If we are building a PIE or shared library with
9317
     non-PIC objects, perhaps we had a dynamic reloc too?
9318
     If so, the dynamic reloc must move with the insn.  */
9319
0
        sreloc = elf_section_data (input_section)->sreloc;
9320
0
        if (sreloc != NULL)
9321
0
    {
9322
0
      Elf32_External_Rela *slo, *shi, *srelend;
9323
0
      bfd_vma soffset;
9324
9325
0
      slo = (Elf32_External_Rela *) sreloc->contents;
9326
0
      shi = srelend = slo + sreloc->reloc_count;
9327
0
      soffset = (offset + input_section->output_section->vma
9328
0
           + input_section->output_offset);
9329
0
      while (slo < shi)
9330
0
        {
9331
0
          Elf32_External_Rela *srel = slo + (shi - slo) / 2;
9332
0
          bfd_elf32_swap_reloca_in (output_bfd, (bfd_byte *) srel,
9333
0
            &outrel);
9334
0
          if (outrel.r_offset < soffset)
9335
0
      slo = srel + 1;
9336
0
          else if (outrel.r_offset > soffset + 3)
9337
0
      shi = srel;
9338
0
          else
9339
0
      {
9340
0
        if (srel + 1 != srelend)
9341
0
          {
9342
0
            memmove (srel, srel + 1,
9343
0
               (srelend - (srel + 1)) * sizeof (*srel));
9344
0
            srel = srelend - 1;
9345
0
          }
9346
0
        outrel.r_offset += patch_off - offset;
9347
0
        bfd_elf32_swap_reloca_out (output_bfd, &outrel,
9348
0
                 (bfd_byte *) srel);
9349
0
        break;
9350
0
      }
9351
0
        }
9352
0
    }
9353
0
      }
9354
0
    else
9355
0
      rel = NULL;
9356
9357
0
    if ((insn & (0x3fu << 26)) == (16u << 26) /* bc */
9358
0
        && (insn & 2) == 0 /* relative */)
9359
0
      {
9360
0
        bfd_vma delta = ((insn & 0xfffc) ^ 0x8000) - 0x8000;
9361
9362
0
        delta += offset - patch_off;
9363
0
        if (bfd_link_relocatable (info) && rel != NULL)
9364
0
    delta = 0;
9365
0
        if (!bfd_link_relocatable (info) && rel != NULL)
9366
0
    {
9367
0
      enum elf_ppc_reloc_type r_type;
9368
9369
0
      r_type = ELF32_R_TYPE (relend[-1].r_info);
9370
0
      if (r_type == R_PPC_REL14_BRTAKEN)
9371
0
        insn |= BRANCH_PREDICT_BIT;
9372
0
      else if (r_type == R_PPC_REL14_BRNTAKEN)
9373
0
        insn &= ~BRANCH_PREDICT_BIT;
9374
0
      else
9375
0
        BFD_ASSERT (r_type == R_PPC_REL14);
9376
9377
0
      if ((r_type == R_PPC_REL14_BRTAKEN
9378
0
           || r_type == R_PPC_REL14_BRNTAKEN)
9379
0
          && delta + 0x8000 < 0x10000
9380
0
          && (bfd_signed_vma) delta < 0)
9381
0
        insn ^= BRANCH_PREDICT_BIT;
9382
0
    }
9383
0
        if (delta + 0x8000 < 0x10000)
9384
0
    {
9385
0
      bfd_put_32 (input_bfd,
9386
0
            (insn & ~0xfffc) | (delta & 0xfffc),
9387
0
            contents + patch_off);
9388
0
      patch_off += 4;
9389
0
      bfd_put_32 (input_bfd,
9390
0
            B | ((offset + 4 - patch_off) & 0x3fffffc),
9391
0
            contents + patch_off);
9392
0
      patch_off += 4;
9393
0
    }
9394
0
        else
9395
0
    {
9396
0
      if (rel != NULL)
9397
0
        {
9398
0
          unsigned int r_sym = ELF32_R_SYM (relend[-1].r_info);
9399
9400
0
          relend[-1].r_offset += 8;
9401
0
          relend[-1].r_info = ELF32_R_INFO (r_sym, R_PPC_REL24);
9402
0
        }
9403
0
      bfd_put_32 (input_bfd,
9404
0
            (insn & ~0xfffc) | 8,
9405
0
            contents + patch_off);
9406
0
      patch_off += 4;
9407
0
      bfd_put_32 (input_bfd,
9408
0
            B | ((offset + 4 - patch_off) & 0x3fffffc),
9409
0
            contents + patch_off);
9410
0
      patch_off += 4;
9411
0
      bfd_put_32 (input_bfd,
9412
0
            B | ((delta - 8) & 0x3fffffc),
9413
0
            contents + patch_off);
9414
0
      patch_off += 4;
9415
0
    }
9416
0
      }
9417
0
    else
9418
0
      {
9419
0
        bfd_put_32 (input_bfd, insn, contents + patch_off);
9420
0
        patch_off += 4;
9421
0
        bfd_put_32 (input_bfd,
9422
0
        B | ((offset + 4 - patch_off) & 0x3fffffc),
9423
0
        contents + patch_off);
9424
0
        patch_off += 4;
9425
0
      }
9426
0
    BFD_ASSERT (patch_off <= input_section->size);
9427
0
    relax_info->workaround_size = input_section->size - patch_off;
9428
0
  }
9429
0
    }
9430
9431
0
  return ret;
9432
0
}
9433

9434
/* Write out the PLT relocs and entries for H.  */
9435
9436
static bool
9437
write_global_sym_plt (struct elf_link_hash_entry *h, void *inf)
9438
0
{
9439
0
  struct bfd_link_info *info = (struct bfd_link_info *) inf;
9440
0
  struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
9441
0
  struct plt_entry *ent;
9442
0
  bool doneone;
9443
9444
0
  doneone = false;
9445
0
  for (ent = h->plt.plist; ent != NULL; ent = ent->next)
9446
0
    if (ent->plt.offset != (bfd_vma) -1)
9447
0
      {
9448
0
  bool dyn = !use_local_plt (info, h);
9449
9450
0
  if (!doneone)
9451
0
    {
9452
0
      Elf_Internal_Rela rela;
9453
0
      bfd_byte *loc;
9454
0
      bfd_vma reloc_index;
9455
0
      asection *plt = htab->elf.splt;
9456
0
      asection *relplt = htab->elf.srelplt;
9457
9458
0
      if (htab->plt_type == PLT_NEW || !dyn)
9459
0
        reloc_index = ent->plt.offset / 4;
9460
0
      else
9461
0
        {
9462
0
    reloc_index = ((ent->plt.offset - htab->plt_initial_entry_size)
9463
0
             / htab->plt_slot_size);
9464
0
    if (reloc_index > PLT_NUM_SINGLE_ENTRIES
9465
0
        && htab->plt_type == PLT_OLD)
9466
0
      reloc_index -= (reloc_index - PLT_NUM_SINGLE_ENTRIES) / 2;
9467
0
        }
9468
9469
      /* This symbol has an entry in the procedure linkage table.
9470
         Set it up.  */
9471
0
      if (htab->plt_type == PLT_VXWORKS && dyn)
9472
0
        {
9473
0
    bfd_vma got_offset;
9474
0
    const bfd_vma *plt_entry;
9475
9476
    /* The first three entries in .got.plt are reserved.  */
9477
0
    got_offset = (reloc_index + 3) * 4;
9478
9479
    /* Use the right PLT. */
9480
0
    plt_entry = bfd_link_pic (info) ? ppc_elf_vxworks_pic_plt_entry
9481
0
          : ppc_elf_vxworks_plt_entry;
9482
9483
    /* Fill in the .plt on VxWorks.  */
9484
0
    if (bfd_link_pic (info))
9485
0
      {
9486
0
        bfd_put_32 (info->output_bfd,
9487
0
        plt_entry[0] | PPC_HA (got_offset),
9488
0
        plt->contents + ent->plt.offset + 0);
9489
0
        bfd_put_32 (info->output_bfd,
9490
0
        plt_entry[1] | PPC_LO (got_offset),
9491
0
        plt->contents + ent->plt.offset + 4);
9492
0
      }
9493
0
    else
9494
0
      {
9495
0
        bfd_vma got_loc = got_offset + SYM_VAL (htab->elf.hgot);
9496
9497
0
        bfd_put_32 (info->output_bfd,
9498
0
        plt_entry[0] | PPC_HA (got_loc),
9499
0
        plt->contents + ent->plt.offset + 0);
9500
0
        bfd_put_32 (info->output_bfd,
9501
0
        plt_entry[1] | PPC_LO (got_loc),
9502
0
        plt->contents + ent->plt.offset + 4);
9503
0
      }
9504
9505
0
    bfd_put_32 (info->output_bfd, plt_entry[2],
9506
0
          plt->contents + ent->plt.offset + 8);
9507
0
    bfd_put_32 (info->output_bfd, plt_entry[3],
9508
0
          plt->contents + ent->plt.offset + 12);
9509
9510
    /* This instruction is an immediate load.  The value loaded is
9511
       the byte offset of the R_PPC_JMP_SLOT relocation from the
9512
       start of the .rela.plt section.  The value is stored in the
9513
       low-order 16 bits of the load instruction.  */
9514
    /* NOTE: It appears that this is now an index rather than a
9515
       prescaled offset.  */
9516
0
    bfd_put_32 (info->output_bfd,
9517
0
          plt_entry[4] | reloc_index,
9518
0
          plt->contents + ent->plt.offset + 16);
9519
    /* This instruction is a PC-relative branch whose target is
9520
       the start of the PLT section.  The address of this branch
9521
       instruction is 20 bytes beyond the start of this PLT entry.
9522
       The address is encoded in bits 6-29, inclusive.  The value
9523
       stored is right-shifted by two bits, permitting a 26-bit
9524
       offset.  */
9525
0
    bfd_put_32 (info->output_bfd,
9526
0
          (plt_entry[5]
9527
0
           | (-(ent->plt.offset + 20) & 0x03fffffc)),
9528
0
          plt->contents + ent->plt.offset + 20);
9529
0
    bfd_put_32 (info->output_bfd, plt_entry[6],
9530
0
          plt->contents + ent->plt.offset + 24);
9531
0
    bfd_put_32 (info->output_bfd, plt_entry[7],
9532
0
          plt->contents + ent->plt.offset + 28);
9533
9534
    /* Fill in the GOT entry corresponding to this PLT slot with
9535
       the address immediately after the "bctr" instruction
9536
       in this PLT entry.  */
9537
0
    bfd_put_32 (info->output_bfd, (plt->output_section->vma
9538
0
                 + plt->output_offset
9539
0
                 + ent->plt.offset + 16),
9540
0
          htab->elf.sgotplt->contents + got_offset);
9541
9542
0
    if (!bfd_link_pic (info))
9543
0
      {
9544
        /* Fill in a couple of entries in .rela.plt.unloaded.  */
9545
0
        loc = htab->srelplt2->contents
9546
0
          + ((VXWORKS_PLTRESOLVE_RELOCS + reloc_index
9547
0
        * VXWORKS_PLT_NON_JMP_SLOT_RELOCS)
9548
0
       * sizeof (Elf32_External_Rela));
9549
9550
        /* Provide the @ha relocation for the first instruction.  */
9551
0
        rela.r_offset = (plt->output_section->vma
9552
0
             + plt->output_offset
9553
0
             + ent->plt.offset + 2);
9554
0
        rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
9555
0
            R_PPC_ADDR16_HA);
9556
0
        rela.r_addend = got_offset;
9557
0
        BFD_ASSERT (swap_reloc_out (info->output_bfd, &rela, loc,
9558
0
            htab->srelplt2));
9559
0
        loc += sizeof (Elf32_External_Rela);
9560
9561
        /* Provide the @l relocation for the second instruction.  */
9562
0
        rela.r_offset = (plt->output_section->vma
9563
0
             + plt->output_offset
9564
0
             + ent->plt.offset + 6);
9565
0
        rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
9566
0
            R_PPC_ADDR16_LO);
9567
0
        rela.r_addend = got_offset;
9568
0
        BFD_ASSERT (swap_reloc_out (info->output_bfd, &rela, loc,
9569
0
            htab->srelplt2));
9570
0
        loc += sizeof (Elf32_External_Rela);
9571
9572
        /* Provide a relocation for the GOT entry corresponding to this
9573
           PLT slot.  Point it at the middle of the .plt entry.  */
9574
0
        rela.r_offset = (htab->elf.sgotplt->output_section->vma
9575
0
             + htab->elf.sgotplt->output_offset
9576
0
             + got_offset);
9577
0
        rela.r_info = ELF32_R_INFO (htab->elf.hplt->indx,
9578
0
            R_PPC_ADDR32);
9579
0
        rela.r_addend = ent->plt.offset + 16;
9580
0
        BFD_ASSERT (swap_reloc_out (info->output_bfd, &rela, loc,
9581
0
            htab->srelplt2));
9582
0
      }
9583
9584
    /* VxWorks uses non-standard semantics for R_PPC_JMP_SLOT.
9585
       In particular, the offset for the relocation is not the
9586
       address of the PLT entry for this function, as specified
9587
       by the ABI.  Instead, the offset is set to the address of
9588
       the GOT slot for this function.  See EABI 4.4.4.1.  */
9589
0
    rela.r_offset = (htab->elf.sgotplt->output_section->vma
9590
0
         + htab->elf.sgotplt->output_offset
9591
0
         + got_offset);
9592
0
    rela.r_addend = 0;
9593
0
        }
9594
0
      else
9595
0
        {
9596
0
    rela.r_addend = 0;
9597
0
    if (!dyn)
9598
0
      {
9599
0
        if (h->type == STT_GNU_IFUNC)
9600
0
          {
9601
0
      plt = htab->elf.iplt;
9602
0
      relplt = htab->elf.irelplt;
9603
0
          }
9604
0
        else
9605
0
          {
9606
0
      plt = htab->pltlocal;
9607
0
      relplt = bfd_link_pic (info) ? htab->relpltlocal : NULL;
9608
0
          }
9609
0
        if (h->def_regular
9610
0
      && (h->root.type == bfd_link_hash_defined
9611
0
          || h->root.type == bfd_link_hash_defweak))
9612
0
          rela.r_addend = SYM_VAL (h);
9613
0
      }
9614
9615
0
    if (relplt == NULL)
9616
0
      {
9617
0
        loc = plt->contents + ent->plt.offset;
9618
0
        bfd_put_32 (info->output_bfd, rela.r_addend, loc);
9619
0
      }
9620
0
    else
9621
0
      {
9622
0
        rela.r_offset = (plt->output_section->vma
9623
0
             + plt->output_offset
9624
0
             + ent->plt.offset);
9625
9626
0
        if (htab->plt_type == PLT_OLD || !dyn)
9627
0
          {
9628
      /* We don't need to fill in the .plt.  The ppc dynamic
9629
         linker will fill it in.  */
9630
0
          }
9631
0
        else
9632
0
          {
9633
0
      bfd_vma val = (htab->glink_pltresolve + ent->plt.offset
9634
0
               + htab->glink->output_section->vma
9635
0
               + htab->glink->output_offset);
9636
0
      bfd_put_32 (info->output_bfd, val,
9637
0
            plt->contents + ent->plt.offset);
9638
0
          }
9639
0
      }
9640
0
        }
9641
9642
0
      if (relplt != NULL)
9643
0
        {
9644
    /* Fill in the entry in the .rela.plt section.  */
9645
0
    if (!dyn)
9646
0
      {
9647
0
        if (h->type == STT_GNU_IFUNC)
9648
0
          rela.r_info = ELF32_R_INFO (0, R_PPC_IRELATIVE);
9649
0
        else
9650
0
          rela.r_info = ELF32_R_INFO (0, R_PPC_RELATIVE);
9651
0
        loc = relplt->contents + (relplt->reloc_count++
9652
0
                * sizeof (Elf32_External_Rela));
9653
0
        htab->local_ifunc_resolver = 1;
9654
0
      }
9655
0
    else
9656
0
      {
9657
0
        rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_JMP_SLOT);
9658
0
        loc = relplt->contents + (reloc_index
9659
0
                * sizeof (Elf32_External_Rela));
9660
0
        if (h->type == STT_GNU_IFUNC && is_static_defined (h))
9661
0
          htab->maybe_local_ifunc_resolver = 1;
9662
0
      }
9663
0
    BFD_ASSERT (swap_reloc_out (info->output_bfd, &rela,
9664
0
              loc, relplt));
9665
0
        }
9666
0
      doneone = true;
9667
0
    }
9668
9669
0
  if (htab->plt_type == PLT_NEW || !dyn)
9670
0
    {
9671
0
      unsigned char *p;
9672
0
      asection *plt = htab->elf.splt;
9673
9674
0
      if (!dyn)
9675
0
        {
9676
0
    if (h->type == STT_GNU_IFUNC)
9677
0
      plt = htab->elf.iplt;
9678
0
    else
9679
0
      break;
9680
0
        }
9681
9682
0
      p = (unsigned char *) htab->glink->contents + ent->glink_offset;
9683
0
      write_glink_stub (h, ent, plt, p, info);
9684
9685
0
      if (!bfd_link_pic (info))
9686
        /* We only need one non-PIC glink stub.  */
9687
0
        break;
9688
0
    }
9689
0
  else
9690
0
    break;
9691
0
      }
9692
0
  return true;
9693
0
}
9694
9695
/* Finish up PLT handling.  */
9696
9697
bool
9698
ppc_finish_symbols (struct bfd_link_info *info)
9699
0
{
9700
0
  struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
9701
0
  bfd *ibfd;
9702
9703
0
  if (!htab)
9704
0
    return true;
9705
9706
0
  elf_link_hash_traverse (&htab->elf, write_global_sym_plt, info);
9707
9708
0
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
9709
0
    {
9710
0
      bfd_vma *local_got, *end_local_got;
9711
0
      struct plt_entry **local_plt, **lplt, **end_local_plt;
9712
0
      Elf_Internal_Shdr *symtab_hdr;
9713
0
      bfd_size_type locsymcount;
9714
0
      Elf_Internal_Sym *local_syms = NULL;
9715
0
      struct plt_entry *ent;
9716
9717
0
      if (!is_ppc_elf (ibfd))
9718
0
  continue;
9719
9720
0
      local_got = elf_local_got_offsets (ibfd);
9721
0
      if (!local_got)
9722
0
  continue;
9723
9724
0
      symtab_hdr = &elf_symtab_hdr (ibfd);
9725
0
      locsymcount = symtab_hdr->sh_info;
9726
0
      end_local_got = local_got + locsymcount;
9727
0
      local_plt = (struct plt_entry **) end_local_got;
9728
0
      end_local_plt = local_plt + locsymcount;
9729
0
      for (lplt = local_plt; lplt < end_local_plt; ++lplt)
9730
0
  for (ent = *lplt; ent != NULL; ent = ent->next)
9731
0
    {
9732
0
      if (ent->plt.offset != (bfd_vma) -1)
9733
0
        {
9734
0
    Elf_Internal_Sym *sym;
9735
0
    asection *sym_sec;
9736
0
    asection *plt, *relplt;
9737
0
    bfd_byte *loc;
9738
0
    bfd_vma val;
9739
0
    Elf_Internal_Rela rela;
9740
0
    unsigned char *p;
9741
9742
0
    if (!get_sym_h (NULL, &sym, &sym_sec, NULL, &local_syms,
9743
0
        lplt - local_plt, ibfd))
9744
0
      {
9745
0
        if (symtab_hdr->contents != (unsigned char *) local_syms)
9746
0
          free (local_syms);
9747
0
        return false;
9748
0
      }
9749
9750
0
    val = sym->st_value;
9751
0
    if (sym_sec != NULL && sym_sec->output_section != NULL)
9752
0
      val += sym_sec->output_offset + sym_sec->output_section->vma;
9753
9754
0
    if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
9755
0
      {
9756
0
        htab->local_ifunc_resolver = 1;
9757
0
        plt = htab->elf.iplt;
9758
0
        relplt = htab->elf.irelplt;
9759
0
        rela.r_info = ELF32_R_INFO (0, R_PPC_IRELATIVE);
9760
0
      }
9761
0
    else
9762
0
      {
9763
0
        plt = htab->pltlocal;
9764
0
        if (bfd_link_pic (info))
9765
0
          {
9766
0
      relplt = htab->relpltlocal;
9767
0
      rela.r_info = ELF32_R_INFO (0, R_PPC_RELATIVE);
9768
0
          }
9769
0
        else
9770
0
          {
9771
0
      loc = plt->contents + ent->plt.offset;
9772
0
      bfd_put_32 (info->output_bfd, val, loc);
9773
0
      continue;
9774
0
          }
9775
0
      }
9776
9777
0
    rela.r_offset = (ent->plt.offset
9778
0
         + plt->output_offset
9779
0
         + plt->output_section->vma);
9780
0
    rela.r_addend = val;
9781
0
    BFD_ASSERT (count_and_swap_reloc_out (info->output_bfd, &rela,
9782
0
                  relplt));
9783
9784
0
    p = (unsigned char *) htab->glink->contents + ent->glink_offset;
9785
0
    write_glink_stub (NULL, ent, htab->elf.iplt, p, info);
9786
0
        }
9787
0
    }
9788
9789
0
      if (local_syms != NULL
9790
0
    && symtab_hdr->contents != (unsigned char *) local_syms)
9791
0
  {
9792
0
    if (!info->keep_memory)
9793
0
      free (local_syms);
9794
0
    else
9795
0
      symtab_hdr->contents = (unsigned char *) local_syms;
9796
0
  }
9797
0
    }
9798
0
  return true;
9799
0
}
9800
9801
/* Finish up dynamic symbol handling.  We set the contents of various
9802
   dynamic sections here.  */
9803
9804
static bool
9805
ppc_elf_finish_dynamic_symbol (bfd *output_bfd,
9806
             struct bfd_link_info *info,
9807
             struct elf_link_hash_entry *h,
9808
             Elf_Internal_Sym *sym)
9809
0
{
9810
0
  struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
9811
0
  struct plt_entry *ent;
9812
9813
#ifdef DEBUG
9814
  fprintf (stderr, "ppc_elf_finish_dynamic_symbol called for %s",
9815
     h->root.root.string);
9816
#endif
9817
9818
0
  if (!h->def_regular
9819
0
      || (h->type == STT_GNU_IFUNC && !bfd_link_pic (info)))
9820
0
    for (ent = h->plt.plist; ent != NULL; ent = ent->next)
9821
0
      if (ent->plt.offset != (bfd_vma) -1)
9822
0
  {
9823
0
    if (!h->def_regular)
9824
0
      {
9825
        /* Mark the symbol as undefined, rather than as
9826
     defined in the .plt section.  Leave the value if
9827
     there were any relocations where pointer equality
9828
     matters (this is a clue for the dynamic linker, to
9829
     make function pointer comparisons work between an
9830
     application and shared library), otherwise set it
9831
     to zero.  */
9832
0
        sym->st_shndx = SHN_UNDEF;
9833
0
        if (!h->pointer_equality_needed)
9834
0
    sym->st_value = 0;
9835
0
        else if (!h->ref_regular_nonweak)
9836
0
    {
9837
      /* This breaks function pointer comparisons, but
9838
         that is better than breaking tests for a NULL
9839
         function pointer.  */
9840
0
      sym->st_value = 0;
9841
0
    }
9842
0
      }
9843
0
    else
9844
0
      {
9845
        /* Set the value of ifunc symbols in a non-pie
9846
     executable to the glink entry.  This is to avoid
9847
     text relocations.  We can't do this for ifunc in
9848
     allocate_dynrelocs, as we do for normal dynamic
9849
     function symbols with plt entries, because we need
9850
     to keep the original value around for the ifunc
9851
     relocation.  */
9852
0
        sym->st_shndx
9853
0
    = (_bfd_elf_section_from_bfd_section
9854
0
       (info->output_bfd, htab->glink->output_section));
9855
0
        sym->st_value = (ent->glink_offset
9856
0
             + htab->glink->output_offset
9857
0
             + htab->glink->output_section->vma);
9858
0
      }
9859
0
    break;
9860
0
  }
9861
9862
0
  if (h->needs_copy)
9863
0
    {
9864
0
      asection *s;
9865
0
      Elf_Internal_Rela rela;
9866
9867
      /* This symbols needs a copy reloc.  Set it up.  */
9868
9869
#ifdef DEBUG
9870
      fprintf (stderr, ", copy");
9871
#endif
9872
9873
0
      BFD_ASSERT (h->dynindx != -1);
9874
9875
0
      if (ppc_elf_hash_entry (h)->has_sda_refs)
9876
0
  s = htab->relsbss;
9877
0
      else if (h->root.u.def.section == htab->elf.sdynrelro)
9878
0
  s = htab->elf.sreldynrelro;
9879
0
      else
9880
0
  s = htab->elf.srelbss;
9881
0
      BFD_ASSERT (s != NULL);
9882
9883
0
      rela.r_offset = SYM_VAL (h);
9884
0
      rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_COPY);
9885
0
      rela.r_addend = 0;
9886
0
      BFD_ASSERT (count_and_swap_reloc_out (output_bfd, &rela, s));
9887
0
    }
9888
9889
#ifdef DEBUG
9890
  fprintf (stderr, "\n");
9891
#endif
9892
9893
0
  return true;
9894
0
}
9895

9896
static enum elf_reloc_type_class
9897
ppc_elf_reloc_type_class (const struct bfd_link_info *info,
9898
        const asection *rel_sec,
9899
        const Elf_Internal_Rela *rela)
9900
0
{
9901
0
  struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
9902
9903
0
  if (rel_sec == htab->elf.irelplt)
9904
0
    return reloc_class_ifunc;
9905
9906
0
  switch (ELF32_R_TYPE (rela->r_info))
9907
0
    {
9908
0
    case R_PPC_RELATIVE:
9909
0
      return reloc_class_relative;
9910
0
    case R_PPC_JMP_SLOT:
9911
0
      return reloc_class_plt;
9912
0
    case R_PPC_COPY:
9913
0
      return reloc_class_copy;
9914
0
    default:
9915
0
      return reloc_class_normal;
9916
0
    }
9917
0
}
9918

9919
/* Finish up the dynamic sections.  */
9920
9921
static bool
9922
ppc_elf_finish_dynamic_sections (bfd *output_bfd,
9923
         struct bfd_link_info *info,
9924
         bfd_byte *buf)
9925
0
{
9926
0
  asection *sdyn;
9927
0
  struct ppc_elf_link_hash_table *htab;
9928
0
  bfd_vma got;
9929
0
  bfd *dynobj;
9930
0
  bool ret = true;
9931
9932
#ifdef DEBUG
9933
  fprintf (stderr, "ppc_elf_finish_dynamic_sections called\n");
9934
#endif
9935
9936
0
  htab = ppc_elf_hash_table (info);
9937
0
  dynobj = htab->elf.dynobj;
9938
0
  sdyn = bfd_get_linker_section (dynobj, ".dynamic");
9939
9940
0
  got = 0;
9941
0
  if (htab->elf.hgot != NULL)
9942
0
    got = SYM_VAL (htab->elf.hgot);
9943
9944
0
  if (htab->elf.dynamic_sections_created)
9945
0
    {
9946
0
      Elf32_External_Dyn *dyncon, *dynconend;
9947
9948
0
      BFD_ASSERT (htab->elf.splt != NULL && sdyn != NULL);
9949
9950
0
      dyncon = (Elf32_External_Dyn *) sdyn->contents;
9951
0
      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
9952
0
      for (; dyncon < dynconend; dyncon++)
9953
0
  {
9954
0
    Elf_Internal_Dyn dyn;
9955
0
    asection *s;
9956
9957
0
    bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
9958
9959
0
    switch (dyn.d_tag)
9960
0
      {
9961
0
      case DT_PLTGOT:
9962
0
        if (htab->elf.target_os == is_vxworks)
9963
0
    s = htab->elf.sgotplt;
9964
0
        else
9965
0
    s = htab->elf.splt;
9966
0
        dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
9967
0
        break;
9968
9969
0
      case DT_PLTRELSZ:
9970
0
        dyn.d_un.d_val = htab->elf.srelplt->size;
9971
0
        break;
9972
9973
0
      case DT_JMPREL:
9974
0
        s = htab->elf.srelplt;
9975
0
        dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
9976
0
        break;
9977
9978
0
      case DT_PPC_GOT:
9979
0
        dyn.d_un.d_ptr = got;
9980
0
        break;
9981
9982
0
      case DT_TEXTREL:
9983
0
        if (htab->local_ifunc_resolver)
9984
0
    info->callbacks->einfo
9985
0
      (_("%X%P: text relocations and GNU indirect "
9986
0
         "functions will result in a segfault at runtime\n"));
9987
0
        else if (htab->maybe_local_ifunc_resolver)
9988
0
    info->callbacks->einfo
9989
0
      (_("%P: warning: text relocations and GNU indirect "
9990
0
         "functions may result in a segfault at runtime\n"));
9991
0
        continue;
9992
9993
0
      default:
9994
0
        if (htab->elf.target_os == is_vxworks
9995
0
      && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
9996
0
    break;
9997
0
        continue;
9998
0
      }
9999
10000
0
    bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
10001
0
  }
10002
0
    }
10003
10004
0
  if (htab->elf.sgot != NULL
10005
0
      && htab->elf.sgot->output_section != bfd_abs_section_ptr)
10006
0
    {
10007
0
      if (htab->elf.hgot->root.u.def.section == htab->elf.sgot
10008
0
    || htab->elf.hgot->root.u.def.section == htab->elf.sgotplt)
10009
0
  {
10010
0
    unsigned char *p = htab->elf.hgot->root.u.def.section->contents;
10011
10012
0
    p += htab->elf.hgot->root.u.def.value;
10013
0
    if (htab->plt_type == PLT_OLD)
10014
0
      {
10015
        /* Add a blrl instruction at _GLOBAL_OFFSET_TABLE_-4
10016
     so that a function can easily find the address of
10017
     _GLOBAL_OFFSET_TABLE_.  */
10018
0
        BFD_ASSERT (htab->elf.hgot->root.u.def.value - 4
10019
0
        < htab->elf.hgot->root.u.def.section->size);
10020
0
        bfd_put_32 (output_bfd, 0x4e800021, p - 4);
10021
0
      }
10022
10023
0
    if (sdyn != NULL)
10024
0
      {
10025
0
        bfd_vma val = sdyn->output_section->vma + sdyn->output_offset;
10026
0
        BFD_ASSERT (htab->elf.hgot->root.u.def.value
10027
0
        < htab->elf.hgot->root.u.def.section->size);
10028
0
        bfd_put_32 (output_bfd, val, p);
10029
0
      }
10030
0
  }
10031
0
      else
10032
0
  {
10033
    /* xgettext:c-format */
10034
0
    _bfd_error_handler (_("%s not defined in linker created %pA"),
10035
0
            htab->elf.hgot->root.root.string,
10036
0
            (htab->elf.sgotplt != NULL
10037
0
             ? htab->elf.sgotplt : htab->elf.sgot));
10038
0
    bfd_set_error (bfd_error_bad_value);
10039
0
    ret = false;
10040
0
  }
10041
10042
0
      elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 4;
10043
0
    }
10044
10045
  /* Fill in the first entry in the VxWorks procedure linkage table.  */
10046
0
  if (htab->elf.target_os == is_vxworks
10047
0
      && htab->elf.splt != NULL
10048
0
      && htab->elf.splt->size != 0
10049
0
      && htab->elf.splt->output_section != bfd_abs_section_ptr)
10050
0
    {
10051
0
      asection *splt = htab->elf.splt;
10052
      /* Use the right PLT. */
10053
0
      const bfd_vma *plt_entry = (bfd_link_pic (info)
10054
0
          ? ppc_elf_vxworks_pic_plt0_entry
10055
0
          : ppc_elf_vxworks_plt0_entry);
10056
10057
0
      if (!bfd_link_pic (info))
10058
0
  {
10059
0
    bfd_vma got_value = SYM_VAL (htab->elf.hgot);
10060
10061
0
    bfd_put_32 (output_bfd, plt_entry[0] | PPC_HA (got_value),
10062
0
          splt->contents +  0);
10063
0
    bfd_put_32 (output_bfd, plt_entry[1] | PPC_LO (got_value),
10064
0
          splt->contents +  4);
10065
0
  }
10066
0
      else
10067
0
  {
10068
0
    bfd_put_32 (output_bfd, plt_entry[0], splt->contents +  0);
10069
0
    bfd_put_32 (output_bfd, plt_entry[1], splt->contents +  4);
10070
0
  }
10071
0
      bfd_put_32 (output_bfd, plt_entry[2], splt->contents +  8);
10072
0
      bfd_put_32 (output_bfd, plt_entry[3], splt->contents + 12);
10073
0
      bfd_put_32 (output_bfd, plt_entry[4], splt->contents + 16);
10074
0
      bfd_put_32 (output_bfd, plt_entry[5], splt->contents + 20);
10075
0
      bfd_put_32 (output_bfd, plt_entry[6], splt->contents + 24);
10076
0
      bfd_put_32 (output_bfd, plt_entry[7], splt->contents + 28);
10077
10078
0
      if (! bfd_link_pic (info))
10079
0
  {
10080
0
    Elf_Internal_Rela rela;
10081
0
    bfd_byte *loc;
10082
10083
0
    loc = htab->srelplt2->contents;
10084
10085
    /* Output the @ha relocation for the first instruction.  */
10086
0
    rela.r_offset = (htab->elf.splt->output_section->vma
10087
0
         + htab->elf.splt->output_offset
10088
0
         + 2);
10089
0
    rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_HA);
10090
0
    rela.r_addend = 0;
10091
0
    BFD_ASSERT (swap_reloc_out (output_bfd, &rela, loc, htab->srelplt2));
10092
0
    loc += sizeof (Elf32_External_Rela);
10093
10094
    /* Output the @l relocation for the second instruction.  */
10095
0
    rela.r_offset = (htab->elf.splt->output_section->vma
10096
0
         + htab->elf.splt->output_offset
10097
0
         + 6);
10098
0
    rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_LO);
10099
0
    rela.r_addend = 0;
10100
0
    BFD_ASSERT (swap_reloc_out (output_bfd, &rela, loc, htab->srelplt2));
10101
0
    loc += sizeof (Elf32_External_Rela);
10102
10103
    /* Fix up the remaining relocations.  They may have the wrong
10104
       symbol index for _G_O_T_ or _P_L_T_ depending on the order
10105
       in which symbols were output.  */
10106
0
    while (loc < htab->srelplt2->contents + htab->srelplt2->size)
10107
0
      {
10108
0
        Elf_Internal_Rela rel;
10109
10110
0
        bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
10111
0
        rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_HA);
10112
0
        bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
10113
0
        loc += sizeof (Elf32_External_Rela);
10114
10115
0
        bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
10116
0
        rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_LO);
10117
0
        bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
10118
0
        loc += sizeof (Elf32_External_Rela);
10119
10120
0
        bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
10121
0
        rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_PPC_ADDR32);
10122
0
        bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
10123
0
        loc += sizeof (Elf32_External_Rela);
10124
0
      }
10125
0
  }
10126
0
    }
10127
10128
0
  if (htab->glink != NULL
10129
0
      && htab->glink->contents != NULL
10130
0
      && htab->elf.dynamic_sections_created)
10131
0
    {
10132
0
      unsigned char *p;
10133
0
      unsigned char *endp;
10134
0
      bfd_vma res0;
10135
10136
      /*
10137
       * PIC glink code is the following:
10138
       *
10139
       * # ith PLT code stub.
10140
       *   addis 11,30,(plt+(i-1)*4-got)@ha
10141
       *   lwz 11,(plt+(i-1)*4-got)@l(11)
10142
       *   mtctr 11
10143
       *   bctr
10144
       *
10145
       * # A table of branches, one for each plt entry.
10146
       * # The idea is that the plt call stub loads ctr and r11 with these
10147
       * # addresses, so (r11 - res_0) gives the plt index * 4.
10148
       * res_0: b PLTresolve
10149
       * res_1: b PLTresolve
10150
       * .
10151
       * # Some number of entries towards the end can be nops
10152
       * res_n_m3: nop
10153
       * res_n_m2: nop
10154
       * res_n_m1:
10155
       *
10156
       * PLTresolve:
10157
       *    addis 11,11,(1f-res_0)@ha
10158
       *    mflr 0
10159
       *    bcl 20,31,1f
10160
       * 1: addi 11,11,(1b-res_0)@l
10161
       *    mflr 12
10162
       *    mtlr 0
10163
       *    sub 11,11,12    # r11 = index * 4
10164
       *    addis 12,12,(got+4-1b)@ha
10165
       *    lwz 0,(got+4-1b)@l(12)  # got[1] address of dl_runtime_resolve
10166
       *    lwz 12,(got+8-1b)@l(12) # got[2] contains the map address
10167
       *    mtctr 0
10168
       *    add 0,11,11
10169
       *    add 11,0,11     # r11 = index * 12 = reloc offset.
10170
       *    bctr
10171
       *
10172
       * Non-PIC glink code is a little simpler.
10173
       *
10174
       * # ith PLT code stub.
10175
       *   lis 11,(plt+(i-1)*4)@ha
10176
       *   lwz 11,(plt+(i-1)*4)@l(11)
10177
       *   mtctr 11
10178
       *   bctr
10179
       *
10180
       * The branch table is the same, then comes
10181
       *
10182
       * PLTresolve:
10183
       *    lis 12,(got+4)@ha
10184
       *    addis 11,11,(-res_0)@ha
10185
       *    lwz 0,(got+4)@l(12)   # got[1] address of dl_runtime_resolve
10186
       *    addi 11,11,(-res_0)@l # r11 = index * 4
10187
       *    mtctr 0
10188
       *    add 0,11,11
10189
       *    lwz 12,(got+8)@l(12)  # got[2] contains the map address
10190
       *    add 11,0,11     # r11 = index * 12 = reloc offset.
10191
       *    bctr
10192
       */
10193
10194
      /* Build the branch table, one for each plt entry (less one),
10195
   and perhaps some padding.  */
10196
0
      p = htab->glink->contents;
10197
0
      p += htab->glink_pltresolve;
10198
0
      endp = htab->glink->contents;
10199
0
      endp += htab->glink->size - GLINK_PLTRESOLVE;
10200
0
      while (p < endp - (htab->params->ppc476_workaround ? 0 : 8 * 4))
10201
0
  {
10202
0
    bfd_put_32 (output_bfd, B + endp - p, p);
10203
0
    p += 4;
10204
0
  }
10205
0
      while (p < endp)
10206
0
  {
10207
0
    bfd_put_32 (output_bfd, NOP, p);
10208
0
    p += 4;
10209
0
  }
10210
10211
0
      res0 = (htab->glink_pltresolve
10212
0
        + htab->glink->output_section->vma
10213
0
        + htab->glink->output_offset);
10214
10215
0
      if (htab->params->ppc476_workaround)
10216
0
  {
10217
    /* Ensure that a call stub at the end of a page doesn't
10218
       result in prefetch over the end of the page into the
10219
       glink branch table.  */
10220
0
    bfd_vma pagesize = (bfd_vma) 1 << htab->params->pagesize_p2;
10221
0
    bfd_vma page_addr;
10222
0
    bfd_vma glink_start = (htab->glink->output_section->vma
10223
0
         + htab->glink->output_offset);
10224
10225
0
    for (page_addr = res0 & -pagesize;
10226
0
         page_addr > glink_start;
10227
0
         page_addr -= pagesize)
10228
0
      {
10229
        /* We have a plt call stub that may need fixing.  */
10230
0
        bfd_byte *loc;
10231
0
        unsigned int insn;
10232
10233
0
        loc = htab->glink->contents + page_addr - 4 - glink_start;
10234
0
        insn = bfd_get_32 (output_bfd, loc);
10235
0
        if (insn == BCTR)
10236
0
    {
10237
      /* By alignment, we know that there must be at least
10238
         one other call stub before this one.  */
10239
0
      insn = bfd_get_32 (output_bfd, loc - 16);
10240
0
      if (insn == BCTR)
10241
0
        bfd_put_32 (output_bfd, B | (-16 & 0x3fffffc), loc);
10242
0
      else
10243
0
        bfd_put_32 (output_bfd, B | (-20 & 0x3fffffc), loc);
10244
0
    }
10245
0
      }
10246
0
  }
10247
10248
      /* Last comes the PLTresolve stub.  */
10249
0
      endp = p + GLINK_PLTRESOLVE;
10250
0
      if (bfd_link_pic (info))
10251
0
  {
10252
0
    bfd_vma bcl;
10253
10254
0
    bcl = (htab->glink->size - GLINK_PLTRESOLVE + 3*4
10255
0
     + htab->glink->output_section->vma
10256
0
     + htab->glink->output_offset);
10257
10258
0
    bfd_put_32 (output_bfd, ADDIS_11_11 + PPC_HA (bcl - res0), p);
10259
0
    p += 4;
10260
0
    bfd_put_32 (output_bfd, MFLR_0, p);
10261
0
    p += 4;
10262
0
    bfd_put_32 (output_bfd, BCL_20_31, p);
10263
0
    p += 4;
10264
0
    bfd_put_32 (output_bfd, ADDI_11_11 + PPC_LO (bcl - res0), p);
10265
0
    p += 4;
10266
0
    bfd_put_32 (output_bfd, MFLR_12, p);
10267
0
    p += 4;
10268
0
    bfd_put_32 (output_bfd, MTLR_0, p);
10269
0
    p += 4;
10270
0
    bfd_put_32 (output_bfd, SUB_11_11_12, p);
10271
0
    p += 4;
10272
0
    bfd_put_32 (output_bfd, ADDIS_12_12 + PPC_HA (got + 4 - bcl), p);
10273
0
    p += 4;
10274
0
    if (PPC_HA (got + 4 - bcl) == PPC_HA (got + 8 - bcl))
10275
0
      {
10276
0
        bfd_put_32 (output_bfd, LWZ_0_12 + PPC_LO (got + 4 - bcl), p);
10277
0
        p += 4;
10278
0
        bfd_put_32 (output_bfd, LWZ_12_12 + PPC_LO (got + 8 - bcl), p);
10279
0
        p += 4;
10280
0
      }
10281
0
    else
10282
0
      {
10283
0
        bfd_put_32 (output_bfd, LWZU_0_12 + PPC_LO (got + 4 - bcl), p);
10284
0
        p += 4;
10285
0
        bfd_put_32 (output_bfd, LWZ_12_12 + 4, p);
10286
0
        p += 4;
10287
0
      }
10288
0
    bfd_put_32 (output_bfd, MTCTR_0, p);
10289
0
    p += 4;
10290
0
    bfd_put_32 (output_bfd, ADD_0_11_11, p);
10291
0
  }
10292
0
      else
10293
0
  {
10294
0
    bfd_put_32 (output_bfd, LIS_12 + PPC_HA (got + 4), p);
10295
0
    p += 4;
10296
0
    bfd_put_32 (output_bfd, ADDIS_11_11 + PPC_HA (-res0), p);
10297
0
    p += 4;
10298
0
    if (PPC_HA (got + 4) == PPC_HA (got + 8))
10299
0
      bfd_put_32 (output_bfd, LWZ_0_12 + PPC_LO (got + 4), p);
10300
0
    else
10301
0
      bfd_put_32 (output_bfd, LWZU_0_12 + PPC_LO (got + 4), p);
10302
0
    p += 4;
10303
0
    bfd_put_32 (output_bfd, ADDI_11_11 + PPC_LO (-res0), p);
10304
0
    p += 4;
10305
0
    bfd_put_32 (output_bfd, MTCTR_0, p);
10306
0
    p += 4;
10307
0
    bfd_put_32 (output_bfd, ADD_0_11_11, p);
10308
0
    p += 4;
10309
0
    if (PPC_HA (got + 4) == PPC_HA (got + 8))
10310
0
      bfd_put_32 (output_bfd, LWZ_12_12 + PPC_LO (got + 8), p);
10311
0
    else
10312
0
      bfd_put_32 (output_bfd, LWZ_12_12 + 4, p);
10313
0
  }
10314
0
      p += 4;
10315
0
      bfd_put_32 (output_bfd, ADD_11_0_11, p);
10316
0
      p += 4;
10317
0
      bfd_put_32 (output_bfd, BCTR, p);
10318
0
      p += 4;
10319
0
      while (p < endp)
10320
0
  {
10321
0
    bfd_put_32 (output_bfd,
10322
0
          htab->params->ppc476_workaround ? BA : NOP, p);
10323
0
    p += 4;
10324
0
  }
10325
0
      BFD_ASSERT (p == endp);
10326
0
    }
10327
10328
0
  if (htab->glink_eh_frame != NULL
10329
0
      && htab->glink_eh_frame->contents != NULL)
10330
0
    {
10331
0
      unsigned char *p = htab->glink_eh_frame->contents;
10332
0
      bfd_vma val;
10333
10334
0
      p += sizeof (glink_eh_frame_cie);
10335
      /* FDE length.  */
10336
0
      p += 4;
10337
      /* CIE pointer.  */
10338
0
      p += 4;
10339
      /* Offset to .glink.  */
10340
0
      val = (htab->glink->output_section->vma
10341
0
       + htab->glink->output_offset);
10342
0
      val -= (htab->glink_eh_frame->output_section->vma
10343
0
        + htab->glink_eh_frame->output_offset);
10344
0
      val -= p - htab->glink_eh_frame->contents;
10345
0
      bfd_put_32 (htab->elf.dynobj, val, p);
10346
10347
0
      if (htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
10348
0
    && !_bfd_elf_write_linker_section_eh_frame (output_bfd, info,
10349
0
                  htab->glink_eh_frame,
10350
0
                  buf))
10351
0
  return false;
10352
0
    }
10353
10354
0
  return ret;
10355
0
}
10356

10357
#define TARGET_LITTLE_SYM powerpc_elf32_le_vec
10358
#define TARGET_LITTLE_NAME  "elf32-powerpcle"
10359
#define TARGET_BIG_SYM    powerpc_elf32_vec
10360
#define TARGET_BIG_NAME   "elf32-powerpc"
10361
#define ELF_ARCH    bfd_arch_powerpc
10362
#define ELF_TARGET_ID   PPC32_ELF_DATA
10363
#define ELF_MACHINE_CODE  EM_PPC
10364
#define ELF_MAXPAGESIZE   0x10000
10365
#define ELF_COMMONPAGESIZE  0x1000
10366
#define elf_info_to_howto ppc_elf_info_to_howto
10367
10368
#ifdef  EM_CYGNUS_POWERPC
10369
#define ELF_MACHINE_ALT1  EM_CYGNUS_POWERPC
10370
#endif
10371
10372
#ifdef EM_PPC_OLD
10373
#define ELF_MACHINE_ALT2  EM_PPC_OLD
10374
#endif
10375
10376
#define elf_backend_plt_not_loaded  1
10377
#define elf_backend_want_dynrelro 1
10378
#define elf_backend_can_gc_sections 1
10379
#define elf_backend_can_refcount  1
10380
#define elf_backend_rela_normal   1
10381
#define elf_backend_caches_rawsize  1
10382
10383
#define bfd_elf32_mkobject      ppc_elf_mkobject
10384
#define bfd_elf32_bfd_merge_private_bfd_data  ppc_elf_merge_private_bfd_data
10385
#define bfd_elf32_bfd_relax_section   ppc_elf_relax_section
10386
#define bfd_elf32_bfd_reloc_type_lookup   ppc_elf_reloc_type_lookup
10387
#define bfd_elf32_bfd_reloc_name_lookup   ppc_elf_reloc_name_lookup
10388
#define bfd_elf32_bfd_set_private_flags   ppc_elf_set_private_flags
10389
#define bfd_elf32_bfd_link_hash_table_create  ppc_elf_link_hash_table_create
10390
#define bfd_elf32_get_synthetic_symtab    ppc_elf_get_synthetic_symtab
10391
10392
#define elf_backend_object_p      ppc_elf_object_p
10393
#define elf_backend_gc_mark_hook    ppc_elf_gc_mark_hook
10394
#define elf_backend_section_from_shdr   ppc_elf_section_from_shdr
10395
#define elf_backend_relocate_section    ppc_elf_relocate_section
10396
#define elf_backend_create_dynamic_sections ppc_elf_create_dynamic_sections
10397
#define elf_backend_check_relocs    ppc_elf_check_relocs
10398
#define elf_backend_relocs_compatible   _bfd_elf_relocs_compatible
10399
#define elf_backend_copy_indirect_symbol  ppc_elf_copy_indirect_symbol
10400
#define elf_backend_adjust_dynamic_symbol ppc_elf_adjust_dynamic_symbol
10401
#define elf_backend_add_symbol_hook   ppc_elf_add_symbol_hook
10402
#define elf_backend_late_size_sections    ppc_elf_late_size_sections
10403
#define elf_backend_hash_symbol     ppc_elf_hash_symbol
10404
#define elf_backend_finish_dynamic_symbol ppc_elf_finish_dynamic_symbol
10405
#define elf_backend_finish_dynamic_sections ppc_elf_finish_dynamic_sections
10406
#define elf_backend_fake_sections   ppc_elf_fake_sections
10407
#define elf_backend_additional_program_headers  ppc_elf_additional_program_headers
10408
#define elf_backend_modify_segment_map    ppc_elf_modify_segment_map
10409
#define elf_backend_grok_prstatus   ppc_elf_grok_prstatus
10410
#define elf_backend_grok_psinfo     ppc_elf_grok_psinfo
10411
#define elf_backend_write_core_note   ppc_elf_write_core_note
10412
#define elf_backend_reloc_type_class    ppc_elf_reloc_type_class
10413
#define elf_backend_begin_write_processing  ppc_elf_begin_write_processing
10414
#define elf_backend_final_write_processing  ppc_elf_final_write_processing
10415
#define elf_backend_write_section   ppc_elf_write_section
10416
#define elf_backend_get_sec_type_attr   ppc_elf_get_sec_type_attr
10417
#define elf_backend_plt_sym_val     ppc_elf_plt_sym_val
10418
#define elf_backend_action_discarded    ppc_elf_action_discarded
10419
#define elf_backend_init_index_section    _bfd_elf_init_1_index_section
10420
#define elf_backend_lookup_section_flags_hook ppc_elf_lookup_section_flags
10421
10422
#include "elf32-target.h"
10423
10424
/* FreeBSD Target */
10425
10426
#undef  TARGET_LITTLE_SYM
10427
#undef  TARGET_LITTLE_NAME
10428
10429
#undef  TARGET_BIG_SYM
10430
#define TARGET_BIG_SYM  powerpc_elf32_fbsd_vec
10431
#undef  TARGET_BIG_NAME
10432
#define TARGET_BIG_NAME "elf32-powerpc-freebsd"
10433
10434
#undef  ELF_OSABI
10435
#define ELF_OSABI ELFOSABI_FREEBSD
10436
#undef  ELF_OSABI_EXACT
10437
#define ELF_OSABI_EXACT 1
10438
10439
#undef  elf32_bed
10440
#define elf32_bed elf32_powerpc_fbsd_bed
10441
10442
#include "elf32-target.h"
10443
10444
/* VxWorks Target */
10445
10446
#undef TARGET_LITTLE_SYM
10447
#undef TARGET_LITTLE_NAME
10448
10449
#undef TARGET_BIG_SYM
10450
#define TARGET_BIG_SYM    powerpc_elf32_vxworks_vec
10451
#undef TARGET_BIG_NAME
10452
#define TARGET_BIG_NAME   "elf32-powerpc-vxworks"
10453
10454
#undef  ELF_OSABI
10455
#undef  ELF_OSABI_EXACT
10456
10457
#undef ELF_TARGET_OS
10458
#define ELF_TARGET_OS   is_vxworks
10459
10460
/* VxWorks uses the elf default section flags for .plt.  */
10461
static const struct bfd_elf_special_section *
10462
ppc_elf_vxworks_get_sec_type_attr (bfd *abfd, asection *sec)
10463
4.89k
{
10464
4.89k
  if (sec->name == NULL)
10465
0
    return NULL;
10466
10467
4.89k
  if (strcmp (sec->name, ".plt") == 0)
10468
0
    return _bfd_elf_get_sec_type_attr (abfd, sec);
10469
10470
4.89k
  return ppc_elf_get_sec_type_attr (abfd, sec);
10471
4.89k
}
10472
10473
/* Like ppc_elf_link_hash_table_create, but overrides
10474
   appropriately for VxWorks.  */
10475
static struct bfd_link_hash_table *
10476
ppc_elf_vxworks_link_hash_table_create (bfd *abfd)
10477
0
{
10478
0
  struct bfd_link_hash_table *ret;
10479
10480
0
  ret = ppc_elf_link_hash_table_create (abfd);
10481
0
  if (ret)
10482
0
    {
10483
0
      struct ppc_elf_link_hash_table *htab
10484
0
  = (struct ppc_elf_link_hash_table *)ret;
10485
0
      htab->plt_type = PLT_VXWORKS;
10486
0
      htab->plt_entry_size = VXWORKS_PLT_ENTRY_SIZE;
10487
0
      htab->plt_slot_size = VXWORKS_PLT_ENTRY_SIZE;
10488
0
      htab->plt_initial_entry_size = VXWORKS_PLT_INITIAL_ENTRY_SIZE;
10489
0
    }
10490
0
  return ret;
10491
0
}
10492
10493
/* Tweak magic VxWorks symbols as they are loaded.  */
10494
static bool
10495
ppc_elf_vxworks_add_symbol_hook (bfd *abfd,
10496
         struct bfd_link_info *info,
10497
         Elf_Internal_Sym *sym,
10498
         const char **namep,
10499
         flagword *flagsp,
10500
         asection **secp,
10501
         bfd_vma *valp)
10502
0
{
10503
0
  if (!elf_vxworks_add_symbol_hook (abfd, info, sym, namep, flagsp, secp,
10504
0
            valp))
10505
0
    return false;
10506
10507
0
  return ppc_elf_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp);
10508
0
}
10509
10510
static bool
10511
ppc_elf_vxworks_final_write_processing (bfd *abfd)
10512
0
{
10513
0
  ppc_final_write_processing (abfd);
10514
0
  return elf_vxworks_final_write_processing (abfd);
10515
0
}
10516
10517
/* On VxWorks, we emit relocations against _PROCEDURE_LINKAGE_TABLE_, so
10518
   define it.  */
10519
#undef elf_backend_want_plt_sym
10520
#define elf_backend_want_plt_sym    1
10521
#undef elf_backend_want_got_plt
10522
#define elf_backend_want_got_plt    1
10523
#undef elf_backend_got_symbol_offset
10524
#define elf_backend_got_symbol_offset   0
10525
#undef elf_backend_plt_not_loaded
10526
#define elf_backend_plt_not_loaded    0
10527
#undef elf_backend_plt_readonly
10528
#define elf_backend_plt_readonly    1
10529
#undef elf_backend_got_header_size
10530
#define elf_backend_got_header_size   12
10531
#undef elf_backend_dtrel_excludes_plt
10532
#define elf_backend_dtrel_excludes_plt    1
10533
10534
#undef bfd_elf32_get_synthetic_symtab
10535
10536
#undef bfd_elf32_bfd_link_hash_table_create
10537
#define bfd_elf32_bfd_link_hash_table_create \
10538
  ppc_elf_vxworks_link_hash_table_create
10539
#undef elf_backend_add_symbol_hook
10540
#define elf_backend_add_symbol_hook \
10541
  ppc_elf_vxworks_add_symbol_hook
10542
#undef elf_backend_link_output_symbol_hook
10543
#define elf_backend_link_output_symbol_hook \
10544
  elf_vxworks_link_output_symbol_hook
10545
#undef elf_backend_final_write_processing
10546
#define elf_backend_final_write_processing \
10547
  ppc_elf_vxworks_final_write_processing
10548
#undef elf_backend_get_sec_type_attr
10549
#define elf_backend_get_sec_type_attr \
10550
  ppc_elf_vxworks_get_sec_type_attr
10551
#undef elf_backend_emit_relocs
10552
#define elf_backend_emit_relocs \
10553
  elf_vxworks_emit_relocs
10554
10555
#undef elf32_bed
10556
#define elf32_bed       ppc_elf_vxworks_bed
10557
10558
#include "elf32-target.h"