OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [bfd/] [elf32-ppc.c] - Blame information for rev 179

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.