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 163

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
   2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
4
   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
        memset (data, 0, 32);
1924
        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
  s = bfd_make_section_with_flags (abfd, ".rela.iplt", flags);
2895
  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
  s = bfd_make_section_with_flags (abfd, ".dynsbss",
2928
                                   SEC_ALLOC | SEC_LINKER_CREATED);
2929
  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
      s = bfd_make_section_with_flags (abfd, ".rela.sbss", flags);
2939
      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
  /* If we were called to copy over info for a weak sym, that's all.  */
2991
  if (eind->elf.root.type != bfd_link_hash_indirect)
2992
    return;
2993
 
2994 14 khays
  if (eind->dyn_relocs != NULL)
2995
    {
2996
      if (edir->dyn_relocs != NULL)
2997
        {
2998
          struct elf_dyn_relocs **pp;
2999
          struct elf_dyn_relocs *p;
3000
 
3001
          /* Add reloc counts against the indirect sym to the direct sym
3002
             list.  Merge any entries against the same section.  */
3003
          for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
3004
            {
3005
              struct elf_dyn_relocs *q;
3006
 
3007
              for (q = edir->dyn_relocs; q != NULL; q = q->next)
3008
                if (q->sec == p->sec)
3009
                  {
3010
                    q->pc_count += p->pc_count;
3011
                    q->count += p->count;
3012
                    *pp = p->next;
3013
                    break;
3014
                  }
3015
              if (q == NULL)
3016
                pp = &p->next;
3017
            }
3018
          *pp = edir->dyn_relocs;
3019
        }
3020
 
3021
      edir->dyn_relocs = eind->dyn_relocs;
3022
      eind->dyn_relocs = NULL;
3023
    }
3024
 
3025
  /* Copy over the GOT refcount entries that we may have already seen to
3026
     the symbol which just became indirect.  */
3027
  edir->elf.got.refcount += eind->elf.got.refcount;
3028
  eind->elf.got.refcount = 0;
3029
 
3030
  /* And plt entries.  */
3031
  if (eind->elf.plt.plist != NULL)
3032
    {
3033
      if (edir->elf.plt.plist != NULL)
3034
        {
3035
          struct plt_entry **entp;
3036
          struct plt_entry *ent;
3037
 
3038
          for (entp = &eind->elf.plt.plist; (ent = *entp) != NULL; )
3039
            {
3040
              struct plt_entry *dent;
3041
 
3042
              for (dent = edir->elf.plt.plist; dent != NULL; dent = dent->next)
3043
                if (dent->sec == ent->sec && dent->addend == ent->addend)
3044
                  {
3045
                    dent->plt.refcount += ent->plt.refcount;
3046
                    *entp = ent->next;
3047
                    break;
3048
                  }
3049
              if (dent == NULL)
3050
                entp = &ent->next;
3051
            }
3052
          *entp = edir->elf.plt.plist;
3053
        }
3054
 
3055
      edir->elf.plt.plist = eind->elf.plt.plist;
3056
      eind->elf.plt.plist = NULL;
3057
    }
3058
 
3059
  if (eind->elf.dynindx != -1)
3060
    {
3061
      if (edir->elf.dynindx != -1)
3062
        _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
3063
                                edir->elf.dynstr_index);
3064
      edir->elf.dynindx = eind->elf.dynindx;
3065
      edir->elf.dynstr_index = eind->elf.dynstr_index;
3066
      eind->elf.dynindx = -1;
3067
      eind->elf.dynstr_index = 0;
3068
    }
3069
}
3070
 
3071
/* Hook called by the linker routine which adds symbols from an object
3072
   file.  We use it to put .comm items in .sbss, and not .bss.  */
3073
 
3074
static bfd_boolean
3075
ppc_elf_add_symbol_hook (bfd *abfd,
3076
                         struct bfd_link_info *info,
3077
                         Elf_Internal_Sym *sym,
3078
                         const char **namep ATTRIBUTE_UNUSED,
3079
                         flagword *flagsp ATTRIBUTE_UNUSED,
3080
                         asection **secp,
3081
                         bfd_vma *valp)
3082
{
3083
  if (sym->st_shndx == SHN_COMMON
3084
      && !info->relocatable
3085
      && is_ppc_elf (info->output_bfd)
3086
      && sym->st_size <= elf_gp_size (abfd))
3087
    {
3088
      /* Common symbols less than or equal to -G nn bytes are automatically
3089
         put into .sbss.  */
3090
      struct ppc_elf_link_hash_table *htab;
3091
 
3092
      htab = ppc_elf_hash_table (info);
3093
      if (htab->sbss == NULL)
3094
        {
3095
          flagword flags = SEC_IS_COMMON | SEC_LINKER_CREATED;
3096
 
3097
          if (!htab->elf.dynobj)
3098
            htab->elf.dynobj = abfd;
3099
 
3100
          htab->sbss = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
3101
                                                           ".sbss",
3102
                                                           flags);
3103
          if (htab->sbss == NULL)
3104
            return FALSE;
3105
        }
3106
 
3107
      *secp = htab->sbss;
3108
      *valp = sym->st_size;
3109
    }
3110
 
3111
  if ((abfd->flags & DYNAMIC) == 0
3112
      && (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
3113
          || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE))
3114
    elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
3115
 
3116
  return TRUE;
3117
}
3118
 
3119
static bfd_boolean
3120
create_sdata_sym (struct bfd_link_info *info, elf_linker_section_t *lsect)
3121
{
3122
  struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
3123
 
3124
  lsect->sym = elf_link_hash_lookup (&htab->elf, lsect->sym_name,
3125
                                     TRUE, FALSE, TRUE);
3126
  if (lsect->sym == NULL)
3127
    return FALSE;
3128
  if (lsect->sym->root.type == bfd_link_hash_new)
3129
    lsect->sym->non_elf = 0;
3130
  lsect->sym->ref_regular = 1;
3131
  _bfd_elf_link_hash_hide_symbol (info, lsect->sym, TRUE);
3132
  return TRUE;
3133
}
3134
 
3135
/* Create a special linker section.  */
3136
 
3137
static bfd_boolean
3138
ppc_elf_create_linker_section (bfd *abfd,
3139
                               struct bfd_link_info *info,
3140
                               flagword flags,
3141
                               elf_linker_section_t *lsect)
3142
{
3143
  struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
3144
  asection *s;
3145
 
3146
  flags |= (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3147
            | SEC_LINKER_CREATED);
3148
 
3149
  /* Record the first bfd that needs the special sections.  */
3150
  if (!htab->elf.dynobj)
3151
    htab->elf.dynobj = abfd;
3152
 
3153
  s = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
3154
                                          lsect->name,
3155
                                          flags);
3156
  if (s == NULL
3157
      || !bfd_set_section_alignment (htab->elf.dynobj, s, 2))
3158
    return FALSE;
3159
  lsect->section = s;
3160
 
3161
  return create_sdata_sym (info, lsect);
3162
}
3163
 
3164
/* Find a linker generated pointer with a given addend and type.  */
3165
 
3166
static elf_linker_section_pointers_t *
3167
elf_find_pointer_linker_section
3168
  (elf_linker_section_pointers_t *linker_pointers,
3169
   bfd_vma addend,
3170
   elf_linker_section_t *lsect)
3171
{
3172
  for ( ; linker_pointers != NULL; linker_pointers = linker_pointers->next)
3173
    if (lsect == linker_pointers->lsect && addend == linker_pointers->addend)
3174
      return linker_pointers;
3175
 
3176
  return NULL;
3177
}
3178
 
3179
/* Allocate a pointer to live in a linker created section.  */
3180
 
3181
static bfd_boolean
3182
elf_create_pointer_linker_section (bfd *abfd,
3183
                                   elf_linker_section_t *lsect,
3184
                                   struct elf_link_hash_entry *h,
3185
                                   const Elf_Internal_Rela *rel)
3186
{
3187
  elf_linker_section_pointers_t **ptr_linker_section_ptr = NULL;
3188
  elf_linker_section_pointers_t *linker_section_ptr;
3189
  unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
3190
  bfd_size_type amt;
3191
 
3192
  BFD_ASSERT (lsect != NULL);
3193
 
3194
  /* Is this a global symbol?  */
3195
  if (h != NULL)
3196
    {
3197
      struct ppc_elf_link_hash_entry *eh;
3198
 
3199
      /* Has this symbol already been allocated?  If so, our work is done.  */
3200
      eh = (struct ppc_elf_link_hash_entry *) h;
3201
      if (elf_find_pointer_linker_section (eh->linker_section_pointer,
3202
                                           rel->r_addend,
3203
                                           lsect))
3204
        return TRUE;
3205
 
3206
      ptr_linker_section_ptr = &eh->linker_section_pointer;
3207
    }
3208
  else
3209
    {
3210
      BFD_ASSERT (is_ppc_elf (abfd));
3211
 
3212
      /* Allocation of a pointer to a local symbol.  */
3213
      elf_linker_section_pointers_t **ptr = elf_local_ptr_offsets (abfd);
3214
 
3215
      /* Allocate a table to hold the local symbols if first time.  */
3216
      if (!ptr)
3217
        {
3218
          unsigned int num_symbols = elf_symtab_hdr (abfd).sh_info;
3219
 
3220
          amt = num_symbols;
3221
          amt *= sizeof (elf_linker_section_pointers_t *);
3222
          ptr = bfd_zalloc (abfd, amt);
3223
 
3224
          if (!ptr)
3225
            return FALSE;
3226
 
3227
          elf_local_ptr_offsets (abfd) = ptr;
3228
        }
3229
 
3230
      /* Has this symbol already been allocated?  If so, our work is done.  */
3231
      if (elf_find_pointer_linker_section (ptr[r_symndx],
3232
                                           rel->r_addend,
3233
                                           lsect))
3234
        return TRUE;
3235
 
3236
      ptr_linker_section_ptr = &ptr[r_symndx];
3237
    }
3238
 
3239
  /* Allocate space for a pointer in the linker section, and allocate
3240
     a new pointer record from internal memory.  */
3241
  BFD_ASSERT (ptr_linker_section_ptr != NULL);
3242
  amt = sizeof (elf_linker_section_pointers_t);
3243
  linker_section_ptr = bfd_alloc (abfd, amt);
3244
 
3245
  if (!linker_section_ptr)
3246
    return FALSE;
3247
 
3248
  linker_section_ptr->next = *ptr_linker_section_ptr;
3249
  linker_section_ptr->addend = rel->r_addend;
3250
  linker_section_ptr->lsect = lsect;
3251
  *ptr_linker_section_ptr = linker_section_ptr;
3252
 
3253
  linker_section_ptr->offset = lsect->section->size;
3254
  lsect->section->size += 4;
3255
 
3256
#ifdef DEBUG
3257
  fprintf (stderr,
3258
           "Create pointer in linker section %s, offset = %ld, section size = %ld\n",
3259
           lsect->name, (long) linker_section_ptr->offset,
3260
           (long) lsect->section->size);
3261
#endif
3262
 
3263
  return TRUE;
3264
}
3265
 
3266
static struct plt_entry **
3267
update_local_sym_info (bfd *abfd,
3268
                       Elf_Internal_Shdr *symtab_hdr,
3269
                       unsigned long r_symndx,
3270
                       int tls_type)
3271
{
3272
  bfd_signed_vma *local_got_refcounts = elf_local_got_refcounts (abfd);
3273
  struct plt_entry **local_plt;
3274
  char *local_got_tls_masks;
3275
 
3276
  if (local_got_refcounts == NULL)
3277
    {
3278
      bfd_size_type size = symtab_hdr->sh_info;
3279
 
3280
      size *= (sizeof (*local_got_refcounts)
3281
               + sizeof (*local_plt)
3282
               + sizeof (*local_got_tls_masks));
3283
      local_got_refcounts = bfd_zalloc (abfd, size);
3284
      if (local_got_refcounts == NULL)
3285
        return NULL;
3286
      elf_local_got_refcounts (abfd) = local_got_refcounts;
3287
    }
3288
 
3289
  local_plt = (struct plt_entry **) (local_got_refcounts + symtab_hdr->sh_info);
3290
  local_got_tls_masks = (char *) (local_plt + symtab_hdr->sh_info);
3291
  local_got_tls_masks[r_symndx] |= tls_type;
3292
  if (tls_type != PLT_IFUNC)
3293
    local_got_refcounts[r_symndx] += 1;
3294
  return local_plt + r_symndx;
3295
}
3296
 
3297
static bfd_boolean
3298
update_plt_info (bfd *abfd, struct plt_entry **plist,
3299
                 asection *sec, bfd_vma addend)
3300
{
3301
  struct plt_entry *ent;
3302
 
3303
  if (addend < 32768)
3304
    sec = NULL;
3305
  for (ent = *plist; ent != NULL; ent = ent->next)
3306
    if (ent->sec == sec && ent->addend == addend)
3307
      break;
3308
  if (ent == NULL)
3309
    {
3310
      bfd_size_type amt = sizeof (*ent);
3311
      ent = bfd_alloc (abfd, amt);
3312
      if (ent == NULL)
3313
        return FALSE;
3314
      ent->next = *plist;
3315
      ent->sec = sec;
3316
      ent->addend = addend;
3317
      ent->plt.refcount = 0;
3318
      *plist = ent;
3319
    }
3320
  ent->plt.refcount += 1;
3321
  return TRUE;
3322
}
3323
 
3324
static struct plt_entry *
3325
find_plt_ent (struct plt_entry **plist, asection *sec, bfd_vma addend)
3326
{
3327
  struct plt_entry *ent;
3328
 
3329
  if (addend < 32768)
3330
    sec = NULL;
3331
  for (ent = *plist; ent != NULL; ent = ent->next)
3332
    if (ent->sec == sec && ent->addend == addend)
3333
      break;
3334
  return ent;
3335
}
3336
 
3337
static bfd_boolean
3338
is_branch_reloc (enum elf_ppc_reloc_type r_type)
3339
{
3340
  return (r_type == R_PPC_PLTREL24
3341
          || r_type == R_PPC_LOCAL24PC
3342
          || r_type == R_PPC_REL24
3343
          || r_type == R_PPC_REL14
3344
          || r_type == R_PPC_REL14_BRTAKEN
3345
          || r_type == R_PPC_REL14_BRNTAKEN
3346
          || r_type == R_PPC_ADDR24
3347
          || r_type == R_PPC_ADDR14
3348
          || r_type == R_PPC_ADDR14_BRTAKEN
3349
          || r_type == R_PPC_ADDR14_BRNTAKEN);
3350
}
3351
 
3352
static void
3353
bad_shared_reloc (bfd *abfd, enum elf_ppc_reloc_type r_type)
3354
{
3355
  (*_bfd_error_handler)
3356
    (_("%B: relocation %s cannot be used when making a shared object"),
3357
     abfd,
3358
     ppc_elf_howto_table[r_type]->name);
3359
  bfd_set_error (bfd_error_bad_value);
3360
}
3361
 
3362
/* Look through the relocs for a section during the first phase, and
3363
   allocate space in the global offset table or procedure linkage
3364
   table.  */
3365
 
3366
static bfd_boolean
3367
ppc_elf_check_relocs (bfd *abfd,
3368
                      struct bfd_link_info *info,
3369
                      asection *sec,
3370
                      const Elf_Internal_Rela *relocs)
3371
{
3372
  struct ppc_elf_link_hash_table *htab;
3373
  Elf_Internal_Shdr *symtab_hdr;
3374
  struct elf_link_hash_entry **sym_hashes;
3375
  const Elf_Internal_Rela *rel;
3376
  const Elf_Internal_Rela *rel_end;
3377
  asection *got2, *sreloc;
3378
  struct elf_link_hash_entry *tga;
3379
 
3380
  if (info->relocatable)
3381
    return TRUE;
3382
 
3383
  /* Don't do anything special with non-loaded, non-alloced sections.
3384
     In particular, any relocs in such sections should not affect GOT
3385
     and PLT reference counting (ie. we don't allow them to create GOT
3386
     or PLT entries), there's no possibility or desire to optimize TLS
3387
     relocs, and there's not much point in propagating relocs to shared
3388
     libs that the dynamic linker won't relocate.  */
3389
  if ((sec->flags & SEC_ALLOC) == 0)
3390
    return TRUE;
3391
 
3392
#ifdef DEBUG
3393
  _bfd_error_handler ("ppc_elf_check_relocs called for section %A in %B",
3394
                      sec, abfd);
3395
#endif
3396
 
3397
  BFD_ASSERT (is_ppc_elf (abfd));
3398
 
3399
  /* Initialize howto table if not already done.  */
3400
  if (!ppc_elf_howto_table[R_PPC_ADDR32])
3401
    ppc_elf_howto_init ();
3402
 
3403
  htab = ppc_elf_hash_table (info);
3404
  if (htab->glink == NULL)
3405
    {
3406
      if (htab->elf.dynobj == NULL)
3407
        htab->elf.dynobj = abfd;
3408
      if (!ppc_elf_create_glink (htab->elf.dynobj, info))
3409
        return FALSE;
3410
    }
3411
  tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
3412
                              FALSE, FALSE, TRUE);
3413
  symtab_hdr = &elf_symtab_hdr (abfd);
3414
  sym_hashes = elf_sym_hashes (abfd);
3415
  got2 = bfd_get_section_by_name (abfd, ".got2");
3416
  sreloc = NULL;
3417
 
3418
  rel_end = relocs + sec->reloc_count;
3419
  for (rel = relocs; rel < rel_end; rel++)
3420
    {
3421
      unsigned long r_symndx;
3422
      enum elf_ppc_reloc_type r_type;
3423
      struct elf_link_hash_entry *h;
3424
      int tls_type;
3425
 
3426
      r_symndx = ELF32_R_SYM (rel->r_info);
3427
      if (r_symndx < symtab_hdr->sh_info)
3428
        h = NULL;
3429
      else
3430
        {
3431
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3432
          while (h->root.type == bfd_link_hash_indirect
3433
                 || h->root.type == bfd_link_hash_warning)
3434
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
3435
        }
3436
 
3437
      /* If a relocation refers to _GLOBAL_OFFSET_TABLE_, create the .got.
3438
         This shows up in particular in an R_PPC_ADDR32 in the eabi
3439
         startup code.  */
3440
      if (h != NULL
3441
          && htab->got == NULL
3442
          && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
3443
        {
3444
          if (htab->elf.dynobj == NULL)
3445
            htab->elf.dynobj = abfd;
3446
          if (!ppc_elf_create_got (htab->elf.dynobj, info))
3447
            return FALSE;
3448
          BFD_ASSERT (h == htab->elf.hgot);
3449
        }
3450
 
3451
      tls_type = 0;
3452
      r_type = ELF32_R_TYPE (rel->r_info);
3453
      if (h == NULL && !htab->is_vxworks)
3454
        {
3455
          Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
3456
                                                          abfd, r_symndx);
3457
          if (isym == NULL)
3458
            return FALSE;
3459
 
3460
          if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
3461
              && (!info->shared
3462
                  || is_branch_reloc (r_type)))
3463
            {
3464
              struct plt_entry **ifunc;
3465
              bfd_vma addend;
3466
 
3467
              ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
3468
                                             PLT_IFUNC);
3469
              if (ifunc == NULL)
3470
                return FALSE;
3471
 
3472
              /* STT_GNU_IFUNC symbols must have a PLT entry;
3473
                 In a non-pie executable even when there are
3474
                 no plt calls.  */
3475
              addend = 0;
3476
              if (r_type == R_PPC_PLTREL24)
3477
                {
3478
                  ppc_elf_tdata (abfd)->makes_plt_call = 1;
3479
                  if (info->shared)
3480
                    addend = rel->r_addend;
3481
                }
3482
              if (!update_plt_info (abfd, ifunc, got2, addend))
3483
                return FALSE;
3484
            }
3485
        }
3486
 
3487
      if (!htab->is_vxworks
3488
          && is_branch_reloc (r_type)
3489
          && h != NULL
3490
          && h == tga)
3491
        {
3492
          if (rel != relocs
3493
              && (ELF32_R_TYPE (rel[-1].r_info) == R_PPC_TLSGD
3494
                  || ELF32_R_TYPE (rel[-1].r_info) == R_PPC_TLSLD))
3495
            /* We have a new-style __tls_get_addr call with a marker
3496
               reloc.  */
3497
            ;
3498
          else
3499
            /* Mark this section as having an old-style call.  */
3500
            sec->has_tls_get_addr_call = 1;
3501
        }
3502
 
3503
      switch (r_type)
3504
        {
3505
        case R_PPC_TLSGD:
3506
        case R_PPC_TLSLD:
3507
          /* These special tls relocs tie a call to __tls_get_addr with
3508
             its parameter symbol.  */
3509
          break;
3510
 
3511
        case R_PPC_GOT_TLSLD16:
3512
        case R_PPC_GOT_TLSLD16_LO:
3513
        case R_PPC_GOT_TLSLD16_HI:
3514
        case R_PPC_GOT_TLSLD16_HA:
3515
          tls_type = TLS_TLS | TLS_LD;
3516
          goto dogottls;
3517
 
3518
        case R_PPC_GOT_TLSGD16:
3519
        case R_PPC_GOT_TLSGD16_LO:
3520
        case R_PPC_GOT_TLSGD16_HI:
3521
        case R_PPC_GOT_TLSGD16_HA:
3522
          tls_type = TLS_TLS | TLS_GD;
3523
          goto dogottls;
3524
 
3525
        case R_PPC_GOT_TPREL16:
3526
        case R_PPC_GOT_TPREL16_LO:
3527
        case R_PPC_GOT_TPREL16_HI:
3528
        case R_PPC_GOT_TPREL16_HA:
3529
          if (!info->executable)
3530
            info->flags |= DF_STATIC_TLS;
3531
          tls_type = TLS_TLS | TLS_TPREL;
3532
          goto dogottls;
3533
 
3534
        case R_PPC_GOT_DTPREL16:
3535
        case R_PPC_GOT_DTPREL16_LO:
3536
        case R_PPC_GOT_DTPREL16_HI:
3537
        case R_PPC_GOT_DTPREL16_HA:
3538
          tls_type = TLS_TLS | TLS_DTPREL;
3539
        dogottls:
3540
          sec->has_tls_reloc = 1;
3541
          /* Fall thru */
3542
 
3543
          /* GOT16 relocations */
3544
        case R_PPC_GOT16:
3545
        case R_PPC_GOT16_LO:
3546
        case R_PPC_GOT16_HI:
3547
        case R_PPC_GOT16_HA:
3548
          /* This symbol requires a global offset table entry.  */
3549
          if (htab->got == NULL)
3550
            {
3551
              if (htab->elf.dynobj == NULL)
3552
                htab->elf.dynobj = abfd;
3553
              if (!ppc_elf_create_got (htab->elf.dynobj, info))
3554
                return FALSE;
3555
            }
3556
          if (h != NULL)
3557
            {
3558
              h->got.refcount += 1;
3559
              ppc_elf_hash_entry (h)->tls_mask |= tls_type;
3560
            }
3561
          else
3562
            /* This is a global offset table entry for a local symbol.  */
3563
            if (!update_local_sym_info (abfd, symtab_hdr, r_symndx, tls_type))
3564
              return FALSE;
3565
 
3566
          /* We may also need a plt entry if the symbol turns out to be
3567
             an ifunc.  */
3568
          if (h != NULL && !info->shared)
3569
            {
3570
              if (!update_plt_info (abfd, &h->plt.plist, NULL, 0))
3571
                return FALSE;
3572
            }
3573
          break;
3574
 
3575
          /* Indirect .sdata relocation.  */
3576
        case R_PPC_EMB_SDAI16:
3577
          if (info->shared)
3578
            {
3579
              bad_shared_reloc (abfd, r_type);
3580
              return FALSE;
3581
            }
3582
          if (htab->sdata[0].section == NULL
3583
              && !ppc_elf_create_linker_section (abfd, info, 0,
3584
                                                 &htab->sdata[0]))
3585
            return FALSE;
3586
          if (!elf_create_pointer_linker_section (abfd, &htab->sdata[0],
3587
                                                  h, rel))
3588
            return FALSE;
3589
          if (h != NULL)
3590
            {
3591
              ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
3592
              h->non_got_ref = TRUE;
3593
            }
3594
          break;
3595
 
3596
          /* Indirect .sdata2 relocation.  */
3597
        case R_PPC_EMB_SDA2I16:
3598
          if (info->shared)
3599
            {
3600
              bad_shared_reloc (abfd, r_type);
3601
              return FALSE;
3602
            }
3603
          if (htab->sdata[1].section == NULL
3604
              && !ppc_elf_create_linker_section (abfd, info, SEC_READONLY,
3605
                                                 &htab->sdata[1]))
3606
            return FALSE;
3607
          if (!elf_create_pointer_linker_section (abfd, &htab->sdata[1],
3608
                                                  h, rel))
3609
            return FALSE;
3610
          if (h != NULL)
3611
            {
3612
              ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
3613
              h->non_got_ref = TRUE;
3614
            }
3615
          break;
3616
 
3617
        case R_PPC_SDAREL16:
3618
          if (htab->sdata[0].sym == NULL
3619
              && !create_sdata_sym (info, &htab->sdata[0]))
3620
            return FALSE;
3621
          if (h != NULL)
3622
            {
3623
              ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
3624
              h->non_got_ref = TRUE;
3625
            }
3626
          break;
3627
 
3628
        case R_PPC_EMB_SDA2REL:
3629
          if (info->shared)
3630
            {
3631
              bad_shared_reloc (abfd, r_type);
3632
              return FALSE;
3633
            }
3634
          if (htab->sdata[1].sym == NULL
3635
              && !create_sdata_sym (info, &htab->sdata[1]))
3636
            return FALSE;
3637
          if (h != NULL)
3638
            {
3639
              ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
3640
              h->non_got_ref = TRUE;
3641
            }
3642
          break;
3643
 
3644
        case R_PPC_EMB_SDA21:
3645
        case R_PPC_EMB_RELSDA:
3646
          if (info->shared)
3647
            {
3648
              bad_shared_reloc (abfd, r_type);
3649
              return FALSE;
3650
            }
3651
          if (htab->sdata[0].sym == NULL
3652
              && !create_sdata_sym (info, &htab->sdata[0]))
3653
            return FALSE;
3654
          if (htab->sdata[1].sym == NULL
3655
              && !create_sdata_sym (info, &htab->sdata[1]))
3656
            return FALSE;
3657
          if (h != NULL)
3658
            {
3659
              ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
3660
              h->non_got_ref = TRUE;
3661
            }
3662
          break;
3663
 
3664
        case R_PPC_EMB_NADDR32:
3665
        case R_PPC_EMB_NADDR16:
3666
        case R_PPC_EMB_NADDR16_LO:
3667
        case R_PPC_EMB_NADDR16_HI:
3668
        case R_PPC_EMB_NADDR16_HA:
3669
          if (info->shared)
3670
            {
3671
              bad_shared_reloc (abfd, r_type);
3672
              return FALSE;
3673
            }
3674
          if (h != NULL)
3675
            h->non_got_ref = TRUE;
3676
          break;
3677
 
3678
        case R_PPC_PLTREL24:
3679
          if (h == NULL)
3680
            break;
3681
          /* Fall through */
3682
        case R_PPC_PLT32:
3683
        case R_PPC_PLTREL32:
3684
        case R_PPC_PLT16_LO:
3685
        case R_PPC_PLT16_HI:
3686
        case R_PPC_PLT16_HA:
3687
#ifdef DEBUG
3688
          fprintf (stderr, "Reloc requires a PLT entry\n");
3689
#endif
3690
          /* This symbol requires a procedure linkage table entry.  We
3691
             actually build the entry in finish_dynamic_symbol,
3692
             because this might be a case of linking PIC code without
3693
             linking in any dynamic objects, in which case we don't
3694
             need to generate a procedure linkage table after all.  */
3695
 
3696
          if (h == NULL)
3697
            {
3698
              /* It does not make sense to have a procedure linkage
3699
                 table entry for a local symbol.  */
3700 161 khays
              info->callbacks->einfo (_("%P: %H: %s reloc against local symbol\n"),
3701 14 khays
                                      abfd, sec, rel->r_offset,
3702
                                      ppc_elf_howto_table[r_type]->name);
3703
              bfd_set_error (bfd_error_bad_value);
3704
              return FALSE;
3705
            }
3706
          else
3707
            {
3708
              bfd_vma addend = 0;
3709
 
3710
              if (r_type == R_PPC_PLTREL24)
3711
                {
3712
                  ppc_elf_tdata (abfd)->makes_plt_call = 1;
3713
                  if (info->shared)
3714
                    addend = rel->r_addend;
3715
                }
3716
              h->needs_plt = 1;
3717
              if (!update_plt_info (abfd, &h->plt.plist, got2, addend))
3718
                return FALSE;
3719
            }
3720
          break;
3721
 
3722
          /* The following relocations don't need to propagate the
3723
             relocation if linking a shared object since they are
3724
             section relative.  */
3725
        case R_PPC_SECTOFF:
3726
        case R_PPC_SECTOFF_LO:
3727
        case R_PPC_SECTOFF_HI:
3728
        case R_PPC_SECTOFF_HA:
3729
        case R_PPC_DTPREL16:
3730
        case R_PPC_DTPREL16_LO:
3731
        case R_PPC_DTPREL16_HI:
3732
        case R_PPC_DTPREL16_HA:
3733
        case R_PPC_TOC16:
3734
          break;
3735
 
3736
        case R_PPC_REL16:
3737
        case R_PPC_REL16_LO:
3738
        case R_PPC_REL16_HI:
3739
        case R_PPC_REL16_HA:
3740
          ppc_elf_tdata (abfd)->has_rel16 = 1;
3741
          break;
3742
 
3743
          /* These are just markers.  */
3744
        case R_PPC_TLS:
3745
        case R_PPC_EMB_MRKREF:
3746
        case R_PPC_NONE:
3747
        case R_PPC_max:
3748
        case R_PPC_RELAX:
3749
        case R_PPC_RELAX_PLT:
3750
        case R_PPC_RELAX_PLTREL24:
3751
          break;
3752
 
3753
          /* These should only appear in dynamic objects.  */
3754
        case R_PPC_COPY:
3755
        case R_PPC_GLOB_DAT:
3756
        case R_PPC_JMP_SLOT:
3757
        case R_PPC_RELATIVE:
3758
        case R_PPC_IRELATIVE:
3759
          break;
3760
 
3761
          /* These aren't handled yet.  We'll report an error later.  */
3762
        case R_PPC_ADDR30:
3763
        case R_PPC_EMB_RELSEC16:
3764
        case R_PPC_EMB_RELST_LO:
3765
        case R_PPC_EMB_RELST_HI:
3766
        case R_PPC_EMB_RELST_HA:
3767
        case R_PPC_EMB_BIT_FLD:
3768
          break;
3769
 
3770
          /* This refers only to functions defined in the shared library.  */
3771
        case R_PPC_LOCAL24PC:
3772
          if (h != NULL && h == htab->elf.hgot && htab->plt_type == PLT_UNSET)
3773
            {
3774
              htab->plt_type = PLT_OLD;
3775
              htab->old_bfd = abfd;
3776
            }
3777
          break;
3778
 
3779
          /* This relocation describes the C++ object vtable hierarchy.
3780
             Reconstruct it for later use during GC.  */
3781
        case R_PPC_GNU_VTINHERIT:
3782
          if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
3783
            return FALSE;
3784
          break;
3785
 
3786
          /* This relocation describes which C++ vtable entries are actually
3787
             used.  Record for later use during GC.  */
3788
        case R_PPC_GNU_VTENTRY:
3789
          BFD_ASSERT (h != NULL);
3790
          if (h != NULL
3791
              && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
3792
            return FALSE;
3793
          break;
3794
 
3795
          /* We shouldn't really be seeing these.  */
3796
        case R_PPC_TPREL32:
3797
        case R_PPC_TPREL16:
3798
        case R_PPC_TPREL16_LO:
3799
        case R_PPC_TPREL16_HI:
3800
        case R_PPC_TPREL16_HA:
3801
          if (!info->executable)
3802
            info->flags |= DF_STATIC_TLS;
3803
          goto dodyn;
3804
 
3805
          /* Nor these.  */
3806
        case R_PPC_DTPMOD32:
3807
        case R_PPC_DTPREL32:
3808
          goto dodyn;
3809
 
3810
        case R_PPC_REL32:
3811
          if (h == NULL
3812
              && got2 != NULL
3813
              && (sec->flags & SEC_CODE) != 0
3814
              && info->shared
3815
              && htab->plt_type == PLT_UNSET)
3816
            {
3817
              /* Old -fPIC gcc code has .long LCTOC1-LCFx just before
3818
                 the start of a function, which assembles to a REL32
3819
                 reference to .got2.  If we detect one of these, then
3820
                 force the old PLT layout because the linker cannot
3821
                 reliably deduce the GOT pointer value needed for
3822
                 PLT call stubs.  */
3823
              asection *s;
3824
              Elf_Internal_Sym *isym;
3825
 
3826
              isym = bfd_sym_from_r_symndx (&htab->sym_cache,
3827
                                            abfd, r_symndx);
3828
              if (isym == NULL)
3829
                return FALSE;
3830
 
3831
              s = bfd_section_from_elf_index (abfd, isym->st_shndx);
3832
              if (s == got2)
3833
                {
3834
                  htab->plt_type = PLT_OLD;
3835
                  htab->old_bfd = abfd;
3836
                }
3837
            }
3838
          if (h == NULL || h == htab->elf.hgot)
3839
            break;
3840
          /* fall through */
3841
 
3842
        case R_PPC_ADDR32:
3843
        case R_PPC_ADDR16:
3844
        case R_PPC_ADDR16_LO:
3845
        case R_PPC_ADDR16_HI:
3846
        case R_PPC_ADDR16_HA:
3847
        case R_PPC_UADDR32:
3848
        case R_PPC_UADDR16:
3849
          if (h != NULL && !info->shared)
3850
            {
3851
              /* We may need a plt entry if the symbol turns out to be
3852
                 a function defined in a dynamic object.  */
3853
              if (!update_plt_info (abfd, &h->plt.plist, NULL, 0))
3854
                return FALSE;
3855
 
3856
              /* We may need a copy reloc too.  */
3857
              h->non_got_ref = 1;
3858
              h->pointer_equality_needed = 1;
3859
            }
3860
          goto dodyn;
3861
 
3862
        case R_PPC_REL24:
3863
        case R_PPC_REL14:
3864
        case R_PPC_REL14_BRTAKEN:
3865
        case R_PPC_REL14_BRNTAKEN:
3866
          if (h == NULL)
3867
            break;
3868
          if (h == htab->elf.hgot)
3869
            {
3870
              if (htab->plt_type == PLT_UNSET)
3871
                {
3872
                  htab->plt_type = PLT_OLD;
3873
                  htab->old_bfd = abfd;
3874
                }
3875
              break;
3876
            }
3877
          /* fall through */
3878
 
3879
        case R_PPC_ADDR24:
3880
        case R_PPC_ADDR14:
3881
        case R_PPC_ADDR14_BRTAKEN:
3882
        case R_PPC_ADDR14_BRNTAKEN:
3883
          if (h != NULL && !info->shared)
3884
            {
3885
              /* We may need a plt entry if the symbol turns out to be
3886
                 a function defined in a dynamic object.  */
3887
              h->needs_plt = 1;
3888
              if (!update_plt_info (abfd, &h->plt.plist, NULL, 0))
3889
                return FALSE;
3890
              break;
3891
            }
3892
 
3893
        dodyn:
3894
          /* If we are creating a shared library, and this is a reloc
3895
             against a global symbol, or a non PC relative reloc
3896
             against a local symbol, then we need to copy the reloc
3897
             into the shared library.  However, if we are linking with
3898
             -Bsymbolic, we do not need to copy a reloc against a
3899
             global symbol which is defined in an object we are
3900
             including in the link (i.e., DEF_REGULAR is set).  At
3901
             this point we have not seen all the input files, so it is
3902
             possible that DEF_REGULAR is not set now but will be set
3903
             later (it is never cleared).  In case of a weak definition,
3904
             DEF_REGULAR may be cleared later by a strong definition in
3905
             a shared library.  We account for that possibility below by
3906
             storing information in the dyn_relocs field of the hash
3907
             table entry.  A similar situation occurs when creating
3908
             shared libraries and symbol visibility changes render the
3909
             symbol local.
3910
 
3911
             If on the other hand, we are creating an executable, we
3912
             may need to keep relocations for symbols satisfied by a
3913
             dynamic library if we manage to avoid copy relocs for the
3914
             symbol.  */
3915
          if ((info->shared
3916
               && (must_be_dyn_reloc (info, r_type)
3917
                   || (h != NULL
3918
                       && (! info->symbolic
3919
                           || h->root.type == bfd_link_hash_defweak
3920
                           || !h->def_regular))))
3921
              || (ELIMINATE_COPY_RELOCS
3922
                  && !info->shared
3923
                  && h != NULL
3924
                  && (h->root.type == bfd_link_hash_defweak
3925
                      || !h->def_regular)))
3926
            {
3927
              struct elf_dyn_relocs *p;
3928
              struct elf_dyn_relocs **rel_head;
3929
 
3930
#ifdef DEBUG
3931
              fprintf (stderr,
3932
                       "ppc_elf_check_relocs needs to "
3933
                       "create relocation for %s\n",
3934
                       (h && h->root.root.string
3935
                        ? h->root.root.string : "<unknown>"));
3936
#endif
3937
              if (sreloc == NULL)
3938
                {
3939
                  if (htab->elf.dynobj == NULL)
3940
                    htab->elf.dynobj = abfd;
3941
 
3942
                  sreloc = _bfd_elf_make_dynamic_reloc_section
3943
                    (sec, htab->elf.dynobj, 2, abfd, /*rela?*/ TRUE);
3944
 
3945
                  if (sreloc == NULL)
3946
                    return FALSE;
3947
                }
3948
 
3949
              /* If this is a global symbol, we count the number of
3950
                 relocations we need for this symbol.  */
3951
              if (h != NULL)
3952
                {
3953
                  rel_head = &ppc_elf_hash_entry (h)->dyn_relocs;
3954
                }
3955
              else
3956
                {
3957
                  /* Track dynamic relocs needed for local syms too.
3958
                     We really need local syms available to do this
3959
                     easily.  Oh well.  */
3960
                  asection *s;
3961
                  void *vpp;
3962
                  Elf_Internal_Sym *isym;
3963
 
3964
                  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
3965
                                                abfd, r_symndx);
3966
                  if (isym == NULL)
3967
                    return FALSE;
3968
 
3969
                  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
3970
                  if (s == NULL)
3971
                    s = sec;
3972
 
3973
                  vpp = &elf_section_data (s)->local_dynrel;
3974
                  rel_head = (struct elf_dyn_relocs **) vpp;
3975
                }
3976
 
3977
              p = *rel_head;
3978
              if (p == NULL || p->sec != sec)
3979
                {
3980
                  p = bfd_alloc (htab->elf.dynobj, sizeof *p);
3981
                  if (p == NULL)
3982
                    return FALSE;
3983
                  p->next = *rel_head;
3984
                  *rel_head = p;
3985
                  p->sec = sec;
3986
                  p->count = 0;
3987
                  p->pc_count = 0;
3988
                }
3989
 
3990
              p->count += 1;
3991
              if (!must_be_dyn_reloc (info, r_type))
3992
                p->pc_count += 1;
3993
            }
3994
 
3995
          break;
3996
        }
3997
    }
3998
 
3999
  return TRUE;
4000
}
4001
 
4002
 
4003
/* Merge object attributes from IBFD into OBFD.  Raise an error if
4004
   there are conflicting attributes.  */
4005
static bfd_boolean
4006
ppc_elf_merge_obj_attributes (bfd *ibfd, bfd *obfd)
4007
{
4008
  obj_attribute *in_attr, *in_attrs;
4009
  obj_attribute *out_attr, *out_attrs;
4010
 
4011
  if (!elf_known_obj_attributes_proc (obfd)[0].i)
4012
    {
4013
      /* This is the first object.  Copy the attributes.  */
4014
      _bfd_elf_copy_obj_attributes (ibfd, obfd);
4015
 
4016
      /* Use the Tag_null value to indicate the attributes have been
4017
         initialized.  */
4018
      elf_known_obj_attributes_proc (obfd)[0].i = 1;
4019
 
4020
      return TRUE;
4021
    }
4022
 
4023
  in_attrs = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
4024
  out_attrs = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
4025
 
4026
  /* Check for conflicting Tag_GNU_Power_ABI_FP attributes and merge
4027
     non-conflicting ones.  */
4028
  in_attr = &in_attrs[Tag_GNU_Power_ABI_FP];
4029
  out_attr = &out_attrs[Tag_GNU_Power_ABI_FP];
4030
  if (in_attr->i != out_attr->i)
4031
    {
4032
      out_attr->type = 1;
4033
      if (out_attr->i == 0)
4034
        out_attr->i = in_attr->i;
4035
      else if (in_attr->i == 0)
4036
        ;
4037
      else if (out_attr->i == 1 && in_attr->i == 2)
4038
        _bfd_error_handler
4039
          (_("Warning: %B uses hard float, %B uses soft float"), obfd, ibfd);
4040
      else if (out_attr->i == 1 && in_attr->i == 3)
4041
        _bfd_error_handler
4042
          (_("Warning: %B uses double-precision hard float, %B uses single-precision hard float"),
4043
          obfd, ibfd);
4044
      else if (out_attr->i == 3 && in_attr->i == 1)
4045
        _bfd_error_handler
4046
          (_("Warning: %B uses double-precision hard float, %B uses single-precision hard float"),
4047
          ibfd, obfd);
4048
      else if (out_attr->i == 3 && in_attr->i == 2)
4049
        _bfd_error_handler
4050
          (_("Warning: %B uses soft float, %B uses single-precision hard float"),
4051
          ibfd, obfd);
4052
      else if (out_attr->i == 2 && (in_attr->i == 1 || in_attr->i == 3))
4053
        _bfd_error_handler
4054
          (_("Warning: %B uses hard float, %B uses soft float"), ibfd, obfd);
4055
      else if (in_attr->i > 3)
4056
        _bfd_error_handler
4057
          (_("Warning: %B uses unknown floating point ABI %d"), ibfd,
4058
           in_attr->i);
4059
      else
4060
        _bfd_error_handler
4061
          (_("Warning: %B uses unknown floating point ABI %d"), obfd,
4062
           out_attr->i);
4063
    }
4064
 
4065
  /* Check for conflicting Tag_GNU_Power_ABI_Vector attributes and
4066
     merge non-conflicting ones.  */
4067
  in_attr = &in_attrs[Tag_GNU_Power_ABI_Vector];
4068
  out_attr = &out_attrs[Tag_GNU_Power_ABI_Vector];
4069
  if (in_attr->i != out_attr->i)
4070
    {
4071
      const char *in_abi = NULL, *out_abi = NULL;
4072
 
4073
      switch (in_attr->i)
4074
        {
4075
        case 1: in_abi = "generic"; break;
4076
        case 2: in_abi = "AltiVec"; break;
4077
        case 3: in_abi = "SPE"; break;
4078
        }
4079
 
4080
      switch (out_attr->i)
4081
        {
4082
        case 1: out_abi = "generic"; break;
4083
        case 2: out_abi = "AltiVec"; break;
4084
        case 3: out_abi = "SPE"; break;
4085
        }
4086
 
4087
      out_attr->type = 1;
4088
      if (out_attr->i == 0)
4089
        out_attr->i = in_attr->i;
4090
      else if (in_attr->i == 0)
4091
        ;
4092
      /* For now, allow generic to transition to AltiVec or SPE
4093
         without a warning.  If GCC marked files with their stack
4094
         alignment and used don't-care markings for files which are
4095
         not affected by the vector ABI, we could warn about this
4096
         case too.  */
4097
      else if (out_attr->i == 1)
4098
        out_attr->i = in_attr->i;
4099
      else if (in_attr->i == 1)
4100
        ;
4101
      else if (in_abi == NULL)
4102
        _bfd_error_handler
4103
          (_("Warning: %B uses unknown vector ABI %d"), ibfd,
4104
           in_attr->i);
4105
      else if (out_abi == NULL)
4106
        _bfd_error_handler
4107
          (_("Warning: %B uses unknown vector ABI %d"), obfd,
4108
           in_attr->i);
4109
      else
4110
        _bfd_error_handler
4111
          (_("Warning: %B uses vector ABI \"%s\", %B uses \"%s\""),
4112
           ibfd, obfd, in_abi, out_abi);
4113
    }
4114
 
4115
  /* Check for conflicting Tag_GNU_Power_ABI_Struct_Return attributes
4116
     and merge non-conflicting ones.  */
4117
  in_attr = &in_attrs[Tag_GNU_Power_ABI_Struct_Return];
4118
  out_attr = &out_attrs[Tag_GNU_Power_ABI_Struct_Return];
4119
  if (in_attr->i != out_attr->i)
4120
    {
4121
      out_attr->type = 1;
4122
      if (out_attr->i == 0)
4123
       out_attr->i = in_attr->i;
4124
      else if (in_attr->i == 0)
4125
       ;
4126
      else if (out_attr->i == 1 && in_attr->i == 2)
4127
       _bfd_error_handler
4128
         (_("Warning: %B uses r3/r4 for small structure returns, %B uses memory"), obfd, ibfd);
4129
      else if (out_attr->i == 2 && in_attr->i == 1)
4130
       _bfd_error_handler
4131
         (_("Warning: %B uses r3/r4 for small structure returns, %B uses memory"), ibfd, obfd);
4132
      else if (in_attr->i > 2)
4133
       _bfd_error_handler
4134
         (_("Warning: %B uses unknown small structure return convention %d"), ibfd,
4135
          in_attr->i);
4136
      else
4137
       _bfd_error_handler
4138
         (_("Warning: %B uses unknown small structure return convention %d"), obfd,
4139
          out_attr->i);
4140
    }
4141
 
4142
  /* Merge Tag_compatibility attributes and any common GNU ones.  */
4143
  _bfd_elf_merge_object_attributes (ibfd, obfd);
4144
 
4145
  return TRUE;
4146
}
4147
 
4148
/* Merge backend specific data from an object file to the output
4149
   object file when linking.  */
4150
 
4151
static bfd_boolean
4152
ppc_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
4153
{
4154
  flagword old_flags;
4155
  flagword new_flags;
4156
  bfd_boolean error;
4157
 
4158
  if (!is_ppc_elf (ibfd) || !is_ppc_elf (obfd))
4159
    return TRUE;
4160
 
4161
  /* Check if we have the same endianness.  */
4162
  if (! _bfd_generic_verify_endian_match (ibfd, obfd))
4163
    return FALSE;
4164
 
4165
  if (!ppc_elf_merge_obj_attributes (ibfd, obfd))
4166
    return FALSE;
4167
 
4168
  new_flags = elf_elfheader (ibfd)->e_flags;
4169
  old_flags = elf_elfheader (obfd)->e_flags;
4170
  if (!elf_flags_init (obfd))
4171
    {
4172
      /* First call, no flags set.  */
4173
      elf_flags_init (obfd) = TRUE;
4174
      elf_elfheader (obfd)->e_flags = new_flags;
4175
    }
4176
 
4177
  /* Compatible flags are ok.  */
4178
  else if (new_flags == old_flags)
4179
    ;
4180
 
4181
  /* Incompatible flags.  */
4182
  else
4183
    {
4184
      /* Warn about -mrelocatable mismatch.  Allow -mrelocatable-lib
4185
         to be linked with either.  */
4186
      error = FALSE;
4187
      if ((new_flags & EF_PPC_RELOCATABLE) != 0
4188
          && (old_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0)
4189
        {
4190
          error = TRUE;
4191
          (*_bfd_error_handler)
4192
            (_("%B: compiled with -mrelocatable and linked with "
4193
               "modules compiled normally"), ibfd);
4194
        }
4195
      else if ((new_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0
4196
               && (old_flags & EF_PPC_RELOCATABLE) != 0)
4197
        {
4198
          error = TRUE;
4199
          (*_bfd_error_handler)
4200
            (_("%B: compiled normally and linked with "
4201
               "modules compiled with -mrelocatable"), ibfd);
4202
        }
4203
 
4204
      /* The output is -mrelocatable-lib iff both the input files are.  */
4205
      if (! (new_flags & EF_PPC_RELOCATABLE_LIB))
4206
        elf_elfheader (obfd)->e_flags &= ~EF_PPC_RELOCATABLE_LIB;
4207
 
4208
      /* The output is -mrelocatable iff it can't be -mrelocatable-lib,
4209
         but each input file is either -mrelocatable or -mrelocatable-lib.  */
4210
      if (! (elf_elfheader (obfd)->e_flags & EF_PPC_RELOCATABLE_LIB)
4211
          && (new_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE))
4212
          && (old_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE)))
4213
        elf_elfheader (obfd)->e_flags |= EF_PPC_RELOCATABLE;
4214
 
4215
      /* Do not warn about eabi vs. V.4 mismatch, just or in the bit if
4216
         any module uses it.  */
4217
      elf_elfheader (obfd)->e_flags |= (new_flags & EF_PPC_EMB);
4218
 
4219
      new_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
4220
      old_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
4221
 
4222
      /* Warn about any other mismatches.  */
4223
      if (new_flags != old_flags)
4224
        {
4225
          error = TRUE;
4226
          (*_bfd_error_handler)
4227
            (_("%B: uses different e_flags (0x%lx) fields "
4228
               "than previous modules (0x%lx)"),
4229
             ibfd, (long) new_flags, (long) old_flags);
4230
        }
4231
 
4232
      if (error)
4233
        {
4234
          bfd_set_error (bfd_error_bad_value);
4235
          return FALSE;
4236
        }
4237
    }
4238
 
4239
  return TRUE;
4240
}
4241
 
4242
/* Choose which PLT scheme to use, and set .plt flags appropriately.
4243
   Returns -1 on error, 0 for old PLT, 1 for new PLT.  */
4244
int
4245
ppc_elf_select_plt_layout (bfd *output_bfd ATTRIBUTE_UNUSED,
4246
                           struct bfd_link_info *info,
4247
                           enum ppc_elf_plt_type plt_style,
4248
                           int emit_stub_syms)
4249
{
4250
  struct ppc_elf_link_hash_table *htab;
4251
  flagword flags;
4252
 
4253
  htab = ppc_elf_hash_table (info);
4254
 
4255
  htab->emit_stub_syms = emit_stub_syms;
4256
 
4257
  if (htab->plt_type == PLT_UNSET)
4258
    {
4259 161 khays
      struct elf_link_hash_entry *h;
4260
 
4261 14 khays
      if (plt_style == PLT_OLD)
4262
        htab->plt_type = PLT_OLD;
4263 161 khays
      else if (info->shared
4264
               && htab->elf.dynamic_sections_created
4265
               && (h = elf_link_hash_lookup (&htab->elf, "_mcount",
4266
                                             FALSE, FALSE, TRUE)) != NULL
4267
               && (h->type == STT_FUNC
4268
                   || h->needs_plt)
4269
               && h->ref_regular
4270
               && !(SYMBOL_CALLS_LOCAL (info, h)
4271
                    || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
4272
                        && h->root.type == bfd_link_hash_undefweak)))
4273
        {
4274
          /* Profiling of shared libs (and pies) is not supported with
4275
             secure plt, because ppc32 does profiling before a
4276
             function prologue and a secure plt pic call stubs needs
4277
             r30 to be set up.  */
4278
          htab->plt_type = PLT_OLD;
4279
        }
4280 14 khays
      else
4281
        {
4282
          bfd *ibfd;
4283
          enum ppc_elf_plt_type plt_type = plt_style;
4284
 
4285
          /* Look through the reloc flags left by ppc_elf_check_relocs.
4286
             Use the old style bss plt if a file makes plt calls
4287
             without using the new relocs, and if ld isn't given
4288
             --secure-plt and we never see REL16 relocs.  */
4289
          if (plt_type == PLT_UNSET)
4290
            plt_type = PLT_OLD;
4291
          for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link_next)
4292
            if (is_ppc_elf (ibfd))
4293
              {
4294
                if (ppc_elf_tdata (ibfd)->has_rel16)
4295
                  plt_type = PLT_NEW;
4296
                else if (ppc_elf_tdata (ibfd)->makes_plt_call)
4297
                  {
4298
                    plt_type = PLT_OLD;
4299
                    htab->old_bfd = ibfd;
4300
                    break;
4301
                  }
4302
              }
4303
          htab->plt_type = plt_type;
4304
        }
4305
    }
4306
  if (htab->plt_type == PLT_OLD && plt_style == PLT_NEW)
4307 161 khays
    {
4308
      if (htab->old_bfd != NULL)
4309
        info->callbacks->einfo (_("%P: bss-plt forced due to %B\n"),
4310
                                htab->old_bfd);
4311
      else
4312
        info->callbacks->einfo (_("%P: bss-plt forced by profiling\n"));
4313
    }
4314 14 khays
 
4315
  BFD_ASSERT (htab->plt_type != PLT_VXWORKS);
4316
 
4317
  if (htab->plt_type == PLT_NEW)
4318
    {
4319
      flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
4320
               | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4321
 
4322
      /* The new PLT is a loaded section.  */
4323
      if (htab->plt != NULL
4324
          && !bfd_set_section_flags (htab->elf.dynobj, htab->plt, flags))
4325
        return -1;
4326
 
4327
      /* The new GOT is not executable.  */
4328
      if (htab->got != NULL
4329
          && !bfd_set_section_flags (htab->elf.dynobj, htab->got, flags))
4330
        return -1;
4331
    }
4332
  else
4333
    {
4334
      /* Stop an unused .glink section from affecting .text alignment.  */
4335
      if (htab->glink != NULL
4336
          && !bfd_set_section_alignment (htab->elf.dynobj, htab->glink, 0))
4337
        return -1;
4338
    }
4339
  return htab->plt_type == PLT_NEW;
4340
}
4341
 
4342
/* Return the section that should be marked against GC for a given
4343
   relocation.  */
4344
 
4345
static asection *
4346
ppc_elf_gc_mark_hook (asection *sec,
4347
                      struct bfd_link_info *info,
4348
                      Elf_Internal_Rela *rel,
4349
                      struct elf_link_hash_entry *h,
4350
                      Elf_Internal_Sym *sym)
4351
{
4352
  if (h != NULL)
4353
    switch (ELF32_R_TYPE (rel->r_info))
4354
      {
4355
      case R_PPC_GNU_VTINHERIT:
4356
      case R_PPC_GNU_VTENTRY:
4357
        return NULL;
4358
      }
4359
 
4360
  return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
4361
}
4362
 
4363
/* Update the got, plt and dynamic reloc reference counts for the
4364
   section being removed.  */
4365
 
4366
static bfd_boolean
4367
ppc_elf_gc_sweep_hook (bfd *abfd,
4368
                       struct bfd_link_info *info,
4369
                       asection *sec,
4370
                       const Elf_Internal_Rela *relocs)
4371
{
4372
  struct ppc_elf_link_hash_table *htab;
4373
  Elf_Internal_Shdr *symtab_hdr;
4374
  struct elf_link_hash_entry **sym_hashes;
4375
  bfd_signed_vma *local_got_refcounts;
4376
  const Elf_Internal_Rela *rel, *relend;
4377
  asection *got2;
4378
 
4379
  if (info->relocatable)
4380
    return TRUE;
4381
 
4382
  if ((sec->flags & SEC_ALLOC) == 0)
4383
    return TRUE;
4384
 
4385
  elf_section_data (sec)->local_dynrel = NULL;
4386
 
4387
  htab = ppc_elf_hash_table (info);
4388
  symtab_hdr = &elf_symtab_hdr (abfd);
4389
  sym_hashes = elf_sym_hashes (abfd);
4390
  local_got_refcounts = elf_local_got_refcounts (abfd);
4391
  got2 = bfd_get_section_by_name (abfd, ".got2");
4392
 
4393
  relend = relocs + sec->reloc_count;
4394
  for (rel = relocs; rel < relend; rel++)
4395
    {
4396
      unsigned long r_symndx;
4397
      enum elf_ppc_reloc_type r_type;
4398
      struct elf_link_hash_entry *h = NULL;
4399
 
4400
      r_symndx = ELF32_R_SYM (rel->r_info);
4401
      if (r_symndx >= symtab_hdr->sh_info)
4402
        {
4403
          struct elf_dyn_relocs **pp, *p;
4404
          struct ppc_elf_link_hash_entry *eh;
4405
 
4406
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4407
          while (h->root.type == bfd_link_hash_indirect
4408
                 || h->root.type == bfd_link_hash_warning)
4409
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
4410
          eh = (struct ppc_elf_link_hash_entry *) h;
4411
 
4412
          for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
4413
            if (p->sec == sec)
4414
              {
4415
                /* Everything must go for SEC.  */
4416
                *pp = p->next;
4417
                break;
4418
              }
4419
        }
4420
 
4421
      r_type = ELF32_R_TYPE (rel->r_info);
4422
      if (!htab->is_vxworks
4423
          && h == NULL
4424
          && local_got_refcounts != NULL
4425
          && (!info->shared
4426
              || is_branch_reloc (r_type)))
4427
        {
4428
          struct plt_entry **local_plt = (struct plt_entry **)
4429
            (local_got_refcounts + symtab_hdr->sh_info);
4430
          char *local_got_tls_masks = (char *)
4431
            (local_plt + symtab_hdr->sh_info);
4432
          if ((local_got_tls_masks[r_symndx] & PLT_IFUNC) != 0)
4433
            {
4434
              struct plt_entry **ifunc = local_plt + r_symndx;
4435
              bfd_vma addend = 0;
4436
              struct plt_entry *ent;
4437
 
4438
              if (r_type == R_PPC_PLTREL24 && info->shared)
4439
                addend = rel->r_addend;
4440
              ent = find_plt_ent (ifunc, got2, addend);
4441
              if (ent->plt.refcount > 0)
4442
                ent->plt.refcount -= 1;
4443
              continue;
4444
            }
4445
        }
4446
 
4447
      switch (r_type)
4448
        {
4449
        case R_PPC_GOT_TLSLD16:
4450
        case R_PPC_GOT_TLSLD16_LO:
4451
        case R_PPC_GOT_TLSLD16_HI:
4452
        case R_PPC_GOT_TLSLD16_HA:
4453
        case R_PPC_GOT_TLSGD16:
4454
        case R_PPC_GOT_TLSGD16_LO:
4455
        case R_PPC_GOT_TLSGD16_HI:
4456
        case R_PPC_GOT_TLSGD16_HA:
4457
        case R_PPC_GOT_TPREL16:
4458
        case R_PPC_GOT_TPREL16_LO:
4459
        case R_PPC_GOT_TPREL16_HI:
4460
        case R_PPC_GOT_TPREL16_HA:
4461
        case R_PPC_GOT_DTPREL16:
4462
        case R_PPC_GOT_DTPREL16_LO:
4463
        case R_PPC_GOT_DTPREL16_HI:
4464
        case R_PPC_GOT_DTPREL16_HA:
4465
        case R_PPC_GOT16:
4466
        case R_PPC_GOT16_LO:
4467
        case R_PPC_GOT16_HI:
4468
        case R_PPC_GOT16_HA:
4469
          if (h != NULL)
4470
            {
4471
              if (h->got.refcount > 0)
4472
                h->got.refcount--;
4473
              if (!info->shared)
4474
                {
4475
                  struct plt_entry *ent;
4476
 
4477
                  ent = find_plt_ent (&h->plt.plist, NULL, 0);
4478
                  if (ent != NULL && ent->plt.refcount > 0)
4479
                    ent->plt.refcount -= 1;
4480
                }
4481
            }
4482
          else if (local_got_refcounts != NULL)
4483
            {
4484
              if (local_got_refcounts[r_symndx] > 0)
4485
                local_got_refcounts[r_symndx]--;
4486
            }
4487
          break;
4488
 
4489
        case R_PPC_REL24:
4490
        case R_PPC_REL14:
4491
        case R_PPC_REL14_BRTAKEN:
4492
        case R_PPC_REL14_BRNTAKEN:
4493
        case R_PPC_REL32:
4494
          if (h == NULL || h == htab->elf.hgot)
4495
            break;
4496
          /* Fall thru */
4497
 
4498
        case R_PPC_ADDR32:
4499
        case R_PPC_ADDR24:
4500
        case R_PPC_ADDR16:
4501
        case R_PPC_ADDR16_LO:
4502
        case R_PPC_ADDR16_HI:
4503
        case R_PPC_ADDR16_HA:
4504
        case R_PPC_ADDR14:
4505
        case R_PPC_ADDR14_BRTAKEN:
4506
        case R_PPC_ADDR14_BRNTAKEN:
4507
        case R_PPC_UADDR32:
4508
        case R_PPC_UADDR16:
4509
          if (info->shared)
4510
            break;
4511
 
4512
        case R_PPC_PLT32:
4513
        case R_PPC_PLTREL24:
4514
        case R_PPC_PLTREL32:
4515
        case R_PPC_PLT16_LO:
4516
        case R_PPC_PLT16_HI:
4517
        case R_PPC_PLT16_HA:
4518
          if (h != NULL)
4519
            {
4520
              bfd_vma addend = 0;
4521
              struct plt_entry *ent;
4522
 
4523
              if (r_type == R_PPC_PLTREL24 && info->shared)
4524
                addend = rel->r_addend;
4525
              ent = find_plt_ent (&h->plt.plist, got2, addend);
4526
              if (ent != NULL && ent->plt.refcount > 0)
4527
                ent->plt.refcount -= 1;
4528
            }
4529
          break;
4530
 
4531
        default:
4532
          break;
4533
        }
4534
    }
4535
  return TRUE;
4536
}
4537
 
4538
/* Set plt output section type, htab->tls_get_addr, and call the
4539
   generic ELF tls_setup function.  */
4540
 
4541
asection *
4542
ppc_elf_tls_setup (bfd *obfd,
4543
                   struct bfd_link_info *info,
4544
                   int no_tls_get_addr_opt)
4545
{
4546
  struct ppc_elf_link_hash_table *htab;
4547
 
4548
  htab = ppc_elf_hash_table (info);
4549
  htab->tls_get_addr = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
4550
                                             FALSE, FALSE, TRUE);
4551
  if (!no_tls_get_addr_opt)
4552
    {
4553
      struct elf_link_hash_entry *opt, *tga;
4554
      opt = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
4555
                                  FALSE, FALSE, TRUE);
4556
      if (opt != NULL
4557
          && (opt->root.type == bfd_link_hash_defined
4558
              || opt->root.type == bfd_link_hash_defweak))
4559
        {
4560
          /* If glibc supports an optimized __tls_get_addr call stub,
4561
             signalled by the presence of __tls_get_addr_opt, and we'll
4562
             be calling __tls_get_addr via a plt call stub, then
4563
             make __tls_get_addr point to __tls_get_addr_opt.  */
4564
          tga = htab->tls_get_addr;
4565
          if (htab->elf.dynamic_sections_created
4566
              && tga != NULL
4567
              && (tga->type == STT_FUNC
4568
                  || tga->needs_plt)
4569
              && !(SYMBOL_CALLS_LOCAL (info, tga)
4570
                   || (ELF_ST_VISIBILITY (tga->other) != STV_DEFAULT
4571
                       && tga->root.type == bfd_link_hash_undefweak)))
4572
            {
4573
              struct plt_entry *ent;
4574
              for (ent = tga->plt.plist; ent != NULL; ent = ent->next)
4575
                if (ent->plt.refcount > 0)
4576
                  break;
4577
              if (ent != NULL)
4578
                {
4579
                  tga->root.type = bfd_link_hash_indirect;
4580
                  tga->root.u.i.link = &opt->root;
4581
                  ppc_elf_copy_indirect_symbol (info, opt, tga);
4582
                  if (opt->dynindx != -1)
4583
                    {
4584
                      /* Use __tls_get_addr_opt in dynamic relocations.  */
4585
                      opt->dynindx = -1;
4586
                      _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
4587
                                              opt->dynstr_index);
4588
                      if (!bfd_elf_link_record_dynamic_symbol (info, opt))
4589
                        return FALSE;
4590
                    }
4591
                  htab->tls_get_addr = opt;
4592
                }
4593
            }
4594
        }
4595
      else
4596
        no_tls_get_addr_opt = TRUE;
4597
    }
4598
  htab->no_tls_get_addr_opt = no_tls_get_addr_opt;
4599
  if (htab->plt_type == PLT_NEW
4600
      && htab->plt != NULL
4601
      && htab->plt->output_section != NULL)
4602
    {
4603
      elf_section_type (htab->plt->output_section) = SHT_PROGBITS;
4604
      elf_section_flags (htab->plt->output_section) = SHF_ALLOC + SHF_WRITE;
4605
    }
4606
 
4607
  return _bfd_elf_tls_setup (obfd, info);
4608
}
4609
 
4610
/* Return TRUE iff REL is a branch reloc with a global symbol matching
4611
   HASH.  */
4612
 
4613
static bfd_boolean
4614
branch_reloc_hash_match (const bfd *ibfd,
4615
                         const Elf_Internal_Rela *rel,
4616
                         const struct elf_link_hash_entry *hash)
4617
{
4618
  Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
4619
  enum elf_ppc_reloc_type r_type = ELF32_R_TYPE (rel->r_info);
4620
  unsigned int r_symndx = ELF32_R_SYM (rel->r_info);
4621
 
4622
  if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
4623
    {
4624
      struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
4625
      struct elf_link_hash_entry *h;
4626
 
4627
      h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4628
      while (h->root.type == bfd_link_hash_indirect
4629
             || h->root.type == bfd_link_hash_warning)
4630
        h = (struct elf_link_hash_entry *) h->root.u.i.link;
4631
      if (h == hash)
4632
        return TRUE;
4633
    }
4634
  return FALSE;
4635
}
4636
 
4637
/* Run through all the TLS relocs looking for optimization
4638
   opportunities.  */
4639
 
4640
bfd_boolean
4641
ppc_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED,
4642
                      struct bfd_link_info *info)
4643
{
4644
  bfd *ibfd;
4645
  asection *sec;
4646
  struct ppc_elf_link_hash_table *htab;
4647
  int pass;
4648
 
4649
  if (info->relocatable || !info->executable)
4650
    return TRUE;
4651
 
4652
  htab = ppc_elf_hash_table (info);
4653
  if (htab == NULL)
4654
    return FALSE;
4655
 
4656
  /* Make two passes through the relocs.  First time check that tls
4657
     relocs involved in setting up a tls_get_addr call are indeed
4658
     followed by such a call.  If they are not, don't do any tls
4659
     optimization.  On the second pass twiddle tls_mask flags to
4660
     notify relocate_section that optimization can be done, and
4661
     adjust got and plt refcounts.  */
4662
  for (pass = 0; pass < 2; ++pass)
4663
    for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
4664
      {
4665
        Elf_Internal_Sym *locsyms = NULL;
4666
        Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
4667
        asection *got2 = bfd_get_section_by_name (ibfd, ".got2");
4668
 
4669
        for (sec = ibfd->sections; sec != NULL; sec = sec->next)
4670
          if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
4671
            {
4672
              Elf_Internal_Rela *relstart, *rel, *relend;
4673
              int expecting_tls_get_addr = 0;
4674
 
4675
              /* Read the relocations.  */
4676
              relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
4677
                                                    info->keep_memory);
4678
              if (relstart == NULL)
4679
                return FALSE;
4680
 
4681
              relend = relstart + sec->reloc_count;
4682
              for (rel = relstart; rel < relend; rel++)
4683
                {
4684
                  enum elf_ppc_reloc_type r_type;
4685
                  unsigned long r_symndx;
4686
                  struct elf_link_hash_entry *h = NULL;
4687
                  char *tls_mask;
4688
                  char tls_set, tls_clear;
4689
                  bfd_boolean is_local;
4690
                  bfd_signed_vma *got_count;
4691
 
4692
                  r_symndx = ELF32_R_SYM (rel->r_info);
4693
                  if (r_symndx >= symtab_hdr->sh_info)
4694
                    {
4695
                      struct elf_link_hash_entry **sym_hashes;
4696
 
4697
                      sym_hashes = elf_sym_hashes (ibfd);
4698
                      h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4699
                      while (h->root.type == bfd_link_hash_indirect
4700
                             || h->root.type == bfd_link_hash_warning)
4701
                        h = (struct elf_link_hash_entry *) h->root.u.i.link;
4702
                    }
4703
 
4704
                  is_local = FALSE;
4705
                  if (h == NULL
4706
                      || !h->def_dynamic)
4707
                    is_local = TRUE;
4708
 
4709
                  r_type = ELF32_R_TYPE (rel->r_info);
4710
                  /* If this section has old-style __tls_get_addr calls
4711
                     without marker relocs, then check that each
4712
                     __tls_get_addr call reloc is preceded by a reloc
4713
                     that conceivably belongs to the __tls_get_addr arg
4714
                     setup insn.  If we don't find matching arg setup
4715
                     relocs, don't do any tls optimization.  */
4716
                  if (pass == 0
4717
                      && sec->has_tls_get_addr_call
4718
                      && h != NULL
4719
                      && h == htab->tls_get_addr
4720
                      && !expecting_tls_get_addr
4721
                      && is_branch_reloc (r_type))
4722
                    {
4723
                      info->callbacks->minfo ("%H __tls_get_addr lost arg, "
4724
                                              "TLS optimization disabled\n",
4725
                                              ibfd, sec, rel->r_offset);
4726
                      if (elf_section_data (sec)->relocs != relstart)
4727
                        free (relstart);
4728
                      return TRUE;
4729
                    }
4730
 
4731
                  expecting_tls_get_addr = 0;
4732
                  switch (r_type)
4733
                    {
4734
                    case R_PPC_GOT_TLSLD16:
4735
                    case R_PPC_GOT_TLSLD16_LO:
4736
                      expecting_tls_get_addr = 1;
4737
                      /* Fall thru */
4738
 
4739
                    case R_PPC_GOT_TLSLD16_HI:
4740
                    case R_PPC_GOT_TLSLD16_HA:
4741
                      /* These relocs should never be against a symbol
4742
                         defined in a shared lib.  Leave them alone if
4743
                         that turns out to be the case.  */
4744
                      if (!is_local)
4745
                        continue;
4746
 
4747
                      /* LD -> LE */
4748
                      tls_set = 0;
4749
                      tls_clear = TLS_LD;
4750
                      break;
4751
 
4752
                    case R_PPC_GOT_TLSGD16:
4753
                    case R_PPC_GOT_TLSGD16_LO:
4754
                      expecting_tls_get_addr = 1;
4755
                      /* Fall thru */
4756
 
4757
                    case R_PPC_GOT_TLSGD16_HI:
4758
                    case R_PPC_GOT_TLSGD16_HA:
4759
                      if (is_local)
4760
                        /* GD -> LE */
4761
                        tls_set = 0;
4762
                      else
4763
                        /* GD -> IE */
4764
                        tls_set = TLS_TLS | TLS_TPRELGD;
4765
                      tls_clear = TLS_GD;
4766
                      break;
4767
 
4768
                    case R_PPC_GOT_TPREL16:
4769
                    case R_PPC_GOT_TPREL16_LO:
4770
                    case R_PPC_GOT_TPREL16_HI:
4771
                    case R_PPC_GOT_TPREL16_HA:
4772
                      if (is_local)
4773
                        {
4774
                          /* IE -> LE */
4775
                          tls_set = 0;
4776
                          tls_clear = TLS_TPREL;
4777
                          break;
4778
                        }
4779
                      else
4780
                        continue;
4781
 
4782
                    case R_PPC_TLSGD:
4783
                    case R_PPC_TLSLD:
4784
                      expecting_tls_get_addr = 2;
4785
                      tls_set = 0;
4786
                      tls_clear = 0;
4787
                      break;
4788
 
4789
                    default:
4790
                      continue;
4791
                    }
4792
 
4793
                  if (pass == 0)
4794
                    {
4795
                      if (!expecting_tls_get_addr
4796
                          || (expecting_tls_get_addr == 1
4797
                              && !sec->has_tls_get_addr_call))
4798
                        continue;
4799
 
4800
                      if (rel + 1 < relend
4801
                          && branch_reloc_hash_match (ibfd, rel + 1,
4802
                                                      htab->tls_get_addr))
4803
                        continue;
4804
 
4805
                      /* Uh oh, we didn't find the expected call.  We
4806
                         could just mark this symbol to exclude it
4807
                         from tls optimization but it's safer to skip
4808
                         the entire optimization.  */
4809
                      info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
4810
                                                "TLS optimization disabled\n"),
4811
                                              ibfd, sec, rel->r_offset);
4812
                      if (elf_section_data (sec)->relocs != relstart)
4813
                        free (relstart);
4814
                      return TRUE;
4815
                    }
4816
 
4817
                  if (expecting_tls_get_addr)
4818
                    {
4819
                      struct plt_entry *ent;
4820
                      bfd_vma addend = 0;
4821
 
4822
                      if (info->shared
4823
                          && ELF32_R_TYPE (rel[1].r_info) == R_PPC_PLTREL24)
4824
                        addend = rel[1].r_addend;
4825
                      ent = find_plt_ent (&htab->tls_get_addr->plt.plist,
4826
                                          got2, addend);
4827
                      if (ent != NULL && ent->plt.refcount > 0)
4828
                        ent->plt.refcount -= 1;
4829
 
4830
                      if (expecting_tls_get_addr == 2)
4831
                        continue;
4832
                    }
4833
 
4834
                  if (h != NULL)
4835
                    {
4836
                      tls_mask = &ppc_elf_hash_entry (h)->tls_mask;
4837
                      got_count = &h->got.refcount;
4838
                    }
4839
                  else
4840
                    {
4841
                      bfd_signed_vma *lgot_refs;
4842
                      struct plt_entry **local_plt;
4843
                      char *lgot_masks;
4844
 
4845
                      if (locsyms == NULL)
4846
                        {
4847
                          locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
4848
                          if (locsyms == NULL)
4849
                            locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
4850
                                                            symtab_hdr->sh_info,
4851
                                                            0, NULL, NULL, NULL);
4852
                          if (locsyms == NULL)
4853
                            {
4854
                              if (elf_section_data (sec)->relocs != relstart)
4855
                                free (relstart);
4856
                              return FALSE;
4857
                            }
4858
                        }
4859
                      lgot_refs = elf_local_got_refcounts (ibfd);
4860
                      if (lgot_refs == NULL)
4861
                        abort ();
4862
                      local_plt = (struct plt_entry **)
4863
                        (lgot_refs + symtab_hdr->sh_info);
4864
                      lgot_masks = (char *) (local_plt + symtab_hdr->sh_info);
4865
                      tls_mask = &lgot_masks[r_symndx];
4866
                      got_count = &lgot_refs[r_symndx];
4867
                    }
4868
 
4869
                  if (tls_set == 0)
4870
                    {
4871
                      /* We managed to get rid of a got entry.  */
4872
                      if (*got_count > 0)
4873
                        *got_count -= 1;
4874
                    }
4875
 
4876
                  *tls_mask |= tls_set;
4877
                  *tls_mask &= ~tls_clear;
4878
                }
4879
 
4880
              if (elf_section_data (sec)->relocs != relstart)
4881
                free (relstart);
4882
            }
4883
 
4884
        if (locsyms != NULL
4885
            && (symtab_hdr->contents != (unsigned char *) locsyms))
4886
          {
4887
            if (!info->keep_memory)
4888
              free (locsyms);
4889
            else
4890
              symtab_hdr->contents = (unsigned char *) locsyms;
4891
          }
4892
      }
4893
  return TRUE;
4894
}
4895
 
4896
/* Return true if we have dynamic relocs that apply to read-only sections.  */
4897
 
4898
static bfd_boolean
4899
readonly_dynrelocs (struct elf_link_hash_entry *h)
4900
{
4901
  struct elf_dyn_relocs *p;
4902
 
4903
  for (p = ppc_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
4904
    {
4905
      asection *s = p->sec->output_section;
4906
 
4907
      if (s != NULL
4908
          && ((s->flags & (SEC_READONLY | SEC_ALLOC))
4909
              == (SEC_READONLY | SEC_ALLOC)))
4910
        return TRUE;
4911
    }
4912
  return FALSE;
4913
}
4914
 
4915
/* Adjust a symbol defined by a dynamic object and referenced by a
4916
   regular object.  The current definition is in some section of the
4917
   dynamic object, but we're not including those sections.  We have to
4918
   change the definition to something the rest of the link can
4919
   understand.  */
4920
 
4921
static bfd_boolean
4922
ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
4923
                               struct elf_link_hash_entry *h)
4924
{
4925
  struct ppc_elf_link_hash_table *htab;
4926
  asection *s;
4927
 
4928
#ifdef DEBUG
4929
  fprintf (stderr, "ppc_elf_adjust_dynamic_symbol called for %s\n",
4930
           h->root.root.string);
4931
#endif
4932
 
4933
  /* Make sure we know what is going on here.  */
4934
  htab = ppc_elf_hash_table (info);
4935
  BFD_ASSERT (htab->elf.dynobj != NULL
4936
              && (h->needs_plt
4937
                  || h->type == STT_GNU_IFUNC
4938
                  || h->u.weakdef != NULL
4939
                  || (h->def_dynamic
4940
                      && h->ref_regular
4941
                      && !h->def_regular)));
4942
 
4943
  /* Deal with function syms.  */
4944
  if (h->type == STT_FUNC
4945
      || h->type == STT_GNU_IFUNC
4946
      || h->needs_plt)
4947
    {
4948
      /* Clear procedure linkage table information for any symbol that
4949
         won't need a .plt entry.  */
4950
      struct plt_entry *ent;
4951
      for (ent = h->plt.plist; ent != NULL; ent = ent->next)
4952
        if (ent->plt.refcount > 0)
4953
          break;
4954
      if (ent == NULL
4955
          || (h->type != STT_GNU_IFUNC
4956
              && (SYMBOL_CALLS_LOCAL (info, h)
4957
                  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
4958
                      && h->root.type == bfd_link_hash_undefweak))))
4959
        {
4960
          /* A PLT entry is not required/allowed when:
4961
 
4962
             1. We are not using ld.so; because then the PLT entry
4963
             can't be set up, so we can't use one.  In this case,
4964
             ppc_elf_adjust_dynamic_symbol won't even be called.
4965
 
4966
             2. GC has rendered the entry unused.
4967
 
4968
             3. We know for certain that a call to this symbol
4969
             will go to this object, or will remain undefined.  */
4970
          h->plt.plist = NULL;
4971
          h->needs_plt = 0;
4972
        }
4973
      else
4974
        {
4975
          /* After adjust_dynamic_symbol, non_got_ref set in the
4976
             non-shared case means that we have allocated space in
4977
             .dynbss for the symbol and thus dyn_relocs for this
4978
             symbol should be discarded.
4979
             If we get here we know we are making a PLT entry for this
4980
             symbol, and in an executable we'd normally resolve
4981
             relocations against this symbol to the PLT entry.  Allow
4982
             dynamic relocs if the reference is weak, and the dynamic
4983
             relocs will not cause text relocation.  */
4984
          if (!h->ref_regular_nonweak
4985
              && h->non_got_ref
4986
              && h->type != STT_GNU_IFUNC
4987
              && !htab->is_vxworks
4988
              && !ppc_elf_hash_entry (h)->has_sda_refs
4989
              && !readonly_dynrelocs (h))
4990
            h->non_got_ref = 0;
4991
        }
4992
      return TRUE;
4993
    }
4994
  else
4995
    h->plt.plist = NULL;
4996
 
4997
  /* If this is a weak symbol, and there is a real definition, the
4998
     processor independent code will have arranged for us to see the
4999
     real definition first, and we can just use the same value.  */
5000
  if (h->u.weakdef != NULL)
5001
    {
5002
      BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
5003
                  || h->u.weakdef->root.type == bfd_link_hash_defweak);
5004
      h->root.u.def.section = h->u.weakdef->root.u.def.section;
5005
      h->root.u.def.value = h->u.weakdef->root.u.def.value;
5006
      if (ELIMINATE_COPY_RELOCS)
5007
        h->non_got_ref = h->u.weakdef->non_got_ref;
5008
      return TRUE;
5009
    }
5010
 
5011
  /* This is a reference to a symbol defined by a dynamic object which
5012
     is not a function.  */
5013
 
5014
  /* If we are creating a shared library, we must presume that the
5015
     only references to the symbol are via the global offset table.
5016
     For such cases we need not do anything here; the relocations will
5017
     be handled correctly by relocate_section.  */
5018
  if (info->shared)
5019
    return TRUE;
5020
 
5021
  /* If there are no references to this symbol that do not use the
5022
     GOT, we don't need to generate a copy reloc.  */
5023
  if (!h->non_got_ref)
5024
    return TRUE;
5025
 
5026
   /* If we didn't find any dynamic relocs in read-only sections, then
5027
      we'll be keeping the dynamic relocs and avoiding the copy reloc.
5028
      We can't do this if there are any small data relocations.  This
5029
      doesn't work on VxWorks, where we can not have dynamic
5030
      relocations (other than copy and jump slot relocations) in an
5031
      executable.  */
5032
  if (ELIMINATE_COPY_RELOCS
5033
      && !ppc_elf_hash_entry (h)->has_sda_refs
5034
      && !htab->is_vxworks
5035
      && !h->def_regular
5036
      && !readonly_dynrelocs (h))
5037
    {
5038
      h->non_got_ref = 0;
5039
      return TRUE;
5040
    }
5041
 
5042
  if (h->size == 0)
5043
    {
5044 161 khays
      info->callbacks->einfo (_("%P: dynamic variable `%s' is zero size\n"),
5045 14 khays
                              h->root.root.string);
5046
      return TRUE;
5047
    }
5048
 
5049
  /* We must allocate the symbol in our .dynbss section, which will
5050
     become part of the .bss section of the executable.  There will be
5051
     an entry for this symbol in the .dynsym section.  The dynamic
5052
     object will contain position independent code, so all references
5053
     from the dynamic object to this symbol will go through the global
5054
     offset table.  The dynamic linker will use the .dynsym entry to
5055
     determine the address it must put in the global offset table, so
5056
     both the dynamic object and the regular object will refer to the
5057
     same memory location for the variable.
5058
 
5059
     Of course, if the symbol is referenced using SDAREL relocs, we
5060
     must instead allocate it in .sbss.  */
5061
 
5062
  if (ppc_elf_hash_entry (h)->has_sda_refs)
5063
    s = htab->dynsbss;
5064
  else
5065
    s = htab->dynbss;
5066
  BFD_ASSERT (s != NULL);
5067
 
5068
  /* We must generate a R_PPC_COPY reloc to tell the dynamic linker to
5069
     copy the initial value out of the dynamic object and into the
5070
     runtime process image.  We need to remember the offset into the
5071
     .rela.bss section we are going to use.  */
5072
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
5073
    {
5074
      asection *srel;
5075
 
5076
      if (ppc_elf_hash_entry (h)->has_sda_refs)
5077
        srel = htab->relsbss;
5078
      else
5079
        srel = htab->relbss;
5080
      BFD_ASSERT (srel != NULL);
5081
      srel->size += sizeof (Elf32_External_Rela);
5082
      h->needs_copy = 1;
5083
    }
5084
 
5085
  return _bfd_elf_adjust_dynamic_copy (h, s);
5086
}
5087
 
5088
/* Generate a symbol to mark plt call stubs.  For non-PIC code the sym is
5089
   xxxxxxxx.plt_call32.<callee> where xxxxxxxx is a hex number, usually 0,
5090
   specifying the addend on the plt relocation.  For -fpic code, the sym
5091
   is xxxxxxxx.plt_pic32.<callee>, and for -fPIC
5092
   xxxxxxxx.got2.plt_pic32.<callee>.  */
5093
 
5094
static bfd_boolean
5095
add_stub_sym (struct plt_entry *ent,
5096
              struct elf_link_hash_entry *h,
5097
              struct bfd_link_info *info)
5098
{
5099
  struct elf_link_hash_entry *sh;
5100
  size_t len1, len2, len3;
5101
  char *name;
5102
  const char *stub;
5103
  struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
5104
 
5105
  if (info->shared)
5106
    stub = ".plt_pic32.";
5107
  else
5108
    stub = ".plt_call32.";
5109
 
5110
  len1 = strlen (h->root.root.string);
5111
  len2 = strlen (stub);
5112
  len3 = 0;
5113
  if (ent->sec)
5114
    len3 = strlen (ent->sec->name);
5115
  name = bfd_malloc (len1 + len2 + len3 + 9);
5116
  if (name == NULL)
5117
    return FALSE;
5118
  sprintf (name, "%08x", (unsigned) ent->addend & 0xffffffff);
5119
  if (ent->sec)
5120
    memcpy (name + 8, ent->sec->name, len3);
5121
  memcpy (name + 8 + len3, stub, len2);
5122
  memcpy (name + 8 + len3 + len2, h->root.root.string, len1 + 1);
5123
  sh = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
5124
  if (sh == NULL)
5125
    return FALSE;
5126
  if (sh->root.type == bfd_link_hash_new)
5127
    {
5128
      sh->root.type = bfd_link_hash_defined;
5129
      sh->root.u.def.section = htab->glink;
5130
      sh->root.u.def.value = ent->glink_offset;
5131
      sh->ref_regular = 1;
5132
      sh->def_regular = 1;
5133
      sh->ref_regular_nonweak = 1;
5134
      sh->forced_local = 1;
5135
      sh->non_elf = 0;
5136
    }
5137
  return TRUE;
5138
}
5139
 
5140
/* Allocate NEED contiguous space in .got, and return the offset.
5141
   Handles allocation of the got header when crossing 32k.  */
5142
 
5143
static bfd_vma
5144
allocate_got (struct ppc_elf_link_hash_table *htab, unsigned int need)
5145
{
5146
  bfd_vma where;
5147
  unsigned int max_before_header;
5148
 
5149
  if (htab->plt_type == PLT_VXWORKS)
5150
    {
5151
      where = htab->got->size;
5152
      htab->got->size += need;
5153
    }
5154
  else
5155
    {
5156
      max_before_header = htab->plt_type == PLT_NEW ? 32768 : 32764;
5157
      if (need <= htab->got_gap)
5158
        {
5159
          where = max_before_header - htab->got_gap;
5160
          htab->got_gap -= need;
5161
        }
5162
      else
5163
        {
5164
          if (htab->got->size + need > max_before_header
5165
              && htab->got->size <= max_before_header)
5166
            {
5167
              htab->got_gap = max_before_header - htab->got->size;
5168
              htab->got->size = max_before_header + htab->got_header_size;
5169
            }
5170
          where = htab->got->size;
5171
          htab->got->size += need;
5172
        }
5173
    }
5174
  return where;
5175
}
5176
 
5177
/* Allocate space in associated reloc sections for dynamic relocs.  */
5178
 
5179
static bfd_boolean
5180
allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
5181
{
5182
  struct bfd_link_info *info = inf;
5183
  struct ppc_elf_link_hash_entry *eh;
5184
  struct ppc_elf_link_hash_table *htab;
5185
  struct elf_dyn_relocs *p;
5186
 
5187
  if (h->root.type == bfd_link_hash_indirect)
5188
    return TRUE;
5189
 
5190
  htab = ppc_elf_hash_table (info);
5191
  if (htab->elf.dynamic_sections_created
5192
      || h->type == STT_GNU_IFUNC)
5193
    {
5194
      struct plt_entry *ent;
5195
      bfd_boolean doneone = FALSE;
5196
      bfd_vma plt_offset = 0, glink_offset = 0;
5197
      bfd_boolean dyn;
5198
 
5199
      for (ent = h->plt.plist; ent != NULL; ent = ent->next)
5200
        if (ent->plt.refcount > 0)
5201
          {
5202
            /* Make sure this symbol is output as a dynamic symbol.  */
5203
            if (h->dynindx == -1
5204
                && !h->forced_local
5205
                && !h->def_regular
5206
                && htab->elf.dynamic_sections_created)
5207
              {
5208
                if (! bfd_elf_link_record_dynamic_symbol (info, h))
5209
                  return FALSE;
5210
              }
5211
 
5212
            dyn = htab->elf.dynamic_sections_created;
5213
            if (info->shared
5214
                || h->type == STT_GNU_IFUNC
5215
                || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
5216
              {
5217
                asection *s = htab->plt;
5218
                if (!dyn || h->dynindx == -1)
5219
                  s = htab->iplt;
5220
 
5221
                if (htab->plt_type == PLT_NEW || !dyn || h->dynindx == -1)
5222
                  {
5223
                    if (!doneone)
5224
                      {
5225
                        plt_offset = s->size;
5226
                        s->size += 4;
5227
                      }
5228
                    ent->plt.offset = plt_offset;
5229
 
5230
                    s = htab->glink;
5231
                    if (!doneone || info->shared)
5232
                      {
5233
                        glink_offset = s->size;
5234
                        s->size += GLINK_ENTRY_SIZE;
5235
                        if (h == htab->tls_get_addr
5236
                            && !htab->no_tls_get_addr_opt)
5237
                          s->size += TLS_GET_ADDR_GLINK_SIZE - GLINK_ENTRY_SIZE;
5238
                      }
5239
                    if (!doneone
5240
                        && !info->shared
5241
                        && h->def_dynamic
5242
                        && !h->def_regular)
5243
                      {
5244
                        h->root.u.def.section = s;
5245
                        h->root.u.def.value = glink_offset;
5246
                      }
5247
                    ent->glink_offset = glink_offset;
5248
 
5249
                    if (htab->emit_stub_syms
5250
                        && !add_stub_sym (ent, h, info))
5251
                      return FALSE;
5252
                  }
5253
                else
5254
                  {
5255
                    if (!doneone)
5256
                      {
5257
                        /* If this is the first .plt entry, make room
5258
                           for the special first entry.  */
5259
                        if (s->size == 0)
5260
                          s->size += htab->plt_initial_entry_size;
5261
 
5262
                        /* The PowerPC PLT is actually composed of two
5263
                           parts, the first part is 2 words (for a load
5264
                           and a jump), and then there is a remaining
5265
                           word available at the end.  */
5266
                        plt_offset = (htab->plt_initial_entry_size
5267
                                      + (htab->plt_slot_size
5268
                                         * ((s->size
5269
                                             - htab->plt_initial_entry_size)
5270
                                            / htab->plt_entry_size)));
5271
 
5272
                        /* If this symbol is not defined in a regular
5273
                           file, and we are not generating a shared
5274
                           library, then set the symbol to this location
5275
                           in the .plt.  This is to avoid text
5276
                           relocations, and is required to make
5277
                           function pointers compare as equal between
5278
                           the normal executable and the shared library.  */
5279
                        if (! info->shared
5280
                            && h->def_dynamic
5281
                            && !h->def_regular)
5282
                          {
5283
                            h->root.u.def.section = s;
5284
                            h->root.u.def.value = plt_offset;
5285
                          }
5286
 
5287
                        /* Make room for this entry.  */
5288
                        s->size += htab->plt_entry_size;
5289
                        /* After the 8192nd entry, room for two entries
5290
                           is allocated.  */
5291
                        if (htab->plt_type == PLT_OLD
5292
                            && (s->size - htab->plt_initial_entry_size)
5293
                                / htab->plt_entry_size
5294
                               > PLT_NUM_SINGLE_ENTRIES)
5295
                          s->size += htab->plt_entry_size;
5296
                      }
5297
                    ent->plt.offset = plt_offset;
5298
                  }
5299
 
5300
                /* We also need to make an entry in the .rela.plt section.  */
5301
                if (!doneone)
5302
                  {
5303
                    if (!htab->elf.dynamic_sections_created
5304
                        || h->dynindx == -1)
5305
                      htab->reliplt->size += sizeof (Elf32_External_Rela);
5306
                    else
5307
                      {
5308
                        htab->relplt->size += sizeof (Elf32_External_Rela);
5309
 
5310
                        if (htab->plt_type == PLT_VXWORKS)
5311
                          {
5312
                            /* Allocate space for the unloaded relocations.  */
5313
                            if (!info->shared
5314
                                && htab->elf.dynamic_sections_created)
5315
                              {
5316
                                if (ent->plt.offset
5317
                                    == (bfd_vma) htab->plt_initial_entry_size)
5318
                                  {
5319
                                    htab->srelplt2->size
5320
                                      += (sizeof (Elf32_External_Rela)
5321
                                          * VXWORKS_PLTRESOLVE_RELOCS);
5322
                                  }
5323
 
5324
                                htab->srelplt2->size
5325
                                  += (sizeof (Elf32_External_Rela)
5326
                                      * VXWORKS_PLT_NON_JMP_SLOT_RELOCS);
5327
                              }
5328
 
5329
                            /* Every PLT entry has an associated GOT entry in
5330
                               .got.plt.  */
5331
                            htab->sgotplt->size += 4;
5332
                          }
5333
                      }
5334
                    doneone = TRUE;
5335
                  }
5336
              }
5337
            else
5338
              ent->plt.offset = (bfd_vma) -1;
5339
          }
5340
        else
5341
          ent->plt.offset = (bfd_vma) -1;
5342
 
5343
      if (!doneone)
5344
        {
5345
          h->plt.plist = NULL;
5346
          h->needs_plt = 0;
5347
        }
5348
    }
5349
  else
5350
    {
5351
      h->plt.plist = NULL;
5352
      h->needs_plt = 0;
5353
    }
5354
 
5355
  eh = (struct ppc_elf_link_hash_entry *) h;
5356
  if (eh->elf.got.refcount > 0)
5357
    {
5358
      bfd_boolean dyn;
5359
      unsigned int need;
5360
 
5361
      /* Make sure this symbol is output as a dynamic symbol.  */
5362
      if (eh->elf.dynindx == -1
5363
          && !eh->elf.forced_local
5364
          && eh->elf.type != STT_GNU_IFUNC
5365
          && htab->elf.dynamic_sections_created)
5366
        {
5367
          if (!bfd_elf_link_record_dynamic_symbol (info, &eh->elf))
5368
            return FALSE;
5369
        }
5370
 
5371
      need = 0;
5372
      if ((eh->tls_mask & TLS_TLS) != 0)
5373
        {
5374
          if ((eh->tls_mask & TLS_LD) != 0)
5375
            {
5376
              if (!eh->elf.def_dynamic)
5377
                /* We'll just use htab->tlsld_got.offset.  This should
5378
                   always be the case.  It's a little odd if we have
5379
                   a local dynamic reloc against a non-local symbol.  */
5380
                htab->tlsld_got.refcount += 1;
5381
              else
5382
                need += 8;
5383
            }
5384
          if ((eh->tls_mask & TLS_GD) != 0)
5385
            need += 8;
5386
          if ((eh->tls_mask & (TLS_TPREL | TLS_TPRELGD)) != 0)
5387
            need += 4;
5388
          if ((eh->tls_mask & TLS_DTPREL) != 0)
5389
            need += 4;
5390
        }
5391
      else
5392
        need += 4;
5393
      if (need == 0)
5394
        eh->elf.got.offset = (bfd_vma) -1;
5395
      else
5396
        {
5397
          eh->elf.got.offset = allocate_got (htab, need);
5398
          dyn = htab->elf.dynamic_sections_created;
5399
          if ((info->shared
5400
               || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, &eh->elf))
5401
              && (ELF_ST_VISIBILITY (eh->elf.other) == STV_DEFAULT
5402
                  || eh->elf.root.type != bfd_link_hash_undefweak))
5403
            {
5404
              asection *rsec = htab->relgot;
5405
              /* All the entries we allocated need relocs.
5406
                 Except LD only needs one.  */
5407
              if ((eh->tls_mask & TLS_LD) != 0
5408
                  && eh->elf.def_dynamic)
5409
                need -= 4;
5410
              rsec->size += need * (sizeof (Elf32_External_Rela) / 4);
5411
            }
5412
        }
5413
    }
5414
  else
5415
    eh->elf.got.offset = (bfd_vma) -1;
5416
 
5417
  if (eh->dyn_relocs == NULL
5418
      || !htab->elf.dynamic_sections_created)
5419
    return TRUE;
5420
 
5421
  /* In the shared -Bsymbolic case, discard space allocated for
5422
     dynamic pc-relative relocs against symbols which turn out to be
5423
     defined in regular objects.  For the normal shared case, discard
5424
     space for relocs that have become local due to symbol visibility
5425
     changes.  */
5426
 
5427
  if (info->shared)
5428
    {
5429
      /* Relocs that use pc_count are those that appear on a call insn,
5430
         or certain REL relocs (see must_be_dyn_reloc) that can be
5431
         generated via assembly.  We want calls to protected symbols to
5432
         resolve directly to the function rather than going via the plt.
5433
         If people want function pointer comparisons to work as expected
5434
         then they should avoid writing weird assembly.  */
5435
      if (SYMBOL_CALLS_LOCAL (info, h))
5436
        {
5437
          struct elf_dyn_relocs **pp;
5438
 
5439
          for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
5440
            {
5441
              p->count -= p->pc_count;
5442
              p->pc_count = 0;
5443
              if (p->count == 0)
5444
                *pp = p->next;
5445
              else
5446
                pp = &p->next;
5447
            }
5448
        }
5449
 
5450
      if (htab->is_vxworks)
5451
        {
5452
          struct elf_dyn_relocs **pp;
5453
 
5454
          for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
5455
            {
5456
              if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
5457
                *pp = p->next;
5458
              else
5459
                pp = &p->next;
5460
            }
5461
        }
5462
 
5463
      /* Discard relocs on undefined symbols that must be local.  */
5464
      if (eh->dyn_relocs != NULL
5465
          && h->root.type == bfd_link_hash_undefined
5466
          && (ELF_ST_VISIBILITY (h->other) == STV_HIDDEN
5467
              || ELF_ST_VISIBILITY (h->other) == STV_INTERNAL))
5468
        eh->dyn_relocs = NULL;
5469
 
5470
      /* Also discard relocs on undefined weak syms with non-default
5471
         visibility.  */
5472
      if (eh->dyn_relocs != NULL
5473
          && h->root.type == bfd_link_hash_undefweak)
5474
        {
5475
          if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
5476
            eh->dyn_relocs = NULL;
5477
 
5478
          /* Make sure undefined weak symbols are output as a dynamic
5479
             symbol in PIEs.  */
5480
          else if (h->dynindx == -1
5481
                   && !h->forced_local
5482
                   && !h->def_regular)
5483
            {
5484
              if (! bfd_elf_link_record_dynamic_symbol (info, h))
5485
                return FALSE;
5486
            }
5487
        }
5488
    }
5489
  else if (ELIMINATE_COPY_RELOCS)
5490
    {
5491
      /* For the non-shared case, discard space for relocs against
5492
         symbols which turn out to need copy relocs or are not
5493
         dynamic.  */
5494
 
5495
      if (!h->non_got_ref
5496
          && !h->def_regular)
5497
        {
5498
          /* Make sure this symbol is output as a dynamic symbol.
5499
             Undefined weak syms won't yet be marked as dynamic.  */
5500
          if (h->dynindx == -1
5501
              && !h->forced_local)
5502
            {
5503
              if (! bfd_elf_link_record_dynamic_symbol (info, h))
5504
                return FALSE;
5505
            }
5506
 
5507
          /* If that succeeded, we know we'll be keeping all the
5508
             relocs.  */
5509
          if (h->dynindx != -1)
5510
            goto keep;
5511
        }
5512
 
5513
      eh->dyn_relocs = NULL;
5514
 
5515
    keep: ;
5516
    }
5517
 
5518
  /* Finally, allocate space.  */
5519
  for (p = eh->dyn_relocs; p != NULL; p = p->next)
5520
    {
5521
      asection *sreloc = elf_section_data (p->sec)->sreloc;
5522
      if (!htab->elf.dynamic_sections_created)
5523
        sreloc = htab->reliplt;
5524
      sreloc->size += p->count * sizeof (Elf32_External_Rela);
5525
    }
5526
 
5527
  return TRUE;
5528
}
5529
 
5530
/* Set DF_TEXTREL if we find any dynamic relocs that apply to
5531
   read-only sections.  */
5532
 
5533
static bfd_boolean
5534
maybe_set_textrel (struct elf_link_hash_entry *h, void *info)
5535
{
5536
  if (h->root.type == bfd_link_hash_indirect)
5537
    return TRUE;
5538
 
5539
  if (readonly_dynrelocs (h))
5540
    {
5541
      ((struct bfd_link_info *) info)->flags |= DF_TEXTREL;
5542
 
5543
      /* Not an error, just cut short the traversal.  */
5544
      return FALSE;
5545
    }
5546
  return TRUE;
5547
}
5548
 
5549 161 khays
static const unsigned char glink_eh_frame_cie[] =
5550
{
5551
  0, 0, 0, 16,                             /* length.  */
5552
  0, 0, 0, 0,                               /* id.  */
5553
  1,                                    /* CIE version.  */
5554
  'z', 'R', 0,                           /* Augmentation string.  */
5555
  4,                                    /* Code alignment.  */
5556
  0x7c,                                 /* Data alignment.  */
5557
  65,                                   /* RA reg.  */
5558
  1,                                    /* Augmentation size.  */
5559
  DW_EH_PE_pcrel | DW_EH_PE_sdata4,     /* FDE encoding.  */
5560
  DW_CFA_def_cfa, 1, 0                   /* def_cfa: r1 offset 0.  */
5561
};
5562
 
5563 14 khays
/* Set the sizes of the dynamic sections.  */
5564
 
5565
static bfd_boolean
5566
ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
5567
                               struct bfd_link_info *info)
5568
{
5569
  struct ppc_elf_link_hash_table *htab;
5570
  asection *s;
5571
  bfd_boolean relocs;
5572
  bfd *ibfd;
5573
 
5574
#ifdef DEBUG
5575
  fprintf (stderr, "ppc_elf_size_dynamic_sections called\n");
5576
#endif
5577
 
5578
  htab = ppc_elf_hash_table (info);
5579
  BFD_ASSERT (htab->elf.dynobj != NULL);
5580
 
5581
  if (elf_hash_table (info)->dynamic_sections_created)
5582
    {
5583
      /* Set the contents of the .interp section to the interpreter.  */
5584
      if (info->executable)
5585
        {
5586
          s = bfd_get_section_by_name (htab->elf.dynobj, ".interp");
5587
          BFD_ASSERT (s != NULL);
5588
          s->size = sizeof ELF_DYNAMIC_INTERPRETER;
5589
          s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
5590
        }
5591
    }
5592
 
5593
  if (htab->plt_type == PLT_OLD)
5594
    htab->got_header_size = 16;
5595
  else if (htab->plt_type == PLT_NEW)
5596
    htab->got_header_size = 12;
5597
 
5598
  /* Set up .got offsets for local syms, and space for local dynamic
5599
     relocs.  */
5600
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
5601
    {
5602
      bfd_signed_vma *local_got;
5603
      bfd_signed_vma *end_local_got;
5604
      struct plt_entry **local_plt;
5605
      struct plt_entry **end_local_plt;
5606
      char *lgot_masks;
5607
      bfd_size_type locsymcount;
5608
      Elf_Internal_Shdr *symtab_hdr;
5609
 
5610
      if (!is_ppc_elf (ibfd))
5611
        continue;
5612
 
5613
      for (s = ibfd->sections; s != NULL; s = s->next)
5614
        {
5615
          struct elf_dyn_relocs *p;
5616
 
5617
          for (p = ((struct elf_dyn_relocs *)
5618
                    elf_section_data (s)->local_dynrel);
5619
               p != NULL;
5620
               p = p->next)
5621
            {
5622
              if (!bfd_is_abs_section (p->sec)
5623
                  && bfd_is_abs_section (p->sec->output_section))
5624
                {
5625
                  /* Input section has been discarded, either because
5626
                     it is a copy of a linkonce section or due to
5627
                     linker script /DISCARD/, so we'll be discarding
5628
                     the relocs too.  */
5629
                }
5630
              else if (htab->is_vxworks
5631
                       && strcmp (p->sec->output_section->name,
5632
                                  ".tls_vars") == 0)
5633
                {
5634
                  /* Relocations in vxworks .tls_vars sections are
5635
                     handled specially by the loader.  */
5636
                }
5637
              else if (p->count != 0)
5638
                {
5639
                  asection *sreloc = elf_section_data (p->sec)->sreloc;
5640
                  if (!htab->elf.dynamic_sections_created)
5641
                    sreloc = htab->reliplt;
5642
                  sreloc->size += p->count * sizeof (Elf32_External_Rela);
5643
                  if ((p->sec->output_section->flags
5644
                       & (SEC_READONLY | SEC_ALLOC))
5645
                      == (SEC_READONLY | SEC_ALLOC))
5646
                    info->flags |= DF_TEXTREL;
5647
                }
5648
            }
5649
        }
5650
 
5651
      local_got = elf_local_got_refcounts (ibfd);
5652
      if (!local_got)
5653
        continue;
5654
 
5655
      symtab_hdr = &elf_symtab_hdr (ibfd);
5656
      locsymcount = symtab_hdr->sh_info;
5657
      end_local_got = local_got + locsymcount;
5658
      local_plt = (struct plt_entry **) end_local_got;
5659
      end_local_plt = local_plt + locsymcount;
5660
      lgot_masks = (char *) end_local_plt;
5661
 
5662
      for (; local_got < end_local_got; ++local_got, ++lgot_masks)
5663
        if (*local_got > 0)
5664
          {
5665
            unsigned int need = 0;
5666
            if ((*lgot_masks & TLS_TLS) != 0)
5667
              {
5668
                if ((*lgot_masks & TLS_GD) != 0)
5669
                  need += 8;
5670
                if ((*lgot_masks & TLS_LD) != 0)
5671
                  htab->tlsld_got.refcount += 1;
5672
                if ((*lgot_masks & (TLS_TPREL | TLS_TPRELGD)) != 0)
5673
                  need += 4;
5674
                if ((*lgot_masks & TLS_DTPREL) != 0)
5675
                  need += 4;
5676
              }
5677
            else
5678
              need += 4;
5679
            if (need == 0)
5680
              *local_got = (bfd_vma) -1;
5681
            else
5682
              {
5683
                *local_got = allocate_got (htab, need);
5684
                if (info->shared)
5685
                  htab->relgot->size += (need
5686
                                         * (sizeof (Elf32_External_Rela) / 4));
5687
              }
5688
          }
5689
        else
5690
          *local_got = (bfd_vma) -1;
5691
 
5692
      if (htab->is_vxworks)
5693
        continue;
5694
 
5695
      /* Allocate space for calls to local STT_GNU_IFUNC syms in .iplt.  */
5696
      for (; local_plt < end_local_plt; ++local_plt)
5697
        {
5698
          struct plt_entry *ent;
5699
          bfd_boolean doneone = FALSE;
5700
          bfd_vma plt_offset = 0, glink_offset = 0;
5701
 
5702
          for (ent = *local_plt; ent != NULL; ent = ent->next)
5703
            if (ent->plt.refcount > 0)
5704
              {
5705
                s = htab->iplt;
5706
 
5707
                if (!doneone)
5708
                  {
5709
                    plt_offset = s->size;
5710
                    s->size += 4;
5711
                  }
5712
                ent->plt.offset = plt_offset;
5713
 
5714
                s = htab->glink;
5715
                if (!doneone || info->shared)
5716
                  {
5717
                    glink_offset = s->size;
5718
                    s->size += GLINK_ENTRY_SIZE;
5719
                  }
5720
                ent->glink_offset = glink_offset;
5721
 
5722
                if (!doneone)
5723
                  {
5724
                    htab->reliplt->size += sizeof (Elf32_External_Rela);
5725
                    doneone = TRUE;
5726
                  }
5727
              }
5728
            else
5729
              ent->plt.offset = (bfd_vma) -1;
5730
        }
5731
    }
5732
 
5733
  /* Allocate space for global sym dynamic relocs.  */
5734
  elf_link_hash_traverse (elf_hash_table (info), allocate_dynrelocs, info);
5735
 
5736
  if (htab->tlsld_got.refcount > 0)
5737
    {
5738
      htab->tlsld_got.offset = allocate_got (htab, 8);
5739
      if (info->shared)
5740
        htab->relgot->size += sizeof (Elf32_External_Rela);
5741
    }
5742
  else
5743
    htab->tlsld_got.offset = (bfd_vma) -1;
5744
 
5745
  if (htab->got != NULL && htab->plt_type != PLT_VXWORKS)
5746
    {
5747
      unsigned int g_o_t = 32768;
5748
 
5749
      /* If we haven't allocated the header, do so now.  When we get here,
5750
         for old plt/got the got size will be 0 to 32764 (not allocated),
5751
         or 32780 to 65536 (header allocated).  For new plt/got, the
5752
         corresponding ranges are 0 to 32768 and 32780 to 65536.  */
5753
      if (htab->got->size <= 32768)
5754
        {
5755
          g_o_t = htab->got->size;
5756
          if (htab->plt_type == PLT_OLD)
5757
            g_o_t += 4;
5758
          htab->got->size += htab->got_header_size;
5759
        }
5760
 
5761
      htab->elf.hgot->root.u.def.value = g_o_t;
5762
    }
5763
  if (info->shared)
5764
    {
5765
      struct elf_link_hash_entry *sda = htab->sdata[0].sym;
5766
      if (sda != NULL
5767
          && !(sda->root.type == bfd_link_hash_defined
5768
               || sda->root.type == bfd_link_hash_defweak))
5769
        {
5770
          sda->root.type = bfd_link_hash_defined;
5771
          sda->root.u.def.section = htab->elf.hgot->root.u.def.section;
5772
          sda->root.u.def.value = htab->elf.hgot->root.u.def.value;
5773
        }
5774
    }
5775
 
5776
  if (htab->glink != NULL
5777
      && htab->glink->size != 0
5778
      && htab->elf.dynamic_sections_created)
5779
    {
5780
      htab->glink_pltresolve = htab->glink->size;
5781
      /* Space for the branch table.  */
5782
      htab->glink->size += htab->glink->size / (GLINK_ENTRY_SIZE / 4) - 4;
5783
      /* Pad out to align the start of PLTresolve.  */
5784
      htab->glink->size += -htab->glink->size & 15;
5785
      htab->glink->size += GLINK_PLTRESOLVE;
5786
 
5787
      if (htab->emit_stub_syms)
5788
        {
5789
          struct elf_link_hash_entry *sh;
5790
          sh = elf_link_hash_lookup (&htab->elf, "__glink",
5791
                                     TRUE, FALSE, FALSE);
5792
          if (sh == NULL)
5793
            return FALSE;
5794
          if (sh->root.type == bfd_link_hash_new)
5795
            {
5796
              sh->root.type = bfd_link_hash_defined;
5797
              sh->root.u.def.section = htab->glink;
5798
              sh->root.u.def.value = htab->glink_pltresolve;
5799
              sh->ref_regular = 1;
5800
              sh->def_regular = 1;
5801
              sh->ref_regular_nonweak = 1;
5802
              sh->forced_local = 1;
5803
              sh->non_elf = 0;
5804
            }
5805
          sh = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
5806
                                     TRUE, FALSE, FALSE);
5807
          if (sh == NULL)
5808
            return FALSE;
5809
          if (sh->root.type == bfd_link_hash_new)
5810
            {
5811
              sh->root.type = bfd_link_hash_defined;
5812
              sh->root.u.def.section = htab->glink;
5813
              sh->root.u.def.value = htab->glink->size - GLINK_PLTRESOLVE;
5814
              sh->ref_regular = 1;
5815
              sh->def_regular = 1;
5816
              sh->ref_regular_nonweak = 1;
5817
              sh->forced_local = 1;
5818
              sh->non_elf = 0;
5819
            }
5820
        }
5821
    }
5822
 
5823 161 khays
  if (htab->glink != NULL
5824
      && htab->glink->size != 0
5825
      && htab->glink_eh_frame != NULL
5826
      && !bfd_is_abs_section (htab->glink_eh_frame->output_section))
5827
    {
5828
      s = htab->glink_eh_frame;
5829
      s->size = sizeof (glink_eh_frame_cie) + 20;
5830
      if (info->shared)
5831
        {
5832
          s->size += 4;
5833
          if (htab->glink->size - GLINK_PLTRESOLVE + 8 >= 256)
5834
            s->size += 4;
5835
        }
5836
    }
5837
 
5838 14 khays
  /* We've now determined the sizes of the various dynamic sections.
5839
     Allocate memory for them.  */
5840
  relocs = FALSE;
5841
  for (s = htab->elf.dynobj->sections; s != NULL; s = s->next)
5842
    {
5843
      bfd_boolean strip_section = TRUE;
5844
 
5845
      if ((s->flags & SEC_LINKER_CREATED) == 0)
5846
        continue;
5847
 
5848
      if (s == htab->plt
5849
          || s == htab->got)
5850
        {
5851
          /* We'd like to strip these sections if they aren't needed, but if
5852
             we've exported dynamic symbols from them we must leave them.
5853
             It's too late to tell BFD to get rid of the symbols.  */
5854
          if (htab->elf.hplt != NULL)
5855
            strip_section = FALSE;
5856
          /* Strip this section if we don't need it; see the
5857
             comment below.  */
5858
        }
5859
      else if (s == htab->iplt
5860
               || s == htab->glink
5861 161 khays
               || s == htab->glink_eh_frame
5862 14 khays
               || s == htab->sgotplt
5863
               || s == htab->sbss
5864
               || s == htab->dynbss
5865
               || s == htab->dynsbss
5866
               || s == htab->sdata[0].section
5867
               || s == htab->sdata[1].section)
5868
        {
5869
          /* Strip these too.  */
5870
        }
5871
      else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
5872
        {
5873
          if (s->size != 0)
5874
            {
5875
              /* Remember whether there are any relocation sections.  */
5876
              relocs = TRUE;
5877
 
5878
              /* We use the reloc_count field as a counter if we need
5879
                 to copy relocs into the output file.  */
5880
              s->reloc_count = 0;
5881
            }
5882
        }
5883
      else
5884
        {
5885
          /* It's not one of our sections, so don't allocate space.  */
5886
          continue;
5887
        }
5888
 
5889
      if (s->size == 0 && strip_section)
5890
        {
5891
          /* If we don't need this section, strip it from the
5892
             output file.  This is mostly to handle .rela.bss and
5893
             .rela.plt.  We must create both sections in
5894
             create_dynamic_sections, because they must be created
5895
             before the linker maps input sections to output
5896
             sections.  The linker does that before
5897
             adjust_dynamic_symbol is called, and it is that
5898
             function which decides whether anything needs to go
5899
             into these sections.  */
5900
          s->flags |= SEC_EXCLUDE;
5901
          continue;
5902
        }
5903
 
5904
      if ((s->flags & SEC_HAS_CONTENTS) == 0)
5905
        continue;
5906
 
5907
      /* Allocate memory for the section contents.  */
5908
      s->contents = bfd_zalloc (htab->elf.dynobj, s->size);
5909
      if (s->contents == NULL)
5910
        return FALSE;
5911
    }
5912
 
5913
  if (htab->elf.dynamic_sections_created)
5914
    {
5915
      /* Add some entries to the .dynamic section.  We fill in the
5916
         values later, in ppc_elf_finish_dynamic_sections, but we
5917
         must add the entries now so that we get the correct size for
5918
         the .dynamic section.  The DT_DEBUG entry is filled in by the
5919
         dynamic linker and used by the debugger.  */
5920
#define add_dynamic_entry(TAG, VAL) \
5921
  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
5922
 
5923
      if (info->executable)
5924
        {
5925
          if (!add_dynamic_entry (DT_DEBUG, 0))
5926
            return FALSE;
5927
        }
5928
 
5929
      if (htab->plt != NULL && htab->plt->size != 0)
5930
        {
5931
          if (!add_dynamic_entry (DT_PLTGOT, 0)
5932
              || !add_dynamic_entry (DT_PLTRELSZ, 0)
5933
              || !add_dynamic_entry (DT_PLTREL, DT_RELA)
5934
              || !add_dynamic_entry (DT_JMPREL, 0))
5935
            return FALSE;
5936
        }
5937
 
5938
      if (htab->glink != NULL && htab->glink->size != 0)
5939
        {
5940
          if (!add_dynamic_entry (DT_PPC_GOT, 0))
5941
            return FALSE;
5942
          if (!htab->no_tls_get_addr_opt
5943
              && htab->tls_get_addr != NULL
5944
              && htab->tls_get_addr->plt.plist != NULL
5945
              && !add_dynamic_entry (DT_PPC_TLSOPT, 0))
5946
            return FALSE;
5947
        }
5948
 
5949
      if (relocs)
5950
        {
5951
          if (!add_dynamic_entry (DT_RELA, 0)
5952
              || !add_dynamic_entry (DT_RELASZ, 0)
5953
              || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
5954
            return FALSE;
5955
        }
5956
 
5957
      /* If any dynamic relocs apply to a read-only section, then we
5958
         need a DT_TEXTREL entry.  */
5959
      if ((info->flags & DF_TEXTREL) == 0)
5960
        elf_link_hash_traverse (elf_hash_table (info), maybe_set_textrel,
5961
                                info);
5962
 
5963
      if ((info->flags & DF_TEXTREL) != 0)
5964
        {
5965
          if (!add_dynamic_entry (DT_TEXTREL, 0))
5966
            return FALSE;
5967
        }
5968
      if (htab->is_vxworks
5969
          && !elf_vxworks_add_dynamic_entries (output_bfd, info))
5970
        return FALSE;
5971
   }
5972
#undef add_dynamic_entry
5973
 
5974
  return TRUE;
5975
}
5976
 
5977
/* Return TRUE if symbol should be hashed in the `.gnu.hash' section.  */
5978
 
5979
static bfd_boolean
5980
ppc_elf_hash_symbol (struct elf_link_hash_entry *h)
5981
{
5982
  if (h->plt.plist != NULL
5983
      && !h->def_regular
5984
      && (!h->pointer_equality_needed
5985
          || !h->ref_regular_nonweak))
5986
    return FALSE;
5987
 
5988
  return _bfd_elf_hash_symbol (h);
5989
}
5990
 
5991
#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
5992
 
5993
/* Relaxation trampolines.  r12 is available for clobbering (r11, is
5994
   used for some functions that are allowed to break the ABI).  */
5995
static const int shared_stub_entry[] =
5996
  {
5997
    0x7c0802a6, /* mflr 0 */
5998
    0x429f0005, /* bcl 20, 31, .Lxxx */
5999
    0x7d8802a6, /* mflr 12 */
6000
    0x3d8c0000, /* addis 12, 12, (xxx-.Lxxx)@ha */
6001
    0x398c0008, /* addi 12, 12, (xxx-.Lxxx)@l */
6002
    0x7c0803a6, /* mtlr 0 */
6003
    0x7d8903a6, /* mtctr 12 */
6004
    0x4e800420, /* bctr */
6005
  };
6006
 
6007
static const int stub_entry[] =
6008
  {
6009
    0x3d800000, /* lis 12,xxx@ha */
6010
    0x398c0000, /* addi 12,12,xxx@l */
6011
    0x7d8903a6, /* mtctr 12 */
6012
    0x4e800420, /* bctr */
6013
  };
6014
 
6015
static bfd_boolean
6016
ppc_elf_relax_section (bfd *abfd,
6017
                       asection *isec,
6018
                       struct bfd_link_info *link_info,
6019
                       bfd_boolean *again)
6020
{
6021
  struct one_fixup
6022
  {
6023
    struct one_fixup *next;
6024
    asection *tsec;
6025
    /* Final link, can use the symbol offset.  For a
6026
       relocatable link we use the symbol's index.  */
6027
    bfd_vma toff;
6028
    bfd_vma trampoff;
6029
  };
6030
 
6031
  Elf_Internal_Shdr *symtab_hdr;
6032
  bfd_byte *contents = NULL;
6033
  Elf_Internal_Sym *isymbuf = NULL;
6034
  Elf_Internal_Rela *internal_relocs = NULL;
6035
  Elf_Internal_Rela *irel, *irelend;
6036
  struct one_fixup *fixups = NULL;
6037
  unsigned changes = 0;
6038
  struct ppc_elf_link_hash_table *htab;
6039
  bfd_size_type trampoff;
6040
  asection *got2;
6041
  bfd_boolean maybe_pasted;
6042
 
6043
  *again = FALSE;
6044
 
6045
  /* Nothing to do if there are no relocations, and no need to do
6046
     anything with non-alloc or non-code sections.  */
6047
  if ((isec->flags & SEC_ALLOC) == 0
6048
      || (isec->flags & SEC_CODE) == 0
6049
      || (isec->flags & SEC_RELOC) == 0
6050
      || isec->reloc_count == 0)
6051
    return TRUE;
6052
 
6053
  /* We cannot represent the required PIC relocs in the output, so don't
6054
     do anything.  The linker doesn't support mixing -shared and -r
6055
     anyway.  */
6056
  if (link_info->relocatable && link_info->shared)
6057
     return TRUE;
6058
 
6059
  trampoff = (isec->size + 3) & (bfd_vma) -4;
6060
  maybe_pasted = (strcmp (isec->output_section->name, ".init") == 0
6061
                  || strcmp (isec->output_section->name, ".fini") == 0);
6062
  /* Space for a branch around any trampolines.  */
6063
  if (maybe_pasted)
6064
    trampoff += 4;
6065
 
6066
  symtab_hdr = &elf_symtab_hdr (abfd);
6067
 
6068
  /* Get a copy of the native relocations.  */
6069
  internal_relocs = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL,
6070
                                               link_info->keep_memory);
6071
  if (internal_relocs == NULL)
6072
    goto error_return;
6073
 
6074
  htab = ppc_elf_hash_table (link_info);
6075
  got2 = bfd_get_section_by_name (abfd, ".got2");
6076
 
6077
  irelend = internal_relocs + isec->reloc_count;
6078
  for (irel = internal_relocs; irel < irelend; irel++)
6079
    {
6080
      unsigned long r_type = ELF32_R_TYPE (irel->r_info);
6081
      bfd_vma toff, roff;
6082
      asection *tsec;
6083
      struct one_fixup *f;
6084
      size_t insn_offset = 0;
6085
      bfd_vma max_branch_offset, val;
6086
      bfd_byte *hit_addr;
6087
      unsigned long t0;
6088
      struct elf_link_hash_entry *h;
6089
      struct plt_entry **plist;
6090
      unsigned char sym_type;
6091
 
6092
      switch (r_type)
6093
        {
6094
        case R_PPC_REL24:
6095
        case R_PPC_LOCAL24PC:
6096
        case R_PPC_PLTREL24:
6097
          max_branch_offset = 1 << 25;
6098
          break;
6099
 
6100
        case R_PPC_REL14:
6101
        case R_PPC_REL14_BRTAKEN:
6102
        case R_PPC_REL14_BRNTAKEN:
6103
          max_branch_offset = 1 << 15;
6104
          break;
6105
 
6106
        default:
6107
          continue;
6108
        }
6109
 
6110
      /* Get the value of the symbol referred to by the reloc.  */
6111
      h = NULL;
6112
      if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
6113
        {
6114
          /* A local symbol.  */
6115
          Elf_Internal_Sym *isym;
6116
 
6117
          /* Read this BFD's local symbols.  */
6118
          if (isymbuf == NULL)
6119
            {
6120
              isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
6121
              if (isymbuf == NULL)
6122
                isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
6123
                                                symtab_hdr->sh_info, 0,
6124
                                                NULL, NULL, NULL);
6125
              if (isymbuf == 0)
6126
                goto error_return;
6127
            }
6128
          isym = isymbuf + ELF32_R_SYM (irel->r_info);
6129
          if (isym->st_shndx == SHN_UNDEF)
6130
            tsec = bfd_und_section_ptr;
6131
          else if (isym->st_shndx == SHN_ABS)
6132
            tsec = bfd_abs_section_ptr;
6133
          else if (isym->st_shndx == SHN_COMMON)
6134
            tsec = bfd_com_section_ptr;
6135
          else
6136
            tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
6137
 
6138
          toff = isym->st_value;
6139
          sym_type = ELF_ST_TYPE (isym->st_info);
6140
        }
6141
      else
6142
        {
6143
          /* Global symbol handling.  */
6144
          unsigned long indx;
6145
 
6146
          indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
6147
          h = elf_sym_hashes (abfd)[indx];
6148
 
6149
          while (h->root.type == bfd_link_hash_indirect
6150
                 || h->root.type == bfd_link_hash_warning)
6151
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
6152
 
6153
          if (h->root.type == bfd_link_hash_defined
6154
              || h->root.type == bfd_link_hash_defweak)
6155
            {
6156
              tsec = h->root.u.def.section;
6157
              toff = h->root.u.def.value;
6158
            }
6159
          else if (h->root.type == bfd_link_hash_undefined
6160
                   || h->root.type == bfd_link_hash_undefweak)
6161
            {
6162
              tsec = bfd_und_section_ptr;
6163
              toff = link_info->relocatable ? indx : 0;
6164
            }
6165
          else
6166
            continue;
6167
 
6168
          sym_type = h->type;
6169
        }
6170
 
6171
      /* The condition here under which we call find_plt_ent must
6172
         match that in relocate_section.  If we call find_plt_ent here
6173
         but not in relocate_section, or vice versa, then the branch
6174
         destination used here may be incorrect.  */
6175
      plist = NULL;
6176
      if (h != NULL)
6177
        {
6178
          /* We know is_branch_reloc (r_type) is true.  */
6179
          if (h->type == STT_GNU_IFUNC
6180
              || r_type == R_PPC_PLTREL24)
6181
            plist = &h->plt.plist;
6182
        }
6183
      else if (sym_type == STT_GNU_IFUNC
6184
               && elf_local_got_offsets (abfd) != NULL)
6185
        {
6186
          bfd_vma *local_got_offsets = elf_local_got_offsets (abfd);
6187
          struct plt_entry **local_plt = (struct plt_entry **)
6188
            (local_got_offsets + symtab_hdr->sh_info);
6189
          plist = local_plt + ELF32_R_SYM (irel->r_info);
6190
        }
6191
      if (plist != NULL)
6192
        {
6193
          bfd_vma addend = 0;
6194
          struct plt_entry *ent;
6195
 
6196
          if (r_type == R_PPC_PLTREL24 && link_info->shared)
6197
            addend = irel->r_addend;
6198
          ent = find_plt_ent (plist, got2, addend);
6199
          if (ent != NULL)
6200
            {
6201
              if (htab->plt_type == PLT_NEW
6202
                  || h == NULL
6203
                  || !htab->elf.dynamic_sections_created
6204
                  || h->dynindx == -1)
6205
                {
6206
                  tsec = htab->glink;
6207
                  toff = ent->glink_offset;
6208
                }
6209
              else
6210
                {
6211
                  tsec = htab->plt;
6212
                  toff = ent->plt.offset;
6213
                }
6214
            }
6215
        }
6216
 
6217
      /* If the branch and target are in the same section, you have
6218
         no hope of adding stubs.  We'll error out later should the
6219
         branch overflow.  */
6220
      if (tsec == isec)
6221
        continue;
6222
 
6223
      /* There probably isn't any reason to handle symbols in
6224
         SEC_MERGE sections;  SEC_MERGE doesn't seem a likely
6225
         attribute for a code section, and we are only looking at
6226
         branches.  However, implement it correctly here as a
6227
         reference for other target relax_section functions.  */
6228
      if (0 && tsec->sec_info_type == ELF_INFO_TYPE_MERGE)
6229
        {
6230
          /* At this stage in linking, no SEC_MERGE symbol has been
6231
             adjusted, so all references to such symbols need to be
6232
             passed through _bfd_merged_section_offset.  (Later, in
6233
             relocate_section, all SEC_MERGE symbols *except* for
6234
             section symbols have been adjusted.)
6235
 
6236
             gas may reduce relocations against symbols in SEC_MERGE
6237
             sections to a relocation against the section symbol when
6238
             the original addend was zero.  When the reloc is against
6239
             a section symbol we should include the addend in the
6240
             offset passed to _bfd_merged_section_offset, since the
6241
             location of interest is the original symbol.  On the
6242
             other hand, an access to "sym+addend" where "sym" is not
6243
             a section symbol should not include the addend;  Such an
6244
             access is presumed to be an offset from "sym";  The
6245
             location of interest is just "sym".  */
6246
          if (sym_type == STT_SECTION)
6247
            toff += irel->r_addend;
6248
 
6249
          toff = _bfd_merged_section_offset (abfd, &tsec,
6250
                                             elf_section_data (tsec)->sec_info,
6251
                                             toff);
6252
 
6253
          if (sym_type != STT_SECTION)
6254
            toff += irel->r_addend;
6255
        }
6256
      /* PLTREL24 addends are special.  */
6257
      else if (r_type != R_PPC_PLTREL24)
6258
        toff += irel->r_addend;
6259
 
6260
      /* Attempted -shared link of non-pic code loses.  */
6261
      if (tsec->output_section == NULL)
6262
        continue;
6263
 
6264
      roff = irel->r_offset;
6265
 
6266
      /* If the branch is in range, no need to do anything.  */
6267
      if (tsec != bfd_und_section_ptr
6268
          && (!link_info->relocatable
6269
              /* A relocatable link may have sections moved during
6270
                 final link, so do not presume they remain in range.  */
6271
              || tsec->output_section == isec->output_section))
6272
        {
6273
          bfd_vma symaddr, reladdr;
6274
 
6275
          symaddr = tsec->output_section->vma + tsec->output_offset + toff;
6276
          reladdr = isec->output_section->vma + isec->output_offset + roff;
6277
          if (symaddr - reladdr + max_branch_offset < 2 * max_branch_offset)
6278
            continue;
6279
        }
6280
 
6281
      /* Look for an existing fixup to this address.  */
6282
      for (f = fixups; f ; f = f->next)
6283
        if (f->tsec == tsec && f->toff == toff)
6284
          break;
6285
 
6286
      if (f == NULL)
6287
        {
6288
          size_t size;
6289
          unsigned long stub_rtype;
6290
 
6291
          val = trampoff - roff;
6292
          if (val >= max_branch_offset)
6293
            /* Oh dear, we can't reach a trampoline.  Don't try to add
6294
               one.  We'll report an error later.  */
6295
            continue;
6296
 
6297
          if (link_info->shared)
6298
            {
6299
              size = 4 * ARRAY_SIZE (shared_stub_entry);
6300
              insn_offset = 12;
6301
            }
6302
          else
6303
            {
6304
              size = 4 * ARRAY_SIZE (stub_entry);
6305
              insn_offset = 0;
6306
            }
6307
          stub_rtype = R_PPC_RELAX;
6308
          if (tsec == htab->plt
6309
              || tsec == htab->glink)
6310
            {
6311
              stub_rtype = R_PPC_RELAX_PLT;
6312
              if (r_type == R_PPC_PLTREL24)
6313
                stub_rtype = R_PPC_RELAX_PLTREL24;
6314
            }
6315
 
6316
          /* Hijack the old relocation.  Since we need two
6317
             relocations for this use a "composite" reloc.  */
6318
          irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
6319
                                       stub_rtype);
6320
          irel->r_offset = trampoff + insn_offset;
6321
          if (r_type == R_PPC_PLTREL24
6322
              && stub_rtype != R_PPC_RELAX_PLTREL24)
6323
            irel->r_addend = 0;
6324
 
6325
          /* Record the fixup so we don't do it again this section.  */
6326
          f = bfd_malloc (sizeof (*f));
6327
          f->next = fixups;
6328
          f->tsec = tsec;
6329
          f->toff = toff;
6330
          f->trampoff = trampoff;
6331
          fixups = f;
6332
 
6333
          trampoff += size;
6334
          changes++;
6335
        }
6336
      else
6337
        {
6338
          val = f->trampoff - roff;
6339
          if (val >= max_branch_offset)
6340
            continue;
6341
 
6342
          /* Nop out the reloc, since we're finalizing things here.  */
6343
          irel->r_info = ELF32_R_INFO (0, R_PPC_NONE);
6344
        }
6345
 
6346
      /* Get the section contents.  */
6347
      if (contents == NULL)
6348
        {
6349
          /* Get cached copy if it exists.  */
6350
          if (elf_section_data (isec)->this_hdr.contents != NULL)
6351
            contents = elf_section_data (isec)->this_hdr.contents;
6352
          else
6353
            {
6354
              /* Go get them off disk.  */
6355
              if (!bfd_malloc_and_get_section (abfd, isec, &contents))
6356
                goto error_return;
6357
            }
6358
        }
6359
 
6360
      /* Fix up the existing branch to hit the trampoline.  */
6361
      hit_addr = contents + roff;
6362
      switch (r_type)
6363
        {
6364
        case R_PPC_REL24:
6365
        case R_PPC_LOCAL24PC:
6366
        case R_PPC_PLTREL24:
6367
          t0 = bfd_get_32 (abfd, hit_addr);
6368
          t0 &= ~0x3fffffc;
6369
          t0 |= val & 0x3fffffc;
6370
          bfd_put_32 (abfd, t0, hit_addr);
6371
          break;
6372
 
6373
        case R_PPC_REL14:
6374
        case R_PPC_REL14_BRTAKEN:
6375
        case R_PPC_REL14_BRNTAKEN:
6376
          t0 = bfd_get_32 (abfd, hit_addr);
6377
          t0 &= ~0xfffc;
6378
          t0 |= val & 0xfffc;
6379
          bfd_put_32 (abfd, t0, hit_addr);
6380
          break;
6381
        }
6382
    }
6383
 
6384
  /* Write out the trampolines.  */
6385
  if (fixups != NULL)
6386
    {
6387
      const int *stub;
6388
      bfd_byte *dest;
6389
      int i, size;
6390
 
6391
      do
6392
        {
6393
          struct one_fixup *f = fixups;
6394
          fixups = fixups->next;
6395
          free (f);
6396
        }
6397
      while (fixups);
6398
 
6399
      contents = bfd_realloc_or_free (contents, trampoff);
6400
      if (contents == NULL)
6401
        goto error_return;
6402
 
6403
      isec->size = (isec->size + 3) & (bfd_vma) -4;
6404
      dest = contents + isec->size;
6405
      /* Branch around the trampolines.  */
6406
      if (maybe_pasted)
6407
        {
6408
          bfd_vma val = B + trampoff - isec->size;
6409
          bfd_put_32 (abfd, val, dest);
6410
          dest += 4;
6411
        }
6412
      isec->size = trampoff;
6413
 
6414
      if (link_info->shared)
6415
        {
6416
          stub = shared_stub_entry;
6417
          size = ARRAY_SIZE (shared_stub_entry);
6418
        }
6419
      else
6420
        {
6421
          stub = stub_entry;
6422
          size = ARRAY_SIZE (stub_entry);
6423
        }
6424
 
6425
      i = 0;
6426
      while (dest < contents + trampoff)
6427
        {
6428
          bfd_put_32 (abfd, stub[i], dest);
6429
          i++;
6430
          if (i == size)
6431
            i = 0;
6432
          dest += 4;
6433
        }
6434
      BFD_ASSERT (i == 0);
6435
    }
6436
 
6437
  if (isymbuf != NULL
6438
      && symtab_hdr->contents != (unsigned char *) isymbuf)
6439
    {
6440
      if (! link_info->keep_memory)
6441
        free (isymbuf);
6442
      else
6443
        {
6444
          /* Cache the symbols for elf_link_input_bfd.  */
6445
          symtab_hdr->contents = (unsigned char *) isymbuf;
6446
        }
6447
    }
6448
 
6449
  if (contents != NULL
6450
      && elf_section_data (isec)->this_hdr.contents != contents)
6451
    {
6452
      if (!changes && !link_info->keep_memory)
6453
        free (contents);
6454
      else
6455
        {
6456
          /* Cache the section contents for elf_link_input_bfd.  */
6457
          elf_section_data (isec)->this_hdr.contents = contents;
6458
        }
6459
    }
6460
 
6461
  if (changes != 0)
6462
    {
6463
      /* Append sufficient NOP relocs so we can write out relocation
6464
         information for the trampolines.  */
6465
      Elf_Internal_Shdr *rel_hdr;
6466
      Elf_Internal_Rela *new_relocs = bfd_malloc ((changes + isec->reloc_count)
6467
                                                  * sizeof (*new_relocs));
6468
      unsigned ix;
6469
 
6470
      if (!new_relocs)
6471
        goto error_return;
6472
      memcpy (new_relocs, internal_relocs,
6473
              isec->reloc_count * sizeof (*new_relocs));
6474
      for (ix = changes; ix--;)
6475
        {
6476
          irel = new_relocs + ix + isec->reloc_count;
6477
 
6478
          irel->r_info = ELF32_R_INFO (0, R_PPC_NONE);
6479
        }
6480
      if (internal_relocs != elf_section_data (isec)->relocs)
6481
        free (internal_relocs);
6482
      elf_section_data (isec)->relocs = new_relocs;
6483
      isec->reloc_count += changes;
6484
      rel_hdr = _bfd_elf_single_rel_hdr (isec);
6485
      rel_hdr->sh_size += changes * rel_hdr->sh_entsize;
6486
    }
6487
  else if (elf_section_data (isec)->relocs != internal_relocs)
6488
    free (internal_relocs);
6489
 
6490
  *again = changes != 0;
6491
  if (!*again && link_info->relocatable)
6492
    {
6493
      /* Convert the internal relax relocs to external form.  */
6494
      for (irel = internal_relocs; irel < irelend; irel++)
6495
        if (ELF32_R_TYPE (irel->r_info) == R_PPC_RELAX)
6496
          {
6497
            unsigned long r_symndx = ELF32_R_SYM (irel->r_info);
6498
 
6499
            /* Rewrite the reloc and convert one of the trailing nop
6500
               relocs to describe this relocation.  */
6501
            BFD_ASSERT (ELF32_R_TYPE (irelend[-1].r_info) == R_PPC_NONE);
6502
            /* The relocs are at the bottom 2 bytes */
6503
            irel[0].r_offset += 2;
6504
            memmove (irel + 1, irel, (irelend - irel - 1) * sizeof (*irel));
6505
            irel[0].r_info = ELF32_R_INFO (r_symndx, R_PPC_ADDR16_HA);
6506
            irel[1].r_offset += 4;
6507
            irel[1].r_info = ELF32_R_INFO (r_symndx, R_PPC_ADDR16_LO);
6508
            irel++;
6509
          }
6510
    }
6511
 
6512
  return TRUE;
6513
 
6514
 error_return:
6515
  if (isymbuf != NULL && (unsigned char *) isymbuf != symtab_hdr->contents)
6516
    free (isymbuf);
6517
  if (contents != NULL
6518
      && elf_section_data (isec)->this_hdr.contents != contents)
6519
    free (contents);
6520
  if (internal_relocs != NULL
6521
      && elf_section_data (isec)->relocs != internal_relocs)
6522
    free (internal_relocs);
6523
  return FALSE;
6524
}
6525
 
6526
/* What to do when ld finds relocations against symbols defined in
6527
   discarded sections.  */
6528
 
6529
static unsigned int
6530
ppc_elf_action_discarded (asection *sec)
6531
{
6532
  if (strcmp (".fixup", sec->name) == 0)
6533
    return 0;
6534
 
6535
  if (strcmp (".got2", sec->name) == 0)
6536
    return 0;
6537
 
6538
  return _bfd_elf_default_action_discarded (sec);
6539
}
6540
 
6541
/* Fill in the address for a pointer generated in a linker section.  */
6542
 
6543
static bfd_vma
6544
elf_finish_pointer_linker_section (bfd *input_bfd,
6545
                                   elf_linker_section_t *lsect,
6546
                                   struct elf_link_hash_entry *h,
6547
                                   bfd_vma relocation,
6548
                                   const Elf_Internal_Rela *rel)
6549
{
6550
  elf_linker_section_pointers_t *linker_section_ptr;
6551
 
6552
  BFD_ASSERT (lsect != NULL);
6553
 
6554
  if (h != NULL)
6555
    {
6556
      /* Handle global symbol.  */
6557
      struct ppc_elf_link_hash_entry *eh;
6558
 
6559
      eh = (struct ppc_elf_link_hash_entry *) h;
6560
      BFD_ASSERT (eh->elf.def_regular);
6561
      linker_section_ptr = eh->linker_section_pointer;
6562
    }
6563
  else
6564
    {
6565
      /* Handle local symbol.  */
6566
      unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
6567
 
6568
      BFD_ASSERT (is_ppc_elf (input_bfd));
6569
      BFD_ASSERT (elf_local_ptr_offsets (input_bfd) != NULL);
6570
      linker_section_ptr = elf_local_ptr_offsets (input_bfd)[r_symndx];
6571
    }
6572
 
6573
  linker_section_ptr = elf_find_pointer_linker_section (linker_section_ptr,
6574
                                                        rel->r_addend,
6575
                                                        lsect);
6576
  BFD_ASSERT (linker_section_ptr != NULL);
6577
 
6578
  /* Offset will always be a multiple of four, so use the bottom bit
6579
     as a "written" flag.  */
6580
  if ((linker_section_ptr->offset & 1) == 0)
6581
    {
6582
      bfd_put_32 (lsect->section->owner,
6583
                  relocation + linker_section_ptr->addend,
6584
                  lsect->section->contents + linker_section_ptr->offset);
6585
      linker_section_ptr->offset += 1;
6586
    }
6587
 
6588
  relocation = (lsect->section->output_section->vma
6589
                + lsect->section->output_offset
6590
                + linker_section_ptr->offset - 1
6591
                - SYM_VAL (lsect->sym));
6592
 
6593
#ifdef DEBUG
6594
  fprintf (stderr,
6595
           "Finish pointer in linker section %s, offset = %ld (0x%lx)\n",
6596
           lsect->name, (long) relocation, (long) relocation);
6597
#endif
6598
 
6599
  return relocation;
6600
}
6601
 
6602
#define PPC_LO(v) ((v) & 0xffff)
6603
#define PPC_HI(v) (((v) >> 16) & 0xffff)
6604
#define PPC_HA(v) PPC_HI ((v) + 0x8000)
6605
 
6606
static void
6607
write_glink_stub (struct plt_entry *ent, asection *plt_sec, unsigned char *p,
6608
                  struct bfd_link_info *info)
6609
{
6610
  struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
6611
  bfd *output_bfd = info->output_bfd;
6612
  bfd_vma plt;
6613
 
6614
  plt = ((ent->plt.offset & ~1)
6615
         + plt_sec->output_section->vma
6616
         + plt_sec->output_offset);
6617
 
6618
  if (info->shared)
6619
    {
6620
      bfd_vma got = 0;
6621
 
6622
      if (ent->addend >= 32768)
6623
        got = (ent->addend
6624
               + ent->sec->output_section->vma
6625
               + ent->sec->output_offset);
6626
      else if (htab->elf.hgot != NULL)
6627
        got = SYM_VAL (htab->elf.hgot);
6628
 
6629
      plt -= got;
6630
 
6631
      if (plt + 0x8000 < 0x10000)
6632
        {
6633
          bfd_put_32 (output_bfd, LWZ_11_30 + PPC_LO (plt), p);
6634
          p += 4;
6635
          bfd_put_32 (output_bfd, MTCTR_11, p);
6636
          p += 4;
6637
          bfd_put_32 (output_bfd, BCTR, p);
6638
          p += 4;
6639
          bfd_put_32 (output_bfd, NOP, p);
6640
          p += 4;
6641
        }
6642
      else
6643
        {
6644
          bfd_put_32 (output_bfd, ADDIS_11_30 + PPC_HA (plt), p);
6645
          p += 4;
6646
          bfd_put_32 (output_bfd, LWZ_11_11 + PPC_LO (plt), p);
6647
          p += 4;
6648
          bfd_put_32 (output_bfd, MTCTR_11, p);
6649
          p += 4;
6650
          bfd_put_32 (output_bfd, BCTR, p);
6651
          p += 4;
6652
        }
6653
    }
6654
  else
6655
    {
6656
      bfd_put_32 (output_bfd, LIS_11 + PPC_HA (plt), p);
6657
      p += 4;
6658
      bfd_put_32 (output_bfd, LWZ_11_11 + PPC_LO (plt), p);
6659
      p += 4;
6660
      bfd_put_32 (output_bfd, MTCTR_11, p);
6661
      p += 4;
6662
      bfd_put_32 (output_bfd, BCTR, p);
6663
      p += 4;
6664
    }
6665
}
6666
 
6667
/* Return true if symbol is defined statically.  */
6668
 
6669
static bfd_boolean
6670
is_static_defined (struct elf_link_hash_entry *h)
6671
{
6672
  return ((h->root.type == bfd_link_hash_defined
6673
           || h->root.type == bfd_link_hash_defweak)
6674
          && h->root.u.def.section != NULL
6675
          && h->root.u.def.section->output_section != NULL);
6676
}
6677
 
6678
/* If INSN is an opcode that may be used with an @tls operand, return
6679
   the transformed insn for TLS optimisation, otherwise return 0.  If
6680
   REG is non-zero only match an insn with RB or RA equal to REG.  */
6681
 
6682
unsigned int
6683
_bfd_elf_ppc_at_tls_transform (unsigned int insn, unsigned int reg)
6684
{
6685
  unsigned int rtra;
6686
 
6687
  if ((insn & (0x3f << 26)) != 31 << 26)
6688
    return 0;
6689
 
6690
  if (reg == 0 || ((insn >> 11) & 0x1f) == reg)
6691
    rtra = insn & ((1 << 26) - (1 << 16));
6692
  else if (((insn >> 16) & 0x1f) == reg)
6693
    rtra = (insn & (0x1f << 21)) | ((insn & (0x1f << 11)) << 5);
6694
  else
6695
    return 0;
6696
 
6697
  if ((insn & (0x3ff << 1)) == 266 << 1)
6698
    /* add -> addi.  */
6699
    insn = 14 << 26;
6700
  else if ((insn & (0x1f << 1)) == 23 << 1
6701
           && ((insn & (0x1f << 6)) < 14 << 6
6702
               || ((insn & (0x1f << 6)) >= 16 << 6
6703
                   && (insn & (0x1f << 6)) < 24 << 6)))
6704
    /* load and store indexed -> dform.  */
6705
    insn = (32 | ((insn >> 6) & 0x1f)) << 26;
6706
  else if ((insn & (((0x1a << 5) | 0x1f) << 1)) == 21 << 1)
6707
    /* ldx, ldux, stdx, stdux -> ld, ldu, std, stdu.  */
6708
    insn = ((58 | ((insn >> 6) & 4)) << 26) | ((insn >> 6) & 1);
6709
  else if ((insn & (((0x1f << 5) | 0x1f) << 1)) == 341 << 1)
6710
    /* lwax -> lwa.  */
6711
    insn = (58 << 26) | 2;
6712
  else
6713
    return 0;
6714
  insn |= rtra;
6715
  return insn;
6716
}
6717
 
6718
/* If INSN is an opcode that may be used with an @tprel operand, return
6719
   the transformed insn for an undefined weak symbol, ie. with the
6720
   thread pointer REG operand removed.  Otherwise return 0.  */
6721
 
6722
unsigned int
6723
_bfd_elf_ppc_at_tprel_transform (unsigned int insn, unsigned int reg)
6724
{
6725
  if ((insn & (0x1f << 16)) == reg << 16
6726
      && ((insn & (0x3f << 26)) == 14u << 26 /* addi */
6727
          || (insn & (0x3f << 26)) == 15u << 26 /* addis */
6728
          || (insn & (0x3f << 26)) == 32u << 26 /* lwz */
6729
          || (insn & (0x3f << 26)) == 34u << 26 /* lbz */
6730
          || (insn & (0x3f << 26)) == 36u << 26 /* stw */
6731
          || (insn & (0x3f << 26)) == 38u << 26 /* stb */
6732
          || (insn & (0x3f << 26)) == 40u << 26 /* lhz */
6733
          || (insn & (0x3f << 26)) == 42u << 26 /* lha */
6734
          || (insn & (0x3f << 26)) == 44u << 26 /* sth */
6735
          || (insn & (0x3f << 26)) == 46u << 26 /* lmw */
6736
          || (insn & (0x3f << 26)) == 47u << 26 /* stmw */
6737
          || (insn & (0x3f << 26)) == 48u << 26 /* lfs */
6738
          || (insn & (0x3f << 26)) == 50u << 26 /* lfd */
6739
          || (insn & (0x3f << 26)) == 52u << 26 /* stfs */
6740
          || (insn & (0x3f << 26)) == 54u << 26 /* stfd */
6741
          || ((insn & (0x3f << 26)) == 58u << 26 /* lwa,ld,lmd */
6742
              && (insn & 3) != 1)
6743
          || ((insn & (0x3f << 26)) == 62u << 26 /* std, stmd */
6744
              && ((insn & 3) == 0 || (insn & 3) == 3))))
6745
    {
6746
      insn &= ~(0x1f << 16);
6747
    }
6748
  else if ((insn & (0x1f << 21)) == reg << 21
6749
           && ((insn & (0x3e << 26)) == 24u << 26 /* ori, oris */
6750
               || (insn & (0x3e << 26)) == 26u << 26 /* xori,xoris */
6751
               || (insn & (0x3e << 26)) == 28u << 26 /* andi,andis */))
6752
    {
6753
      insn &= ~(0x1f << 21);
6754
      insn |= (insn & (0x1f << 16)) << 5;
6755
      if ((insn & (0x3e << 26)) == 26 << 26 /* xori,xoris */)
6756
        insn -= 2 >> 26;  /* convert to ori,oris */
6757
    }
6758
  else
6759
    insn = 0;
6760
  return insn;
6761
}
6762
 
6763
/* The RELOCATE_SECTION function is called by the ELF backend linker
6764
   to handle the relocations for a section.
6765
 
6766
   The relocs are always passed as Rela structures; if the section
6767
   actually uses Rel structures, the r_addend field will always be
6768
   zero.
6769
 
6770
   This function is responsible for adjust the section contents as
6771
   necessary, and (if using Rela relocs and generating a
6772
   relocatable output file) adjusting the reloc addend as
6773
   necessary.
6774
 
6775
   This function does not have to worry about setting the reloc
6776
   address or the reloc symbol index.
6777
 
6778
   LOCAL_SYMS is a pointer to the swapped in local symbols.
6779
 
6780
   LOCAL_SECTIONS is an array giving the section in the input file
6781
   corresponding to the st_shndx field of each local symbol.
6782
 
6783
   The global hash table entry for the global symbols can be found
6784
   via elf_sym_hashes (input_bfd).
6785
 
6786
   When generating relocatable output, this function must handle
6787
   STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
6788
   going to be the section symbol corresponding to the output
6789
   section, which means that the addend must be adjusted
6790
   accordingly.  */
6791
 
6792
static bfd_boolean
6793
ppc_elf_relocate_section (bfd *output_bfd,
6794
                          struct bfd_link_info *info,
6795
                          bfd *input_bfd,
6796
                          asection *input_section,
6797
                          bfd_byte *contents,
6798
                          Elf_Internal_Rela *relocs,
6799
                          Elf_Internal_Sym *local_syms,
6800
                          asection **local_sections)
6801
{
6802
  Elf_Internal_Shdr *symtab_hdr;
6803
  struct elf_link_hash_entry **sym_hashes;
6804
  struct ppc_elf_link_hash_table *htab;
6805
  Elf_Internal_Rela *rel;
6806
  Elf_Internal_Rela *relend;
6807
  Elf_Internal_Rela outrel;
6808
  asection *got2, *sreloc = NULL;
6809
  bfd_vma *local_got_offsets;
6810
  bfd_boolean ret = TRUE;
6811
  bfd_vma d_offset = (bfd_big_endian (output_bfd) ? 2 : 0);
6812
  bfd_boolean is_vxworks_tls;
6813
 
6814
#ifdef DEBUG
6815
  _bfd_error_handler ("ppc_elf_relocate_section called for %B section %A, "
6816
                      "%ld relocations%s",
6817
                      input_bfd, input_section,
6818
                      (long) input_section->reloc_count,
6819
                      (info->relocatable) ? " (relocatable)" : "");
6820
#endif
6821
 
6822
  got2 = bfd_get_section_by_name (input_bfd, ".got2");
6823
 
6824
  /* Initialize howto table if not already done.  */
6825
  if (!ppc_elf_howto_table[R_PPC_ADDR32])
6826
    ppc_elf_howto_init ();
6827
 
6828
  htab = ppc_elf_hash_table (info);
6829
  local_got_offsets = elf_local_got_offsets (input_bfd);
6830
  symtab_hdr = &elf_symtab_hdr (input_bfd);
6831
  sym_hashes = elf_sym_hashes (input_bfd);
6832
  /* We have to handle relocations in vxworks .tls_vars sections
6833
     specially, because the dynamic loader is 'weird'.  */
6834
  is_vxworks_tls = (htab->is_vxworks && info->shared
6835
                    && !strcmp (input_section->output_section->name,
6836
                                ".tls_vars"));
6837
  rel = relocs;
6838
  relend = relocs + input_section->reloc_count;
6839
  for (; rel < relend; rel++)
6840
    {
6841
      enum elf_ppc_reloc_type r_type;
6842
      bfd_vma addend;
6843
      bfd_reloc_status_type r;
6844
      Elf_Internal_Sym *sym;
6845
      asection *sec;
6846
      struct elf_link_hash_entry *h;
6847
      const char *sym_name;
6848
      reloc_howto_type *howto;
6849
      unsigned long r_symndx;
6850
      bfd_vma relocation;
6851
      bfd_vma branch_bit, from;
6852
      bfd_boolean unresolved_reloc;
6853
      bfd_boolean warned;
6854
      unsigned int tls_type, tls_mask, tls_gd;
6855
      struct plt_entry **ifunc;
6856
 
6857
      r_type = ELF32_R_TYPE (rel->r_info);
6858
      sym = NULL;
6859
      sec = NULL;
6860
      h = NULL;
6861
      unresolved_reloc = FALSE;
6862
      warned = FALSE;
6863
      r_symndx = ELF32_R_SYM (rel->r_info);
6864
 
6865
      if (r_symndx < symtab_hdr->sh_info)
6866
        {
6867
          sym = local_syms + r_symndx;
6868
          sec = local_sections[r_symndx];
6869
          sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
6870
 
6871
          relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
6872
        }
6873
      else
6874
        {
6875
          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
6876
                                   r_symndx, symtab_hdr, sym_hashes,
6877
                                   h, sec, relocation,
6878
                                   unresolved_reloc, warned);
6879
 
6880
          sym_name = h->root.root.string;
6881
        }
6882
 
6883
      if (sec != NULL && elf_discarded_section (sec))
6884
        {
6885
          /* For relocs against symbols from removed linkonce sections,
6886
             or sections discarded by a linker script, we just want the
6887
             section contents zeroed.  Avoid any special processing.  */
6888
          howto = NULL;
6889
          if (r_type < R_PPC_max)
6890
            howto = ppc_elf_howto_table[r_type];
6891
          RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
6892
                                           rel, relend, howto, contents);
6893
        }
6894
 
6895
      if (info->relocatable)
6896
        {
6897
          if (got2 != NULL
6898
              && r_type == R_PPC_PLTREL24
6899
              && rel->r_addend >= 32768)
6900
            {
6901
              /* R_PPC_PLTREL24 is rather special.  If non-zero, the
6902
                 addend specifies the GOT pointer offset within .got2.  */
6903
              rel->r_addend += got2->output_offset;
6904
            }
6905
          continue;
6906
        }
6907
 
6908
      /* TLS optimizations.  Replace instruction sequences and relocs
6909
         based on information we collected in tls_optimize.  We edit
6910
         RELOCS so that --emit-relocs will output something sensible
6911
         for the final instruction stream.  */
6912
      tls_mask = 0;
6913
      tls_gd = 0;
6914
      if (h != NULL)
6915
        tls_mask = ((struct ppc_elf_link_hash_entry *) h)->tls_mask;
6916
      else if (local_got_offsets != NULL)
6917
        {
6918
          struct plt_entry **local_plt;
6919
          char *lgot_masks;
6920
          local_plt
6921
            = (struct plt_entry **) (local_got_offsets + symtab_hdr->sh_info);
6922
          lgot_masks = (char *) (local_plt + symtab_hdr->sh_info);
6923
          tls_mask = lgot_masks[r_symndx];
6924
        }
6925
 
6926
      /* Ensure reloc mapping code below stays sane.  */
6927
      if ((R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TLSGD16 & 3)
6928
          || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TLSGD16_LO & 3)
6929
          || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TLSGD16_HI & 3)
6930
          || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TLSGD16_HA & 3)
6931
          || (R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TPREL16 & 3)
6932
          || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TPREL16_LO & 3)
6933
          || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TPREL16_HI & 3)
6934
          || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TPREL16_HA & 3))
6935
        abort ();
6936
      switch (r_type)
6937
        {
6938
        default:
6939
          break;
6940
 
6941
        case R_PPC_GOT_TPREL16:
6942
        case R_PPC_GOT_TPREL16_LO:
6943
          if ((tls_mask & TLS_TLS) != 0
6944
              && (tls_mask & TLS_TPREL) == 0)
6945
            {
6946
              bfd_vma insn;
6947
 
6948
              insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
6949
              insn &= 31 << 21;
6950
              insn |= 0x3c020000;       /* addis 0,2,0 */
6951
              bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
6952
              r_type = R_PPC_TPREL16_HA;
6953
              rel->r_info = ELF32_R_INFO (r_symndx, r_type);
6954
            }
6955
          break;
6956
 
6957
        case R_PPC_TLS:
6958
          if ((tls_mask & TLS_TLS) != 0
6959
              && (tls_mask & TLS_TPREL) == 0)
6960
            {
6961
              bfd_vma insn;
6962
 
6963
              insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
6964
              insn = _bfd_elf_ppc_at_tls_transform (insn, 2);
6965
              if (insn == 0)
6966
                abort ();
6967
              bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
6968
              r_type = R_PPC_TPREL16_LO;
6969
              rel->r_info = ELF32_R_INFO (r_symndx, r_type);
6970
 
6971
              /* Was PPC_TLS which sits on insn boundary, now
6972
                 PPC_TPREL16_LO which is at low-order half-word.  */
6973
              rel->r_offset += d_offset;
6974
            }
6975
          break;
6976
 
6977
        case R_PPC_GOT_TLSGD16_HI:
6978
        case R_PPC_GOT_TLSGD16_HA:
6979
          tls_gd = TLS_TPRELGD;
6980
          if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
6981
            goto tls_gdld_hi;
6982
          break;
6983
 
6984
        case R_PPC_GOT_TLSLD16_HI:
6985
        case R_PPC_GOT_TLSLD16_HA:
6986
          if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
6987
            {
6988
            tls_gdld_hi:
6989
              if ((tls_mask & tls_gd) != 0)
6990
                r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
6991
                          + R_PPC_GOT_TPREL16);
6992
              else
6993
                {
6994
                  bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
6995
                  rel->r_offset -= d_offset;
6996
                  r_type = R_PPC_NONE;
6997
                }
6998
              rel->r_info = ELF32_R_INFO (r_symndx, r_type);
6999
            }
7000
          break;
7001
 
7002
        case R_PPC_GOT_TLSGD16:
7003
        case R_PPC_GOT_TLSGD16_LO:
7004
          tls_gd = TLS_TPRELGD;
7005
          if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
7006
            goto tls_ldgd_opt;
7007
          break;
7008
 
7009
        case R_PPC_GOT_TLSLD16:
7010
        case R_PPC_GOT_TLSLD16_LO:
7011
          if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
7012
            {
7013
              unsigned int insn1, insn2;
7014
              bfd_vma offset;
7015
 
7016
            tls_ldgd_opt:
7017
              offset = (bfd_vma) -1;
7018
              /* If not using the newer R_PPC_TLSGD/LD to mark
7019
                 __tls_get_addr calls, we must trust that the call
7020
                 stays with its arg setup insns, ie. that the next
7021
                 reloc is the __tls_get_addr call associated with
7022
                 the current reloc.  Edit both insns.  */
7023
              if (input_section->has_tls_get_addr_call
7024
                  && rel + 1 < relend
7025
                  && branch_reloc_hash_match (input_bfd, rel + 1,
7026
                                              htab->tls_get_addr))
7027
                offset = rel[1].r_offset;
7028
              if ((tls_mask & tls_gd) != 0)
7029
                {
7030
                  /* IE */
7031
                  insn1 = bfd_get_32 (output_bfd,
7032
                                      contents + rel->r_offset - d_offset);
7033
                  insn1 &= (1 << 26) - 1;
7034
                  insn1 |= 32 << 26;    /* lwz */
7035
                  if (offset != (bfd_vma) -1)
7036
                    {
7037
                      rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE);
7038
                      insn2 = 0x7c631214;       /* add 3,3,2 */
7039
                      bfd_put_32 (output_bfd, insn2, contents + offset);
7040
                    }
7041
                  r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
7042
                            + R_PPC_GOT_TPREL16);
7043
                  rel->r_info = ELF32_R_INFO (r_symndx, r_type);
7044
                }
7045
              else
7046
                {
7047
                  /* LE */
7048
                  insn1 = 0x3c620000;   /* addis 3,2,0 */
7049
                  if (tls_gd == 0)
7050
                    {
7051
                      /* Was an LD reloc.  */
7052
                      for (r_symndx = 0;
7053
                           r_symndx < symtab_hdr->sh_info;
7054
                           r_symndx++)
7055
                        if (local_sections[r_symndx] == sec)
7056
                          break;
7057
                      if (r_symndx >= symtab_hdr->sh_info)
7058
                        r_symndx = STN_UNDEF;
7059
                      rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
7060
                      if (r_symndx != STN_UNDEF)
7061
                        rel->r_addend -= (local_syms[r_symndx].st_value
7062
                                          + sec->output_offset
7063
                                          + sec->output_section->vma);
7064
                    }
7065
                  r_type = R_PPC_TPREL16_HA;
7066
                  rel->r_info = ELF32_R_INFO (r_symndx, r_type);
7067
                  if (offset != (bfd_vma) -1)
7068
                    {
7069
                      rel[1].r_info = ELF32_R_INFO (r_symndx, R_PPC_TPREL16_LO);
7070
                      rel[1].r_offset = offset + d_offset;
7071
                      rel[1].r_addend = rel->r_addend;
7072
                      insn2 = 0x38630000;       /* addi 3,3,0 */
7073
                      bfd_put_32 (output_bfd, insn2, contents + offset);
7074
                    }
7075
                }
7076
              bfd_put_32 (output_bfd, insn1,
7077
                          contents + rel->r_offset - d_offset);
7078
              if (tls_gd == 0)
7079
                {
7080
                  /* We changed the symbol on an LD reloc.  Start over
7081
                     in order to get h, sym, sec etc. right.  */
7082
                  rel--;
7083
                  continue;
7084
                }
7085
            }
7086
          break;
7087
 
7088
        case R_PPC_TLSGD:
7089
          if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
7090
            {
7091
              unsigned int insn2;
7092
              bfd_vma offset = rel->r_offset;
7093
 
7094
              if ((tls_mask & TLS_TPRELGD) != 0)
7095
                {
7096
                  /* IE */
7097
                  r_type = R_PPC_NONE;
7098
                  insn2 = 0x7c631214;   /* add 3,3,2 */
7099
                }
7100
              else
7101
                {
7102
                  /* LE */
7103
                  r_type = R_PPC_TPREL16_LO;
7104
                  rel->r_offset += d_offset;
7105
                  insn2 = 0x38630000;   /* addi 3,3,0 */
7106
                }
7107
              rel->r_info = ELF32_R_INFO (r_symndx, r_type);
7108
              bfd_put_32 (output_bfd, insn2, contents + offset);
7109
              /* Zap the reloc on the _tls_get_addr call too.  */
7110
              BFD_ASSERT (offset == rel[1].r_offset);
7111
              rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE);
7112
            }
7113
          break;
7114
 
7115
        case R_PPC_TLSLD:
7116
          if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
7117
            {
7118
              unsigned int insn2;
7119
 
7120
              for (r_symndx = 0;
7121
                   r_symndx < symtab_hdr->sh_info;
7122
                   r_symndx++)
7123
                if (local_sections[r_symndx] == sec)
7124
                  break;
7125
              if (r_symndx >= symtab_hdr->sh_info)
7126
                r_symndx = STN_UNDEF;
7127
              rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
7128
              if (r_symndx != STN_UNDEF)
7129
                rel->r_addend -= (local_syms[r_symndx].st_value
7130
                                  + sec->output_offset
7131
                                  + sec->output_section->vma);
7132
 
7133
              rel->r_info = ELF32_R_INFO (r_symndx, R_PPC_TPREL16_LO);
7134
              rel->r_offset += d_offset;
7135
              insn2 = 0x38630000;       /* addi 3,3,0 */
7136
              bfd_put_32 (output_bfd, insn2,
7137
                          contents + rel->r_offset - d_offset);
7138
              /* Zap the reloc on the _tls_get_addr call too.  */
7139
              BFD_ASSERT (rel->r_offset - d_offset == rel[1].r_offset);
7140
              rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE);
7141
              rel--;
7142
              continue;
7143
            }
7144
          break;
7145
        }
7146
 
7147
      /* Handle other relocations that tweak non-addend part of insn.  */
7148
      branch_bit = 0;
7149
      switch (r_type)
7150
        {
7151
        default:
7152
          break;
7153
 
7154
          /* Branch taken prediction relocations.  */
7155
        case R_PPC_ADDR14_BRTAKEN:
7156
        case R_PPC_REL14_BRTAKEN:
7157
          branch_bit = BRANCH_PREDICT_BIT;
7158
          /* Fall thru */
7159
 
7160
          /* Branch not taken prediction relocations.  */
7161
        case R_PPC_ADDR14_BRNTAKEN:
7162
        case R_PPC_REL14_BRNTAKEN:
7163
          {
7164
            bfd_vma insn;
7165
 
7166
            insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
7167
            insn &= ~BRANCH_PREDICT_BIT;
7168
            insn |= branch_bit;
7169
 
7170
            from = (rel->r_offset
7171
                    + input_section->output_offset
7172
                    + input_section->output_section->vma);
7173
 
7174
            /* Invert 'y' bit if not the default.  */
7175
            if ((bfd_signed_vma) (relocation + rel->r_addend - from) < 0)
7176
              insn ^= BRANCH_PREDICT_BIT;
7177
 
7178
            bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
7179
            break;
7180
          }
7181
        }
7182
 
7183
      ifunc = NULL;
7184
      if (!htab->is_vxworks)
7185
        {
7186
          struct plt_entry *ent;
7187
 
7188
          if (h != NULL)
7189
            {
7190
              if (h->type == STT_GNU_IFUNC)
7191
                ifunc = &h->plt.plist;
7192
            }
7193
          else if (local_got_offsets != NULL
7194
                   && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
7195
            {
7196
              struct plt_entry **local_plt;
7197
 
7198
              local_plt = (struct plt_entry **) (local_got_offsets
7199
                                                 + symtab_hdr->sh_info);
7200
              ifunc = local_plt + r_symndx;
7201
            }
7202
 
7203
          ent = NULL;
7204
          if (ifunc != NULL
7205
              && (!info->shared
7206
                  || is_branch_reloc (r_type)))
7207
            {
7208
              addend = 0;
7209
              if (r_type == R_PPC_PLTREL24 && info->shared)
7210
                addend = rel->r_addend;
7211
              ent = find_plt_ent (ifunc, got2, addend);
7212
            }
7213
          if (ent != NULL)
7214
            {
7215
              if (h == NULL && (ent->plt.offset & 1) == 0)
7216
                {
7217
                  Elf_Internal_Rela rela;
7218
                  bfd_byte *loc;
7219
 
7220
                  rela.r_offset = (htab->iplt->output_section->vma
7221
                                   + htab->iplt->output_offset
7222
                                   + ent->plt.offset);
7223
                  rela.r_info = ELF32_R_INFO (0, R_PPC_IRELATIVE);
7224
                  rela.r_addend = relocation;
7225
                  loc = htab->reliplt->contents;
7226
                  loc += (htab->reliplt->reloc_count++
7227
                          * sizeof (Elf32_External_Rela));
7228
                  bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
7229
 
7230
                  ent->plt.offset |= 1;
7231
                }
7232
              if (h == NULL && (ent->glink_offset & 1) == 0)
7233
                {
7234
                  unsigned char *p = ((unsigned char *) htab->glink->contents
7235
                                      + ent->glink_offset);
7236
                  write_glink_stub (ent, htab->iplt, p, info);
7237
                  ent->glink_offset |= 1;
7238
                }
7239
 
7240
              unresolved_reloc = FALSE;
7241
              if (htab->plt_type == PLT_NEW
7242
                  || !htab->elf.dynamic_sections_created
7243
                  || h == NULL)
7244
                relocation = (htab->glink->output_section->vma
7245
                              + htab->glink->output_offset
7246
                              + (ent->glink_offset & ~1));
7247
              else
7248
                relocation = (htab->plt->output_section->vma
7249
                              + htab->plt->output_offset
7250
                              + ent->plt.offset);
7251
            }
7252
        }
7253
 
7254
      addend = rel->r_addend;
7255
      tls_type = 0;
7256
      howto = NULL;
7257
      if (r_type < R_PPC_max)
7258
        howto = ppc_elf_howto_table[r_type];
7259
      switch (r_type)
7260
        {
7261
        default:
7262
          info->callbacks->einfo
7263 161 khays
            (_("%P: %B: unknown relocation type %d for symbol %s\n"),
7264 14 khays
             input_bfd, (int) r_type, sym_name);
7265
 
7266
          bfd_set_error (bfd_error_bad_value);
7267
          ret = FALSE;
7268
          continue;
7269
 
7270
        case R_PPC_NONE:
7271
        case R_PPC_TLS:
7272
        case R_PPC_TLSGD:
7273
        case R_PPC_TLSLD:
7274
        case R_PPC_EMB_MRKREF:
7275
        case R_PPC_GNU_VTINHERIT:
7276
        case R_PPC_GNU_VTENTRY:
7277
          continue;
7278
 
7279
          /* GOT16 relocations.  Like an ADDR16 using the symbol's
7280
             address in the GOT as relocation value instead of the
7281
             symbol's value itself.  Also, create a GOT entry for the
7282
             symbol and put the symbol value there.  */
7283
        case R_PPC_GOT_TLSGD16:
7284
        case R_PPC_GOT_TLSGD16_LO:
7285
        case R_PPC_GOT_TLSGD16_HI:
7286
        case R_PPC_GOT_TLSGD16_HA:
7287
          tls_type = TLS_TLS | TLS_GD;
7288
          goto dogot;
7289
 
7290
        case R_PPC_GOT_TLSLD16:
7291
        case R_PPC_GOT_TLSLD16_LO:
7292
        case R_PPC_GOT_TLSLD16_HI:
7293
        case R_PPC_GOT_TLSLD16_HA:
7294
          tls_type = TLS_TLS | TLS_LD;
7295
          goto dogot;
7296
 
7297
        case R_PPC_GOT_TPREL16:
7298
        case R_PPC_GOT_TPREL16_LO:
7299
        case R_PPC_GOT_TPREL16_HI:
7300
        case R_PPC_GOT_TPREL16_HA:
7301
          tls_type = TLS_TLS | TLS_TPREL;
7302
          goto dogot;
7303
 
7304
        case R_PPC_GOT_DTPREL16:
7305
        case R_PPC_GOT_DTPREL16_LO:
7306
        case R_PPC_GOT_DTPREL16_HI:
7307
        case R_PPC_GOT_DTPREL16_HA:
7308
          tls_type = TLS_TLS | TLS_DTPREL;
7309
          goto dogot;
7310
 
7311
        case R_PPC_GOT16:
7312
        case R_PPC_GOT16_LO:
7313
        case R_PPC_GOT16_HI:
7314
        case R_PPC_GOT16_HA:
7315
          tls_mask = 0;
7316
        dogot:
7317
          {
7318
            /* Relocation is to the entry for this symbol in the global
7319
               offset table.  */
7320
            bfd_vma off;
7321
            bfd_vma *offp;
7322
            unsigned long indx;
7323
 
7324
            if (htab->got == NULL)
7325
              abort ();
7326
 
7327
            indx = 0;
7328
            if (tls_type == (TLS_TLS | TLS_LD)
7329
                && (h == NULL
7330
                    || !h->def_dynamic))
7331
              offp = &htab->tlsld_got.offset;
7332
            else if (h != NULL)
7333
              {
7334
                bfd_boolean dyn;
7335
                dyn = htab->elf.dynamic_sections_created;
7336
                if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
7337
                    || (info->shared
7338
                        && SYMBOL_REFERENCES_LOCAL (info, h)))
7339
                  /* This is actually a static link, or it is a
7340
                     -Bsymbolic link and the symbol is defined
7341
                     locally, or the symbol was forced to be local
7342
                     because of a version file.  */
7343
                  ;
7344
                else
7345
                  {
7346
                    indx = h->dynindx;
7347
                    unresolved_reloc = FALSE;
7348
                  }
7349
                offp = &h->got.offset;
7350
              }
7351
            else
7352
              {
7353
                if (local_got_offsets == NULL)
7354
                  abort ();
7355
                offp = &local_got_offsets[r_symndx];
7356
              }
7357
 
7358
            /* The offset must always be a multiple of 4.  We use the
7359
               least significant bit to record whether we have already
7360
               processed this entry.  */
7361
            off = *offp;
7362
            if ((off & 1) != 0)
7363
              off &= ~1;
7364
            else
7365
              {
7366
                unsigned int tls_m = (tls_mask
7367
                                      & (TLS_LD | TLS_GD | TLS_DTPREL
7368
                                         | TLS_TPREL | TLS_TPRELGD));
7369
 
7370
                if (offp == &htab->tlsld_got.offset)
7371
                  tls_m = TLS_LD;
7372
                else if (h == NULL
7373
                         || !h->def_dynamic)
7374
                  tls_m &= ~TLS_LD;
7375
 
7376
                /* We might have multiple got entries for this sym.
7377
                   Initialize them all.  */
7378
                do
7379
                  {
7380
                    int tls_ty = 0;
7381
 
7382
                    if ((tls_m & TLS_LD) != 0)
7383
                      {
7384
                        tls_ty = TLS_TLS | TLS_LD;
7385
                        tls_m &= ~TLS_LD;
7386
                      }
7387
                    else if ((tls_m & TLS_GD) != 0)
7388
                      {
7389
                        tls_ty = TLS_TLS | TLS_GD;
7390
                        tls_m &= ~TLS_GD;
7391
                      }
7392
                    else if ((tls_m & TLS_DTPREL) != 0)
7393
                      {
7394
                        tls_ty = TLS_TLS | TLS_DTPREL;
7395
                        tls_m &= ~TLS_DTPREL;
7396
                      }
7397
                    else if ((tls_m & (TLS_TPREL | TLS_TPRELGD)) != 0)
7398
                      {
7399
                        tls_ty = TLS_TLS | TLS_TPREL;
7400
                        tls_m = 0;
7401
                      }
7402
 
7403
                    /* Generate relocs for the dynamic linker.  */
7404
                    if ((info->shared || indx != 0)
7405
                        && (offp == &htab->tlsld_got.offset
7406
                            || h == NULL
7407
                            || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
7408
                            || h->root.type != bfd_link_hash_undefweak))
7409
                      {
7410
                        asection *rsec = htab->relgot;
7411
                        bfd_byte * loc;
7412
 
7413
                        outrel.r_offset = (htab->got->output_section->vma
7414
                                           + htab->got->output_offset
7415
                                           + off);
7416
                        outrel.r_addend = 0;
7417
                        if (tls_ty & (TLS_LD | TLS_GD))
7418
                          {
7419
                            outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPMOD32);
7420
                            if (tls_ty == (TLS_TLS | TLS_GD))
7421
                              {
7422
                                loc = rsec->contents;
7423
                                loc += (rsec->reloc_count++
7424
                                        * sizeof (Elf32_External_Rela));
7425
                                bfd_elf32_swap_reloca_out (output_bfd,
7426
                                                           &outrel, loc);
7427
                                outrel.r_offset += 4;
7428
                                outrel.r_info
7429
                                  = ELF32_R_INFO (indx, R_PPC_DTPREL32);
7430
                              }
7431
                          }
7432
                        else if (tls_ty == (TLS_TLS | TLS_DTPREL))
7433
                          outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPREL32);
7434
                        else if (tls_ty == (TLS_TLS | TLS_TPREL))
7435
                          outrel.r_info = ELF32_R_INFO (indx, R_PPC_TPREL32);
7436
                        else if (indx != 0)
7437
                          outrel.r_info = ELF32_R_INFO (indx, R_PPC_GLOB_DAT);
7438
                        else if (ifunc != NULL)
7439
                          outrel.r_info = ELF32_R_INFO (0, R_PPC_IRELATIVE);
7440
                        else
7441
                          outrel.r_info = ELF32_R_INFO (0, R_PPC_RELATIVE);
7442
                        if (indx == 0 && tls_ty != (TLS_TLS | TLS_LD))
7443
                          {
7444
                            outrel.r_addend += relocation;
7445
                            if (tls_ty & (TLS_GD | TLS_DTPREL | TLS_TPREL))
7446
                              outrel.r_addend -= htab->elf.tls_sec->vma;
7447
                          }
7448
                        loc = rsec->contents;
7449
                        loc += (rsec->reloc_count++
7450
                                * sizeof (Elf32_External_Rela));
7451
                        bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
7452
                      }
7453
 
7454
                    /* Init the .got section contents if we're not
7455
                       emitting a reloc.  */
7456
                    else
7457
                      {
7458
                        bfd_vma value = relocation;
7459
 
7460
                        if (tls_ty == (TLS_TLS | TLS_LD))
7461
                          value = 1;
7462
                        else if (tls_ty != 0)
7463
                          {
7464
                            value -= htab->elf.tls_sec->vma + DTP_OFFSET;
7465
                            if (tls_ty == (TLS_TLS | TLS_TPREL))
7466
                              value += DTP_OFFSET - TP_OFFSET;
7467
 
7468
                            if (tls_ty == (TLS_TLS | TLS_GD))
7469
                              {
7470
                                bfd_put_32 (output_bfd, value,
7471
                                            htab->got->contents + off + 4);
7472
                                value = 1;
7473
                              }
7474
                          }
7475
                        bfd_put_32 (output_bfd, value,
7476
                                    htab->got->contents + off);
7477
                      }
7478
 
7479
                    off += 4;
7480
                    if (tls_ty & (TLS_LD | TLS_GD))
7481
                      off += 4;
7482
                  }
7483
                while (tls_m != 0);
7484
 
7485
                off = *offp;
7486
                *offp = off | 1;
7487
              }
7488
 
7489
            if (off >= (bfd_vma) -2)
7490
              abort ();
7491
 
7492
            if ((tls_type & TLS_TLS) != 0)
7493
              {
7494
                if (tls_type != (TLS_TLS | TLS_LD))
7495
                  {
7496
                    if ((tls_mask & TLS_LD) != 0
7497
                        && !(h == NULL
7498
                             || !h->def_dynamic))
7499
                      off += 8;
7500
                    if (tls_type != (TLS_TLS | TLS_GD))
7501
                      {
7502
                        if ((tls_mask & TLS_GD) != 0)
7503
                          off += 8;
7504
                        if (tls_type != (TLS_TLS | TLS_DTPREL))
7505
                          {
7506
                            if ((tls_mask & TLS_DTPREL) != 0)
7507
                              off += 4;
7508
                          }
7509
                      }
7510
                  }
7511
              }
7512
 
7513
            relocation = (htab->got->output_section->vma
7514
                          + htab->got->output_offset
7515
                          + off
7516
                          - SYM_VAL (htab->elf.hgot));
7517
 
7518
            /* Addends on got relocations don't make much sense.
7519
               x+off@got is actually x@got+off, and since the got is
7520
               generated by a hash table traversal, the value in the
7521
               got at entry m+n bears little relation to the entry m.  */
7522
            if (addend != 0)
7523
              info->callbacks->einfo
7524 161 khays
                (_("%P: %H: non-zero addend on %s reloc against `%s'\n"),
7525 14 khays
                 input_bfd, input_section, rel->r_offset,
7526
                 howto->name,
7527
                 sym_name);
7528
          }
7529
        break;
7530
 
7531
        /* Relocations that need no special processing.  */
7532
        case R_PPC_LOCAL24PC:
7533
          /* It makes no sense to point a local relocation
7534
             at a symbol not in this object.  */
7535
          if (unresolved_reloc)
7536
            {
7537
              if (! (*info->callbacks->undefined_symbol) (info,
7538
                                                          h->root.root.string,
7539
                                                          input_bfd,
7540
                                                          input_section,
7541
                                                          rel->r_offset,
7542
                                                          TRUE))
7543
                return FALSE;
7544
              continue;
7545
            }
7546
          break;
7547
 
7548
        case R_PPC_DTPREL16:
7549
        case R_PPC_DTPREL16_LO:
7550
        case R_PPC_DTPREL16_HI:
7551
        case R_PPC_DTPREL16_HA:
7552
          addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
7553
          break;
7554
 
7555
          /* Relocations that may need to be propagated if this is a shared
7556
             object.  */
7557
        case R_PPC_TPREL16:
7558
        case R_PPC_TPREL16_LO:
7559
        case R_PPC_TPREL16_HI:
7560
        case R_PPC_TPREL16_HA:
7561
          if (h != NULL
7562
              && h->root.type == bfd_link_hash_undefweak
7563
              && h->dynindx == -1)
7564
            {
7565
              /* Make this relocation against an undefined weak symbol
7566
                 resolve to zero.  This is really just a tweak, since
7567
                 code using weak externs ought to check that they are
7568
                 defined before using them.  */
7569
              bfd_byte *p = contents + rel->r_offset - d_offset;
7570
              unsigned int insn = bfd_get_32 (output_bfd, p);
7571
              insn = _bfd_elf_ppc_at_tprel_transform (insn, 2);
7572
              if (insn != 0)
7573
                bfd_put_32 (output_bfd, insn, p);
7574
              break;
7575
            }
7576
          addend -= htab->elf.tls_sec->vma + TP_OFFSET;
7577
          /* The TPREL16 relocs shouldn't really be used in shared
7578
             libs as they will result in DT_TEXTREL being set, but
7579
             support them anyway.  */
7580
          goto dodyn;
7581
 
7582
        case R_PPC_TPREL32:
7583
          addend -= htab->elf.tls_sec->vma + TP_OFFSET;
7584
          goto dodyn;
7585
 
7586
        case R_PPC_DTPREL32:
7587
          addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
7588
          goto dodyn;
7589
 
7590
        case R_PPC_DTPMOD32:
7591
          relocation = 1;
7592
          addend = 0;
7593
          goto dodyn;
7594
 
7595
        case R_PPC_REL16:
7596
        case R_PPC_REL16_LO:
7597
        case R_PPC_REL16_HI:
7598
        case R_PPC_REL16_HA:
7599
          break;
7600
 
7601
        case R_PPC_REL32:
7602
          if (h == NULL || h == htab->elf.hgot)
7603
            break;
7604
          /* fall through */
7605
 
7606
        case R_PPC_ADDR32:
7607
        case R_PPC_ADDR16:
7608
        case R_PPC_ADDR16_LO:
7609
        case R_PPC_ADDR16_HI:
7610
        case R_PPC_ADDR16_HA:
7611
        case R_PPC_UADDR32:
7612
        case R_PPC_UADDR16:
7613
          goto dodyn;
7614
 
7615
        case R_PPC_REL24:
7616
        case R_PPC_REL14:
7617
        case R_PPC_REL14_BRTAKEN:
7618
        case R_PPC_REL14_BRNTAKEN:
7619
          /* If these relocations are not to a named symbol, they can be
7620
             handled right here, no need to bother the dynamic linker.  */
7621
          if (SYMBOL_CALLS_LOCAL (info, h)
7622
              || h == htab->elf.hgot)
7623
            break;
7624
          /* fall through */
7625
 
7626
        case R_PPC_ADDR24:
7627
        case R_PPC_ADDR14:
7628
        case R_PPC_ADDR14_BRTAKEN:
7629
        case R_PPC_ADDR14_BRNTAKEN:
7630
          if (h != NULL && !info->shared)
7631
            break;
7632
          /* fall through */
7633
 
7634
        dodyn:
7635
          if ((input_section->flags & SEC_ALLOC) == 0
7636
              || is_vxworks_tls)
7637
            break;
7638
 
7639
          if ((info->shared
7640
               && !(h != NULL
7641
                    && ((h->root.type == bfd_link_hash_undefined
7642
                         && (ELF_ST_VISIBILITY (h->other) == STV_HIDDEN
7643
                             || ELF_ST_VISIBILITY (h->other) == STV_INTERNAL))
7644
                        || (h->root.type == bfd_link_hash_undefweak
7645
                            && ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)))
7646
               && (must_be_dyn_reloc (info, r_type)
7647
                   || !SYMBOL_CALLS_LOCAL (info, h)))
7648
              || (ELIMINATE_COPY_RELOCS
7649
                  && !info->shared
7650
                  && h != NULL
7651
                  && h->dynindx != -1
7652
                  && !h->non_got_ref
7653
                  && !h->def_regular))
7654
            {
7655
              int skip;
7656
              bfd_byte * loc;
7657
#ifdef DEBUG
7658
              fprintf (stderr, "ppc_elf_relocate_section needs to "
7659
                       "create relocation for %s\n",
7660
                       (h && h->root.root.string
7661
                        ? h->root.root.string : "<unknown>"));
7662
#endif
7663
 
7664
              /* When generating a shared object, these relocations
7665
                 are copied into the output file to be resolved at run
7666
                 time.  */
7667
              if (sreloc == NULL)
7668
                {
7669
                  sreloc = elf_section_data (input_section)->sreloc;
7670
                  if (!htab->elf.dynamic_sections_created)
7671
                    sreloc = htab->reliplt;
7672
                  if (sreloc == NULL)
7673
                    return FALSE;
7674
                }
7675
 
7676
              skip = 0;
7677
              outrel.r_offset = _bfd_elf_section_offset (output_bfd, info,
7678
                                                         input_section,
7679
                                                         rel->r_offset);
7680
              if (outrel.r_offset == (bfd_vma) -1
7681
                  || outrel.r_offset == (bfd_vma) -2)
7682
                skip = (int) outrel.r_offset;
7683
              outrel.r_offset += (input_section->output_section->vma
7684
                                  + input_section->output_offset);
7685
 
7686
              if (skip)
7687
                memset (&outrel, 0, sizeof outrel);
7688
              else if ((h != NULL
7689
                        && (h->root.type == bfd_link_hash_undefined
7690
                            || h->root.type == bfd_link_hash_undefweak))
7691
                       || !SYMBOL_REFERENCES_LOCAL (info, h))
7692
                {
7693
                  unresolved_reloc = FALSE;
7694
                  outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
7695
                  outrel.r_addend = rel->r_addend;
7696
                }
7697
              else
7698
                {
7699
                  outrel.r_addend = relocation + rel->r_addend;
7700
 
7701
                  if (r_type != R_PPC_ADDR32)
7702
                    {
7703
                      long indx = 0;
7704
 
7705
                      if (ifunc != NULL)
7706
                        {
7707
                          /* If we get here when building a static
7708
                             executable, then the libc startup function
7709
                             responsible for applying indirect function
7710
                             relocations is going to complain about
7711
                             the reloc type.
7712
                             If we get here when building a dynamic
7713
                             executable, it will be because we have
7714
                             a text relocation.  The dynamic loader
7715
                             will set the text segment writable and
7716
                             non-executable to apply text relocations.
7717
                             So we'll segfault when trying to run the
7718
                             indirection function to resolve the reloc.  */
7719
                          info->callbacks->einfo
7720 161 khays
                            (_("%P: %H: relocation %s for indirect "
7721 14 khays
                               "function %s unsupported\n"),
7722
                             input_bfd, input_section, rel->r_offset,
7723
                             howto->name,
7724
                             sym_name);
7725
                          ret = FALSE;
7726
                        }
7727
                      else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
7728
                        ;
7729
                      else if (sec == NULL || sec->owner == NULL)
7730
                        {
7731
                          bfd_set_error (bfd_error_bad_value);
7732
                          ret = FALSE;
7733
                        }
7734
                      else
7735
                        {
7736
                          asection *osec;
7737
 
7738
                          /* We are turning this relocation into one
7739
                             against a section symbol.  It would be
7740
                             proper to subtract the symbol's value,
7741
                             osec->vma, from the emitted reloc addend,
7742
                             but ld.so expects buggy relocs.
7743
                             FIXME: Why not always use a zero index?  */
7744
                          osec = sec->output_section;
7745
                          indx = elf_section_data (osec)->dynindx;
7746
                          if (indx == 0)
7747
                            {
7748
                              osec = htab->elf.text_index_section;
7749
                              indx = elf_section_data (osec)->dynindx;
7750
                            }
7751
                          BFD_ASSERT (indx != 0);
7752
#ifdef DEBUG
7753
                          if (indx == 0)
7754
                            printf ("indx=%ld section=%s flags=%08x name=%s\n",
7755
                                    indx, osec->name, osec->flags,
7756
                                    h->root.root.string);
7757
#endif
7758
                        }
7759
 
7760
                      outrel.r_info = ELF32_R_INFO (indx, r_type);
7761
                    }
7762
                  else if (ifunc != NULL)
7763
                    outrel.r_info = ELF32_R_INFO (0, R_PPC_IRELATIVE);
7764
                  else
7765
                    outrel.r_info = ELF32_R_INFO (0, R_PPC_RELATIVE);
7766
                }
7767
 
7768
              loc = sreloc->contents;
7769
              loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
7770
              bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
7771
 
7772
              if (skip == -1)
7773
                continue;
7774
 
7775
              /* This reloc will be computed at runtime.  We clear the memory
7776
                 so that it contains predictable value.  */
7777
              if (! skip
7778
                  && ((input_section->flags & SEC_ALLOC) != 0
7779
                      || ELF32_R_TYPE (outrel.r_info) != R_PPC_RELATIVE))
7780
                {
7781
                  relocation = howto->pc_relative ? outrel.r_offset : 0;
7782
                  addend = 0;
7783
                  break;
7784
                }
7785
            }
7786
          break;
7787
 
7788
        case R_PPC_RELAX_PLT:
7789
        case R_PPC_RELAX_PLTREL24:
7790
          if (h != NULL)
7791
            {
7792
              struct plt_entry *ent;
7793
              bfd_vma got2_addend = 0;
7794
 
7795
              if (r_type == R_PPC_RELAX_PLTREL24)
7796
                {
7797
                  if (info->shared)
7798
                    got2_addend = addend;
7799
                  addend = 0;
7800
                }
7801
              ent = find_plt_ent (&h->plt.plist, got2, got2_addend);
7802
              if (htab->plt_type == PLT_NEW)
7803
                relocation = (htab->glink->output_section->vma
7804
                              + htab->glink->output_offset
7805
                              + ent->glink_offset);
7806
              else
7807
                relocation = (htab->plt->output_section->vma
7808
                              + htab->plt->output_offset
7809
                              + ent->plt.offset);
7810
            }
7811
          /* Fall thru */
7812
 
7813
        case R_PPC_RELAX:
7814
          if (info->shared)
7815
            relocation -= (input_section->output_section->vma
7816
                           + input_section->output_offset
7817
                           + rel->r_offset - 4);
7818
 
7819
          {
7820
            unsigned long t0;
7821
            unsigned long t1;
7822
 
7823
            t0 = bfd_get_32 (output_bfd, contents + rel->r_offset);
7824
            t1 = bfd_get_32 (output_bfd, contents + rel->r_offset + 4);
7825
 
7826
            /* We're clearing the bits for R_PPC_ADDR16_HA
7827
               and R_PPC_ADDR16_LO here.  */
7828
            t0 &= ~0xffff;
7829
            t1 &= ~0xffff;
7830
 
7831
            /* t0 is HA, t1 is LO */
7832
            relocation += addend;
7833
            t0 |= ((relocation + 0x8000) >> 16) & 0xffff;
7834
            t1 |= relocation & 0xffff;
7835
 
7836
            bfd_put_32 (output_bfd, t0, contents + rel->r_offset);
7837
            bfd_put_32 (output_bfd, t1, contents + rel->r_offset + 4);
7838
 
7839
            /* Rewrite the reloc and convert one of the trailing nop
7840
               relocs to describe this relocation.  */
7841
            BFD_ASSERT (ELF32_R_TYPE (relend[-1].r_info) == R_PPC_NONE);
7842
            /* The relocs are at the bottom 2 bytes */
7843
            rel[0].r_offset += 2;
7844
            memmove (rel + 1, rel, (relend - rel - 1) * sizeof (*rel));
7845
            rel[0].r_info = ELF32_R_INFO (r_symndx, R_PPC_ADDR16_HA);
7846
            rel[1].r_offset += 4;
7847
            rel[1].r_info = ELF32_R_INFO (r_symndx, R_PPC_ADDR16_LO);
7848
            rel++;
7849
          }
7850
          continue;
7851
 
7852
          /* Indirect .sdata relocation.  */
7853
        case R_PPC_EMB_SDAI16:
7854
          BFD_ASSERT (htab->sdata[0].section != NULL);
7855
          if (!is_static_defined (htab->sdata[0].sym))
7856
            {
7857
              unresolved_reloc = TRUE;
7858
              break;
7859
            }
7860
          relocation
7861
            = elf_finish_pointer_linker_section (input_bfd, &htab->sdata[0],
7862
                                                 h, relocation, rel);
7863
          addend = 0;
7864
          break;
7865
 
7866
          /* Indirect .sdata2 relocation.  */
7867
        case R_PPC_EMB_SDA2I16:
7868
          BFD_ASSERT (htab->sdata[1].section != NULL);
7869
          if (!is_static_defined (htab->sdata[1].sym))
7870
            {
7871
              unresolved_reloc = TRUE;
7872
              break;
7873
            }
7874
          relocation
7875
            = elf_finish_pointer_linker_section (input_bfd, &htab->sdata[1],
7876
                                                 h, relocation, rel);
7877
          addend = 0;
7878
          break;
7879
 
7880
          /* Handle the TOC16 reloc.  We want to use the offset within the .got
7881
             section, not the actual VMA.  This is appropriate when generating
7882
             an embedded ELF object, for which the .got section acts like the
7883
             AIX .toc section.  */
7884
        case R_PPC_TOC16:                       /* phony GOT16 relocations */
7885
          if (sec == NULL || sec->output_section == NULL)
7886
            {
7887
              unresolved_reloc = TRUE;
7888
              break;
7889
            }
7890
          BFD_ASSERT (strcmp (bfd_get_section_name (abfd, sec), ".got") == 0
7891
                      || strcmp (bfd_get_section_name (abfd, sec), ".cgot") == 0);
7892
 
7893
          addend -= sec->output_section->vma + sec->output_offset + 0x8000;
7894
          break;
7895
 
7896
        case R_PPC_PLTREL24:
7897
          if (h == NULL || ifunc != NULL)
7898
            break;
7899
          /* Relocation is to the entry for this symbol in the
7900
             procedure linkage table.  */
7901
          {
7902
            struct plt_entry *ent = find_plt_ent (&h->plt.plist, got2,
7903
                                                  info->shared ? addend : 0);
7904
            addend = 0;
7905
            if (ent == NULL
7906
                || htab->plt == NULL)
7907
              {
7908
                /* We didn't make a PLT entry for this symbol.  This
7909
                   happens when statically linking PIC code, or when
7910
                   using -Bsymbolic.  */
7911
                break;
7912
              }
7913
 
7914
            unresolved_reloc = FALSE;
7915
            if (htab->plt_type == PLT_NEW)
7916
              relocation = (htab->glink->output_section->vma
7917
                            + htab->glink->output_offset
7918
                            + ent->glink_offset);
7919
            else
7920
              relocation = (htab->plt->output_section->vma
7921
                            + htab->plt->output_offset
7922
                            + ent->plt.offset);
7923
          }
7924
          break;
7925
 
7926
          /* Relocate against _SDA_BASE_.  */
7927
        case R_PPC_SDAREL16:
7928
          {
7929
            const char *name;
7930
            struct elf_link_hash_entry *sda = htab->sdata[0].sym;
7931
 
7932
            if (sec == NULL
7933
                || sec->output_section == NULL
7934
                || !is_static_defined (sda))
7935
              {
7936
                unresolved_reloc = TRUE;
7937
                break;
7938
              }
7939
            addend -= SYM_VAL (sda);
7940
 
7941
            name = bfd_get_section_name (abfd, sec->output_section);
7942
            if (! ((CONST_STRNEQ (name, ".sdata")
7943
                    && (name[6] == 0 || name[6] == '.'))
7944
                   || (CONST_STRNEQ (name, ".sbss")
7945
                       && (name[5] == 0 || name[5] == '.'))))
7946
              {
7947
                info->callbacks->einfo
7948 161 khays
                  (_("%P: %B: the target (%s) of a %s relocation is "
7949 14 khays
                     "in the wrong output section (%s)\n"),
7950
                   input_bfd,
7951
                   sym_name,
7952
                   howto->name,
7953
                   name);
7954
              }
7955
          }
7956
          break;
7957
 
7958
          /* Relocate against _SDA2_BASE_.  */
7959
        case R_PPC_EMB_SDA2REL:
7960
          {
7961
            const char *name;
7962
            struct elf_link_hash_entry *sda = htab->sdata[1].sym;
7963
 
7964
            if (sec == NULL
7965
                || sec->output_section == NULL
7966
                || !is_static_defined (sda))
7967
              {
7968
                unresolved_reloc = TRUE;
7969
                break;
7970
              }
7971
            addend -= SYM_VAL (sda);
7972
 
7973
            name = bfd_get_section_name (abfd, sec->output_section);
7974
            if (! (CONST_STRNEQ (name, ".sdata2")
7975
                   || CONST_STRNEQ (name, ".sbss2")))
7976
              {
7977
                info->callbacks->einfo
7978 161 khays
                  (_("%P: %B: the target (%s) of a %s relocation is "
7979 14 khays
                     "in the wrong output section (%s)\n"),
7980
                   input_bfd,
7981
                   sym_name,
7982
                   howto->name,
7983
                   name);
7984
              }
7985
          }
7986
          break;
7987
 
7988
          /* Relocate against either _SDA_BASE_, _SDA2_BASE_, or 0.  */
7989
        case R_PPC_EMB_SDA21:
7990
        case R_PPC_EMB_RELSDA:
7991
          {
7992
            const char *name;
7993
            int reg;
7994
            struct elf_link_hash_entry *sda = NULL;
7995
 
7996
            if (sec == NULL || sec->output_section == NULL)
7997
              {
7998
                unresolved_reloc = TRUE;
7999
                break;
8000
              }
8001
 
8002
            name = bfd_get_section_name (abfd, sec->output_section);
8003
            if (((CONST_STRNEQ (name, ".sdata")
8004
                  && (name[6] == 0 || name[6] == '.'))
8005
                 || (CONST_STRNEQ (name, ".sbss")
8006
                     && (name[5] == 0 || name[5] == '.'))))
8007
              {
8008
                reg = 13;
8009
                sda = htab->sdata[0].sym;
8010
              }
8011
            else if (CONST_STRNEQ (name, ".sdata2")
8012
                     || CONST_STRNEQ (name, ".sbss2"))
8013
              {
8014
                reg = 2;
8015
                sda = htab->sdata[1].sym;
8016
              }
8017
            else if (strcmp (name, ".PPC.EMB.sdata0") == 0
8018
                     || strcmp (name, ".PPC.EMB.sbss0") == 0)
8019
              {
8020
                reg = 0;
8021
              }
8022
            else
8023
              {
8024
                info->callbacks->einfo
8025 161 khays
                  (_("%P: %B: the target (%s) of a %s relocation is "
8026 14 khays
                     "in the wrong output section (%s)\n"),
8027
                   input_bfd,
8028
                   sym_name,
8029
                   howto->name,
8030
                   name);
8031
 
8032
                bfd_set_error (bfd_error_bad_value);
8033
                ret = FALSE;
8034
                continue;
8035
              }
8036
 
8037
            if (sda != NULL)
8038
              {
8039
                if (!is_static_defined (sda))
8040
                  {
8041
                    unresolved_reloc = TRUE;
8042
                    break;
8043
                  }
8044
                addend -= SYM_VAL (sda);
8045
              }
8046
 
8047
            if (r_type == R_PPC_EMB_SDA21)
8048
              {
8049
                bfd_vma insn;  /* Fill in register field.  */
8050
 
8051
                insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
8052
                insn = (insn & ~RA_REGISTER_MASK) | (reg << RA_REGISTER_SHIFT);
8053
                bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
8054
              }
8055
          }
8056
          break;
8057
 
8058
          /* Relocate against the beginning of the section.  */
8059
        case R_PPC_SECTOFF:
8060
        case R_PPC_SECTOFF_LO:
8061
        case R_PPC_SECTOFF_HI:
8062
        case R_PPC_SECTOFF_HA:
8063
          if (sec == NULL || sec->output_section == NULL)
8064
            {
8065
              unresolved_reloc = TRUE;
8066
              break;
8067
            }
8068
          addend -= sec->output_section->vma;
8069
          break;
8070
 
8071
          /* Negative relocations.  */
8072
        case R_PPC_EMB_NADDR32:
8073
        case R_PPC_EMB_NADDR16:
8074
        case R_PPC_EMB_NADDR16_LO:
8075
        case R_PPC_EMB_NADDR16_HI:
8076
        case R_PPC_EMB_NADDR16_HA:
8077
          addend -= 2 * relocation;
8078
          break;
8079
 
8080
        case R_PPC_COPY:
8081
        case R_PPC_GLOB_DAT:
8082
        case R_PPC_JMP_SLOT:
8083
        case R_PPC_RELATIVE:
8084
        case R_PPC_IRELATIVE:
8085
        case R_PPC_PLT32:
8086
        case R_PPC_PLTREL32:
8087
        case R_PPC_PLT16_LO:
8088
        case R_PPC_PLT16_HI:
8089
        case R_PPC_PLT16_HA:
8090
        case R_PPC_ADDR30:
8091
        case R_PPC_EMB_RELSEC16:
8092
        case R_PPC_EMB_RELST_LO:
8093
        case R_PPC_EMB_RELST_HI:
8094
        case R_PPC_EMB_RELST_HA:
8095
        case R_PPC_EMB_BIT_FLD:
8096
          info->callbacks->einfo
8097 161 khays
            (_("%P: %B: relocation %s is not yet supported for symbol %s\n"),
8098 14 khays
             input_bfd,
8099
             howto->name,
8100
             sym_name);
8101
 
8102
          bfd_set_error (bfd_error_invalid_operation);
8103
          ret = FALSE;
8104
          continue;
8105
        }
8106
 
8107
      /* Do any further special processing.  */
8108
      switch (r_type)
8109
        {
8110
        default:
8111
          break;
8112
 
8113
        case R_PPC_ADDR16_HA:
8114
        case R_PPC_REL16_HA:
8115
        case R_PPC_SECTOFF_HA:
8116
        case R_PPC_TPREL16_HA:
8117
        case R_PPC_DTPREL16_HA:
8118
        case R_PPC_EMB_NADDR16_HA:
8119
        case R_PPC_EMB_RELST_HA:
8120
          /* It's just possible that this symbol is a weak symbol
8121
             that's not actually defined anywhere.  In that case,
8122
             'sec' would be NULL, and we should leave the symbol
8123
             alone (it will be set to zero elsewhere in the link).  */
8124
          if (sec == NULL)
8125
            break;
8126
          /* Fall thru */
8127
 
8128
        case R_PPC_PLT16_HA:
8129
        case R_PPC_GOT16_HA:
8130
        case R_PPC_GOT_TLSGD16_HA:
8131
        case R_PPC_GOT_TLSLD16_HA:
8132
        case R_PPC_GOT_TPREL16_HA:
8133
        case R_PPC_GOT_DTPREL16_HA:
8134
          /* Add 0x10000 if sign bit in 0:15 is set.
8135
             Bits 0:15 are not used.  */
8136
          addend += 0x8000;
8137
          break;
8138
        }
8139
 
8140
#ifdef DEBUG
8141
      fprintf (stderr, "\ttype = %s (%d), name = %s, symbol index = %ld, "
8142
               "offset = %ld, addend = %ld\n",
8143
               howto->name,
8144
               (int) r_type,
8145
               sym_name,
8146
               r_symndx,
8147
               (long) rel->r_offset,
8148
               (long) addend);
8149
#endif
8150
 
8151
      if (unresolved_reloc
8152
          && !((input_section->flags & SEC_DEBUGGING) != 0
8153 163 khays
               && h->def_dynamic)
8154
          && _bfd_elf_section_offset (output_bfd, info, input_section,
8155
                                      rel->r_offset) != (bfd_vma) -1)
8156 14 khays
        {
8157
          info->callbacks->einfo
8158 161 khays
            (_("%P: %H: unresolvable %s relocation against symbol `%s'\n"),
8159 14 khays
             input_bfd, input_section, rel->r_offset,
8160
             howto->name,
8161
             sym_name);
8162
          ret = FALSE;
8163
        }
8164
 
8165
      r = _bfd_final_link_relocate (howto,
8166
                                    input_bfd,
8167
                                    input_section,
8168
                                    contents,
8169
                                    rel->r_offset,
8170
                                    relocation,
8171
                                    addend);
8172
 
8173
      if (r != bfd_reloc_ok)
8174
        {
8175
          if (r == bfd_reloc_overflow)
8176
            {
8177
              if (warned)
8178
                continue;
8179
              if (h != NULL
8180
                  && h->root.type == bfd_link_hash_undefweak
8181
                  && howto->pc_relative)
8182
                {
8183
                  /* Assume this is a call protected by other code that
8184
                     detect the symbol is undefined.  If this is the case,
8185
                     we can safely ignore the overflow.  If not, the
8186
                     program is hosed anyway, and a little warning isn't
8187
                     going to help.  */
8188
 
8189
                  continue;
8190
                }
8191
 
8192
              if (! (*info->callbacks->reloc_overflow) (info,
8193
                                                        (h ? &h->root : NULL),
8194
                                                        sym_name,
8195
                                                        howto->name,
8196
                                                        rel->r_addend,
8197
                                                        input_bfd,
8198
                                                        input_section,
8199
                                                        rel->r_offset))
8200
                return FALSE;
8201
            }
8202
          else
8203
            {
8204
              info->callbacks->einfo
8205 161 khays
                (_("%P: %H: %s reloc against `%s': error %d\n"),
8206 14 khays
                 input_bfd, input_section, rel->r_offset,
8207
                 howto->name, sym_name, (int) r);
8208
              ret = FALSE;
8209
            }
8210
        }
8211
    }
8212
 
8213
#ifdef DEBUG
8214
  fprintf (stderr, "\n");
8215
#endif
8216
 
8217
  return ret;
8218
}
8219
 
8220
/* Finish up dynamic symbol handling.  We set the contents of various
8221
   dynamic sections here.  */
8222
 
8223
static bfd_boolean
8224
ppc_elf_finish_dynamic_symbol (bfd *output_bfd,
8225
                               struct bfd_link_info *info,
8226
                               struct elf_link_hash_entry *h,
8227
                               Elf_Internal_Sym *sym)
8228
{
8229
  struct ppc_elf_link_hash_table *htab;
8230
  struct plt_entry *ent;
8231
  bfd_boolean doneone;
8232
 
8233
#ifdef DEBUG
8234
  fprintf (stderr, "ppc_elf_finish_dynamic_symbol called for %s",
8235
           h->root.root.string);
8236
#endif
8237
 
8238
  htab = ppc_elf_hash_table (info);
8239
  BFD_ASSERT (htab->elf.dynobj != NULL);
8240
 
8241
  doneone = FALSE;
8242
  for (ent = h->plt.plist; ent != NULL; ent = ent->next)
8243
    if (ent->plt.offset != (bfd_vma) -1)
8244
      {
8245
        if (!doneone)
8246
          {
8247
            Elf_Internal_Rela rela;
8248
            bfd_byte *loc;
8249
            bfd_vma reloc_index;
8250
 
8251
            if (htab->plt_type == PLT_NEW
8252
                || !htab->elf.dynamic_sections_created
8253
                || h->dynindx == -1)
8254
              reloc_index = ent->plt.offset / 4;
8255
            else
8256
              {
8257
                reloc_index = ((ent->plt.offset - htab->plt_initial_entry_size)
8258
                               / htab->plt_slot_size);
8259
                if (reloc_index > PLT_NUM_SINGLE_ENTRIES
8260
                    && htab->plt_type == PLT_OLD)
8261
                  reloc_index -= (reloc_index - PLT_NUM_SINGLE_ENTRIES) / 2;
8262
              }
8263
 
8264
            /* This symbol has an entry in the procedure linkage table.
8265
               Set it up.  */
8266
            if (htab->plt_type == PLT_VXWORKS
8267
                && htab->elf.dynamic_sections_created
8268
                && h->dynindx != -1)
8269
              {
8270
                bfd_vma got_offset;
8271
                const bfd_vma *plt_entry;
8272
 
8273
                /* The first three entries in .got.plt are reserved.  */
8274
                got_offset = (reloc_index + 3) * 4;
8275
 
8276
                /* Use the right PLT. */
8277
                plt_entry = info->shared ? ppc_elf_vxworks_pic_plt_entry
8278
                            : ppc_elf_vxworks_plt_entry;
8279
 
8280
                /* Fill in the .plt on VxWorks.  */
8281
                if (info->shared)
8282
                  {
8283
                    bfd_put_32 (output_bfd,
8284
                                plt_entry[0] | PPC_HA (got_offset),
8285
                                htab->plt->contents + ent->plt.offset + 0);
8286
                    bfd_put_32 (output_bfd,
8287
                                plt_entry[1] | PPC_LO (got_offset),
8288
                                htab->plt->contents + ent->plt.offset + 4);
8289
                  }
8290
                else
8291
                  {
8292
                    bfd_vma got_loc = got_offset + SYM_VAL (htab->elf.hgot);
8293
 
8294
                    bfd_put_32 (output_bfd,
8295
                                plt_entry[0] | PPC_HA (got_loc),
8296
                                htab->plt->contents + ent->plt.offset + 0);
8297
                    bfd_put_32 (output_bfd,
8298
                                plt_entry[1] | PPC_LO (got_loc),
8299
                                htab->plt->contents + ent->plt.offset + 4);
8300
                  }
8301
 
8302
                bfd_put_32 (output_bfd, plt_entry[2],
8303
                            htab->plt->contents + ent->plt.offset + 8);
8304
                bfd_put_32 (output_bfd, plt_entry[3],
8305
                            htab->plt->contents + ent->plt.offset + 12);
8306
 
8307
                /* This instruction is an immediate load.  The value loaded is
8308
                   the byte offset of the R_PPC_JMP_SLOT relocation from the
8309
                   start of the .rela.plt section.  The value is stored in the
8310
                   low-order 16 bits of the load instruction.  */
8311
                /* NOTE: It appears that this is now an index rather than a
8312
                   prescaled offset.  */
8313
                bfd_put_32 (output_bfd,
8314
                            plt_entry[4] | reloc_index,
8315
                            htab->plt->contents + ent->plt.offset + 16);
8316
                /* This instruction is a PC-relative branch whose target is
8317
                   the start of the PLT section.  The address of this branch
8318
                   instruction is 20 bytes beyond the start of this PLT entry.
8319
                   The address is encoded in bits 6-29, inclusive.  The value
8320
                   stored is right-shifted by two bits, permitting a 26-bit
8321
                   offset.  */
8322
                bfd_put_32 (output_bfd,
8323
                            (plt_entry[5]
8324
                             | (-(ent->plt.offset + 20) & 0x03fffffc)),
8325
                            htab->plt->contents + ent->plt.offset + 20);
8326
                bfd_put_32 (output_bfd, plt_entry[6],
8327
                            htab->plt->contents + ent->plt.offset + 24);
8328
                bfd_put_32 (output_bfd, plt_entry[7],
8329
                            htab->plt->contents + ent->plt.offset + 28);
8330
 
8331
                /* Fill in the GOT entry corresponding to this PLT slot with
8332
                   the address immediately after the the "bctr" instruction
8333
                   in this PLT entry.  */
8334
                bfd_put_32 (output_bfd, (htab->plt->output_section->vma
8335
                                         + htab->plt->output_offset
8336
                                         + ent->plt.offset + 16),
8337
                            htab->sgotplt->contents + got_offset);
8338
 
8339
                if (!info->shared)
8340
                  {
8341
                    /* Fill in a couple of entries in .rela.plt.unloaded.  */
8342
                    loc = htab->srelplt2->contents
8343
                      + ((VXWORKS_PLTRESOLVE_RELOCS + reloc_index
8344
                          * VXWORKS_PLT_NON_JMP_SLOT_RELOCS)
8345
                         * sizeof (Elf32_External_Rela));
8346
 
8347
                    /* Provide the @ha relocation for the first instruction.  */
8348
                    rela.r_offset = (htab->plt->output_section->vma
8349
                                     + htab->plt->output_offset
8350
                                     + ent->plt.offset + 2);
8351
                    rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
8352
                                                R_PPC_ADDR16_HA);
8353
                    rela.r_addend = got_offset;
8354
                    bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
8355
                    loc += sizeof (Elf32_External_Rela);
8356
 
8357
                    /* Provide the @l relocation for the second instruction.  */
8358
                    rela.r_offset = (htab->plt->output_section->vma
8359
                                     + htab->plt->output_offset
8360
                                     + ent->plt.offset + 6);
8361
                    rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
8362
                                                R_PPC_ADDR16_LO);
8363
                    rela.r_addend = got_offset;
8364
                    bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
8365
                    loc += sizeof (Elf32_External_Rela);
8366
 
8367
                    /* Provide a relocation for the GOT entry corresponding to this
8368
                       PLT slot.  Point it at the middle of the .plt entry.  */
8369
                    rela.r_offset = (htab->sgotplt->output_section->vma
8370
                                     + htab->sgotplt->output_offset
8371
                                     + got_offset);
8372
                    rela.r_info = ELF32_R_INFO (htab->elf.hplt->indx,
8373
                                                R_PPC_ADDR32);
8374
                    rela.r_addend = ent->plt.offset + 16;
8375
                    bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
8376
                  }
8377
 
8378
                /* VxWorks uses non-standard semantics for R_PPC_JMP_SLOT.
8379
                   In particular, the offset for the relocation is not the
8380
                   address of the PLT entry for this function, as specified
8381
                   by the ABI.  Instead, the offset is set to the address of
8382
                   the GOT slot for this function.  See EABI 4.4.4.1.  */
8383
                rela.r_offset = (htab->sgotplt->output_section->vma
8384
                                 + htab->sgotplt->output_offset
8385
                                 + got_offset);
8386
 
8387
              }
8388
            else
8389
              {
8390
                asection *splt = htab->plt;
8391
                if (!htab->elf.dynamic_sections_created
8392
                    || h->dynindx == -1)
8393
                  splt = htab->iplt;
8394
 
8395
                rela.r_offset = (splt->output_section->vma
8396
                                 + splt->output_offset
8397
                                 + ent->plt.offset);
8398
                if (htab->plt_type == PLT_OLD
8399
                    || !htab->elf.dynamic_sections_created
8400
                    || h->dynindx == -1)
8401
                  {
8402
                    /* We don't need to fill in the .plt.  The ppc dynamic
8403
                       linker will fill it in.  */
8404
                  }
8405
                else
8406
                  {
8407
                    bfd_vma val = (htab->glink_pltresolve + ent->plt.offset
8408
                                   + htab->glink->output_section->vma
8409
                                   + htab->glink->output_offset);
8410
                    bfd_put_32 (output_bfd, val,
8411
                                splt->contents + ent->plt.offset);
8412
                  }
8413
              }
8414
 
8415
            /* Fill in the entry in the .rela.plt section.  */
8416
            rela.r_addend = 0;
8417
            if (!htab->elf.dynamic_sections_created
8418
                || h->dynindx == -1)
8419
              {
8420
                BFD_ASSERT (h->type == STT_GNU_IFUNC
8421
                            && h->def_regular
8422
                            && (h->root.type == bfd_link_hash_defined
8423
                                || h->root.type == bfd_link_hash_defweak));
8424
                rela.r_info = ELF32_R_INFO (0, R_PPC_IRELATIVE);
8425
                rela.r_addend = SYM_VAL (h);
8426
              }
8427
            else
8428
              rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_JMP_SLOT);
8429
 
8430
            if (!htab->elf.dynamic_sections_created
8431
                || h->dynindx == -1)
8432
              loc = (htab->reliplt->contents
8433
                     + (htab->reliplt->reloc_count++
8434
                        * sizeof (Elf32_External_Rela)));
8435
            else
8436
              loc = (htab->relplt->contents
8437
                     + reloc_index * sizeof (Elf32_External_Rela));
8438
            bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
8439
 
8440
            if (!h->def_regular)
8441
              {
8442
                /* Mark the symbol as undefined, rather than as
8443
                   defined in the .plt section.  Leave the value if
8444
                   there were any relocations where pointer equality
8445
                   matters (this is a clue for the dynamic linker, to
8446
                   make function pointer comparisons work between an
8447
                   application and shared library), otherwise set it
8448
                   to zero.  */
8449
                sym->st_shndx = SHN_UNDEF;
8450
                if (!h->pointer_equality_needed)
8451
                  sym->st_value = 0;
8452
                else if (!h->ref_regular_nonweak)
8453
                  {
8454
                    /* This breaks function pointer comparisons, but
8455
                       that is better than breaking tests for a NULL
8456
                       function pointer.  */
8457
                    sym->st_value = 0;
8458
                  }
8459
              }
8460
            else if (h->type == STT_GNU_IFUNC
8461
                     && !info->shared)
8462
              {
8463
                /* Set the value of ifunc symbols in a non-pie
8464
                   executable to the glink entry.  This is to avoid
8465
                   text relocations.  We can't do this for ifunc in
8466
                   allocate_dynrelocs, as we do for normal dynamic
8467
                   function symbols with plt entries, because we need
8468
                   to keep the original value around for the ifunc
8469
                   relocation.  */
8470
                sym->st_shndx = (_bfd_elf_section_from_bfd_section
8471
                                 (output_bfd, htab->glink->output_section));
8472
                sym->st_value = (ent->glink_offset
8473
                                 + htab->glink->output_offset
8474
                                 + htab->glink->output_section->vma);
8475
              }
8476
            doneone = TRUE;
8477
          }
8478
 
8479
        if (htab->plt_type == PLT_NEW
8480
            || !htab->elf.dynamic_sections_created
8481
            || h->dynindx == -1)
8482
          {
8483
            unsigned char *p;
8484
            asection *splt = htab->plt;
8485
            if (!htab->elf.dynamic_sections_created
8486
                || h->dynindx == -1)
8487
              splt = htab->iplt;
8488
 
8489
            p = (unsigned char *) htab->glink->contents + ent->glink_offset;
8490
 
8491
            if (h == htab->tls_get_addr && !htab->no_tls_get_addr_opt)
8492
              {
8493
                bfd_put_32 (output_bfd, LWZ_11_3, p);
8494
                p += 4;
8495
                bfd_put_32 (output_bfd, LWZ_12_3 + 4, p);
8496
                p += 4;
8497
                bfd_put_32 (output_bfd, MR_0_3, p);
8498
                p += 4;
8499
                bfd_put_32 (output_bfd, CMPWI_11_0, p);
8500
                p += 4;
8501
                bfd_put_32 (output_bfd, ADD_3_12_2, p);
8502
                p += 4;
8503
                bfd_put_32 (output_bfd, BEQLR, p);
8504
                p += 4;
8505
                bfd_put_32 (output_bfd, MR_3_0, p);
8506
                p += 4;
8507
                bfd_put_32 (output_bfd, NOP, p);
8508
                p += 4;
8509
              }
8510
 
8511
            write_glink_stub (ent, splt, p, info);
8512
 
8513
            if (!info->shared)
8514
              /* We only need one non-PIC glink stub.  */
8515
              break;
8516
          }
8517
        else
8518
          break;
8519
      }
8520
 
8521
  if (h->needs_copy)
8522
    {
8523
      asection *s;
8524
      Elf_Internal_Rela rela;
8525
      bfd_byte *loc;
8526
 
8527
      /* This symbols needs a copy reloc.  Set it up.  */
8528
 
8529
#ifdef DEBUG
8530
      fprintf (stderr, ", copy");
8531
#endif
8532
 
8533
      BFD_ASSERT (h->dynindx != -1);
8534
 
8535
      if (ppc_elf_hash_entry (h)->has_sda_refs)
8536
        s = htab->relsbss;
8537
      else
8538
        s = htab->relbss;
8539
      BFD_ASSERT (s != NULL);
8540
 
8541
      rela.r_offset = SYM_VAL (h);
8542
      rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_COPY);
8543
      rela.r_addend = 0;
8544
      loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
8545
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
8546
    }
8547
 
8548
#ifdef DEBUG
8549
  fprintf (stderr, "\n");
8550
#endif
8551
 
8552
  /* Mark some specially defined symbols as absolute.  */
8553
  if (strcmp (h->root.root.string, "_DYNAMIC") == 0
8554
      || (!htab->is_vxworks
8555
          && (h == htab->elf.hgot
8556
              || strcmp (h->root.root.string,
8557
                         "_PROCEDURE_LINKAGE_TABLE_") == 0)))
8558
    sym->st_shndx = SHN_ABS;
8559
 
8560
  return TRUE;
8561
}
8562
 
8563
static enum elf_reloc_type_class
8564
ppc_elf_reloc_type_class (const Elf_Internal_Rela *rela)
8565
{
8566
  switch (ELF32_R_TYPE (rela->r_info))
8567
    {
8568
    case R_PPC_RELATIVE:
8569
      return reloc_class_relative;
8570
    case R_PPC_REL24:
8571
    case R_PPC_ADDR24:
8572
    case R_PPC_JMP_SLOT:
8573
      return reloc_class_plt;
8574
    case R_PPC_COPY:
8575
      return reloc_class_copy;
8576
    default:
8577
      return reloc_class_normal;
8578
    }
8579
}
8580
 
8581
/* Finish up the dynamic sections.  */
8582
 
8583
static bfd_boolean
8584
ppc_elf_finish_dynamic_sections (bfd *output_bfd,
8585
                                 struct bfd_link_info *info)
8586
{
8587
  asection *sdyn;
8588
  asection *splt;
8589
  struct ppc_elf_link_hash_table *htab;
8590
  bfd_vma got;
8591
  bfd *dynobj;
8592
  bfd_boolean ret = TRUE;
8593
 
8594
#ifdef DEBUG
8595
  fprintf (stderr, "ppc_elf_finish_dynamic_sections called\n");
8596
#endif
8597
 
8598
  htab = ppc_elf_hash_table (info);
8599
  dynobj = elf_hash_table (info)->dynobj;
8600
  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
8601
  if (htab->is_vxworks)
8602
    splt = bfd_get_section_by_name (dynobj, ".plt");
8603
  else
8604
    splt = NULL;
8605
 
8606
  got = 0;
8607
  if (htab->elf.hgot != NULL)
8608
    got = SYM_VAL (htab->elf.hgot);
8609
 
8610
  if (htab->elf.dynamic_sections_created)
8611
    {
8612
      Elf32_External_Dyn *dyncon, *dynconend;
8613
 
8614
      BFD_ASSERT (htab->plt != NULL && sdyn != NULL);
8615
 
8616
      dyncon = (Elf32_External_Dyn *) sdyn->contents;
8617
      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
8618
      for (; dyncon < dynconend; dyncon++)
8619
        {
8620
          Elf_Internal_Dyn dyn;
8621
          asection *s;
8622
 
8623
          bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
8624
 
8625
          switch (dyn.d_tag)
8626
            {
8627
            case DT_PLTGOT:
8628
              if (htab->is_vxworks)
8629
                s = htab->sgotplt;
8630
              else
8631
                s = htab->plt;
8632
              dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
8633
              break;
8634
 
8635
            case DT_PLTRELSZ:
8636
              dyn.d_un.d_val = htab->relplt->size;
8637
              break;
8638
 
8639
            case DT_JMPREL:
8640
              s = htab->relplt;
8641
              dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
8642
              break;
8643
 
8644
            case DT_PPC_GOT:
8645
              dyn.d_un.d_ptr = got;
8646
              break;
8647
 
8648
            case DT_RELASZ:
8649
              if (htab->is_vxworks)
8650
                {
8651
                  if (htab->relplt)
8652
                    dyn.d_un.d_ptr -= htab->relplt->size;
8653
                  break;
8654
                }
8655
              continue;
8656
 
8657
            default:
8658
              if (htab->is_vxworks
8659
                  && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
8660
                break;
8661
              continue;
8662
            }
8663
 
8664
          bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
8665
        }
8666
    }
8667
 
8668
  if (htab->got != NULL)
8669
    {
8670
      if (htab->elf.hgot->root.u.def.section == htab->got
8671
          || htab->elf.hgot->root.u.def.section == htab->sgotplt)
8672
        {
8673
          unsigned char *p = htab->elf.hgot->root.u.def.section->contents;
8674
 
8675
          p += htab->elf.hgot->root.u.def.value;
8676
          if (htab->plt_type == PLT_OLD)
8677
            {
8678
              /* Add a blrl instruction at _GLOBAL_OFFSET_TABLE_-4
8679
                 so that a function can easily find the address of
8680
                 _GLOBAL_OFFSET_TABLE_.  */
8681
              BFD_ASSERT (htab->elf.hgot->root.u.def.value - 4
8682
                          < htab->elf.hgot->root.u.def.section->size);
8683
              bfd_put_32 (output_bfd, 0x4e800021, p - 4);
8684
            }
8685
 
8686
          if (sdyn != NULL)
8687
            {
8688
              bfd_vma val = sdyn->output_section->vma + sdyn->output_offset;
8689
              BFD_ASSERT (htab->elf.hgot->root.u.def.value
8690
                          < htab->elf.hgot->root.u.def.section->size);
8691
              bfd_put_32 (output_bfd, val, p);
8692
            }
8693
        }
8694
      else
8695
        {
8696 161 khays
          info->callbacks->einfo (_("%P: %s not defined in linker created %s\n"),
8697 14 khays
                                  htab->elf.hgot->root.root.string,
8698
                                  (htab->sgotplt != NULL
8699
                                   ? htab->sgotplt->name : htab->got->name));
8700
          bfd_set_error (bfd_error_bad_value);
8701
          ret = FALSE;
8702
        }
8703
 
8704
      elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 4;
8705
    }
8706
 
8707
  /* Fill in the first entry in the VxWorks procedure linkage table.  */
8708
  if (splt && splt->size > 0)
8709
    {
8710
      /* Use the right PLT. */
8711
      const bfd_vma *plt_entry = (info->shared
8712
                                  ? ppc_elf_vxworks_pic_plt0_entry
8713
                                  : ppc_elf_vxworks_plt0_entry);
8714
 
8715
      if (!info->shared)
8716
        {
8717
          bfd_vma got_value = SYM_VAL (htab->elf.hgot);
8718
 
8719
          bfd_put_32 (output_bfd, plt_entry[0] | PPC_HA (got_value),
8720
                      splt->contents +  0);
8721
          bfd_put_32 (output_bfd, plt_entry[1] | PPC_LO (got_value),
8722
                      splt->contents +  4);
8723
        }
8724
      else
8725
        {
8726
          bfd_put_32 (output_bfd, plt_entry[0], splt->contents +  0);
8727
          bfd_put_32 (output_bfd, plt_entry[1], splt->contents +  4);
8728
        }
8729
      bfd_put_32 (output_bfd, plt_entry[2], splt->contents +  8);
8730
      bfd_put_32 (output_bfd, plt_entry[3], splt->contents + 12);
8731
      bfd_put_32 (output_bfd, plt_entry[4], splt->contents + 16);
8732
      bfd_put_32 (output_bfd, plt_entry[5], splt->contents + 20);
8733
      bfd_put_32 (output_bfd, plt_entry[6], splt->contents + 24);
8734
      bfd_put_32 (output_bfd, plt_entry[7], splt->contents + 28);
8735
 
8736
      if (! info->shared)
8737
        {
8738
          Elf_Internal_Rela rela;
8739
          bfd_byte *loc;
8740
 
8741
          loc = htab->srelplt2->contents;
8742
 
8743
          /* Output the @ha relocation for the first instruction.  */
8744
          rela.r_offset = (htab->plt->output_section->vma
8745
                           + htab->plt->output_offset
8746
                           + 2);
8747
          rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_HA);
8748
          rela.r_addend = 0;
8749
          bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
8750
          loc += sizeof (Elf32_External_Rela);
8751
 
8752
          /* Output the @l relocation for the second instruction.  */
8753
          rela.r_offset = (htab->plt->output_section->vma
8754
                           + htab->plt->output_offset
8755
                           + 6);
8756
          rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_LO);
8757
          rela.r_addend = 0;
8758
          bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
8759
          loc += sizeof (Elf32_External_Rela);
8760
 
8761
          /* Fix up the remaining relocations.  They may have the wrong
8762
             symbol index for _G_O_T_ or _P_L_T_ depending on the order
8763
             in which symbols were output.  */
8764
          while (loc < htab->srelplt2->contents + htab->srelplt2->size)
8765
            {
8766
              Elf_Internal_Rela rel;
8767
 
8768
              bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
8769
              rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_HA);
8770
              bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
8771
              loc += sizeof (Elf32_External_Rela);
8772
 
8773
              bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
8774
              rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_LO);
8775
              bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
8776
              loc += sizeof (Elf32_External_Rela);
8777
 
8778
              bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
8779
              rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_PPC_ADDR32);
8780
              bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
8781
              loc += sizeof (Elf32_External_Rela);
8782
            }
8783
        }
8784
    }
8785
 
8786
  if (htab->glink != NULL
8787
      && htab->glink->contents != NULL
8788
      && htab->elf.dynamic_sections_created)
8789
    {
8790
      unsigned char *p;
8791
      unsigned char *endp;
8792
      bfd_vma res0;
8793
      unsigned int i;
8794
 
8795
      /*
8796
       * PIC glink code is the following:
8797
       *
8798
       * # ith PLT code stub.
8799
       *   addis 11,30,(plt+(i-1)*4-got)@ha
8800
       *   lwz 11,(plt+(i-1)*4-got)@l(11)
8801
       *   mtctr 11
8802
       *   bctr
8803
       *
8804
       * # A table of branches, one for each plt entry.
8805
       * # The idea is that the plt call stub loads ctr and r11 with these
8806
       * # addresses, so (r11 - res_0) gives the plt index * 4.
8807
       * res_0: b PLTresolve
8808
       * res_1: b PLTresolve
8809
       * .
8810
       * # Some number of entries towards the end can be nops
8811
       * res_n_m3: nop
8812
       * res_n_m2: nop
8813
       * res_n_m1:
8814
       *
8815
       * PLTresolve:
8816
       *    addis 11,11,(1f-res_0)@ha
8817
       *    mflr 0
8818
       *    bcl 20,31,1f
8819
       * 1: addi 11,11,(1b-res_0)@l
8820
       *    mflr 12
8821
       *    mtlr 0
8822
       *    sub 11,11,12                # r11 = index * 4
8823
       *    addis 12,12,(got+4-1b)@ha
8824
       *    lwz 0,(got+4-1b)@l(12)      # got[1] address of dl_runtime_resolve
8825
       *    lwz 12,(got+8-1b)@l(12)     # got[2] contains the map address
8826
       *    mtctr 0
8827
       *    add 0,11,11
8828
       *    add 11,0,11                 # r11 = index * 12 = reloc offset.
8829
       *    bctr
8830
       */
8831
      static const unsigned int pic_plt_resolve[] =
8832
        {
8833
          ADDIS_11_11,
8834
          MFLR_0,
8835
          BCL_20_31,
8836
          ADDI_11_11,
8837
          MFLR_12,
8838
          MTLR_0,
8839
          SUB_11_11_12,
8840
          ADDIS_12_12,
8841
          LWZ_0_12,
8842
          LWZ_12_12,
8843
          MTCTR_0,
8844
          ADD_0_11_11,
8845
          ADD_11_0_11,
8846
          BCTR,
8847
          NOP,
8848
          NOP
8849
        };
8850
 
8851
      /*
8852
       * Non-PIC glink code is a little simpler.
8853
       *
8854
       * # ith PLT code stub.
8855
       *   lis 11,(plt+(i-1)*4)@ha
8856
       *   lwz 11,(plt+(i-1)*4)@l(11)
8857
       *   mtctr 11
8858
       *   bctr
8859
       *
8860
       * The branch table is the same, then comes
8861
       *
8862
       * PLTresolve:
8863
       *    lis 12,(got+4)@ha
8864
       *    addis 11,11,(-res_0)@ha
8865
       *    lwz 0,(got+4)@l(12)         # got[1] address of dl_runtime_resolve
8866
       *    addi 11,11,(-res_0)@l       # r11 = index * 4
8867
       *    mtctr 0
8868
       *    add 0,11,11
8869
       *    lwz 12,(got+8)@l(12)        # got[2] contains the map address
8870
       *    add 11,0,11                 # r11 = index * 12 = reloc offset.
8871
       *    bctr
8872
       */
8873
      static const unsigned int plt_resolve[] =
8874
        {
8875
          LIS_12,
8876
          ADDIS_11_11,
8877
          LWZ_0_12,
8878
          ADDI_11_11,
8879
          MTCTR_0,
8880
          ADD_0_11_11,
8881
          LWZ_12_12,
8882
          ADD_11_0_11,
8883
          BCTR,
8884
          NOP,
8885
          NOP,
8886
          NOP,
8887
          NOP,
8888
          NOP,
8889
          NOP,
8890
          NOP
8891
        };
8892
 
8893
      if (ARRAY_SIZE (pic_plt_resolve) != GLINK_PLTRESOLVE / 4)
8894
        abort ();
8895
      if (ARRAY_SIZE (plt_resolve) != GLINK_PLTRESOLVE / 4)
8896
        abort ();
8897
 
8898
      /* Build the branch table, one for each plt entry (less one),
8899
         and perhaps some padding.  */
8900
      p = htab->glink->contents;
8901
      p += htab->glink_pltresolve;
8902
      endp = htab->glink->contents;
8903
      endp += htab->glink->size - GLINK_PLTRESOLVE;
8904
      while (p < endp - 8 * 4)
8905
        {
8906
          bfd_put_32 (output_bfd, B + endp - p, p);
8907
          p += 4;
8908
        }
8909
      while (p < endp)
8910
        {
8911
          bfd_put_32 (output_bfd, NOP, p);
8912
          p += 4;
8913
        }
8914
 
8915
      res0 = (htab->glink_pltresolve
8916
              + htab->glink->output_section->vma
8917
              + htab->glink->output_offset);
8918
 
8919
      /* Last comes the PLTresolve stub.  */
8920
      if (info->shared)
8921
        {
8922
          bfd_vma bcl;
8923
 
8924
          for (i = 0; i < ARRAY_SIZE (pic_plt_resolve); i++)
8925
            {
8926
              bfd_put_32 (output_bfd, pic_plt_resolve[i], p);
8927
              p += 4;
8928
            }
8929
          p -= 4 * ARRAY_SIZE (pic_plt_resolve);
8930
 
8931
          bcl = (htab->glink->size - GLINK_PLTRESOLVE + 3*4
8932
                 + htab->glink->output_section->vma
8933
                 + htab->glink->output_offset);
8934
 
8935
          bfd_put_32 (output_bfd,
8936
                      ADDIS_11_11 + PPC_HA (bcl - res0), p + 0*4);
8937
          bfd_put_32 (output_bfd,
8938
                      ADDI_11_11 + PPC_LO (bcl - res0), p + 3*4);
8939
          bfd_put_32 (output_bfd,
8940
                      ADDIS_12_12 + PPC_HA (got + 4 - bcl), p + 7*4);
8941
          if (PPC_HA (got + 4 - bcl) == PPC_HA (got + 8 - bcl))
8942
            {
8943
              bfd_put_32 (output_bfd,
8944
                          LWZ_0_12 + PPC_LO (got + 4 - bcl), p + 8*4);
8945
              bfd_put_32 (output_bfd,
8946
                          LWZ_12_12 + PPC_LO (got + 8 - bcl), p + 9*4);
8947
            }
8948
          else
8949
            {
8950
              bfd_put_32 (output_bfd,
8951
                          LWZU_0_12 + PPC_LO (got + 4 - bcl), p + 8*4);
8952
              bfd_put_32 (output_bfd,
8953
                          LWZ_12_12 + 4, p + 9*4);
8954
            }
8955
        }
8956
      else
8957
        {
8958
          for (i = 0; i < ARRAY_SIZE (plt_resolve); i++)
8959
            {
8960
              bfd_put_32 (output_bfd, plt_resolve[i], p);
8961
              p += 4;
8962
            }
8963
          p -= 4 * ARRAY_SIZE (plt_resolve);
8964
 
8965
          bfd_put_32 (output_bfd,
8966
                      LIS_12 + PPC_HA (got + 4), p + 0*4);
8967
          bfd_put_32 (output_bfd,
8968
                      ADDIS_11_11 + PPC_HA (-res0), p + 1*4);
8969
          bfd_put_32 (output_bfd,
8970
                      ADDI_11_11 + PPC_LO (-res0), p + 3*4);
8971
          if (PPC_HA (got + 4) == PPC_HA (got + 8))
8972
            {
8973
              bfd_put_32 (output_bfd,
8974
                          LWZ_0_12 + PPC_LO (got + 4), p + 2*4);
8975
              bfd_put_32 (output_bfd,
8976
                          LWZ_12_12 + PPC_LO (got + 8), p + 6*4);
8977
            }
8978
          else
8979
            {
8980
              bfd_put_32 (output_bfd,
8981
                          LWZU_0_12 + PPC_LO (got + 4), p + 2*4);
8982
              bfd_put_32 (output_bfd,
8983
                          LWZ_12_12 + 4, p + 6*4);
8984
            }
8985
        }
8986
    }
8987
 
8988 161 khays
  if (htab->glink_eh_frame != NULL
8989
      && htab->glink_eh_frame->contents != NULL)
8990
    {
8991
      unsigned char *p = htab->glink_eh_frame->contents;
8992
      bfd_vma val;
8993
 
8994
      memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
8995
      /* CIE length (rewrite in case little-endian).  */
8996
      bfd_put_32 (htab->elf.dynobj, sizeof (glink_eh_frame_cie) - 4, p);
8997
      p += sizeof (glink_eh_frame_cie);
8998
      /* FDE length.  */
8999
      val = htab->glink_eh_frame->size - 4 - sizeof (glink_eh_frame_cie);
9000
      bfd_put_32 (htab->elf.dynobj, val, p);
9001
      p += 4;
9002
      /* CIE pointer.  */
9003
      val = p - htab->glink_eh_frame->contents;
9004
      bfd_put_32 (htab->elf.dynobj, val, p);
9005
      p += 4;
9006
      /* Offset to .glink.  */
9007
      val = (htab->glink->output_section->vma
9008
             + htab->glink->output_offset);
9009
      val -= (htab->glink_eh_frame->output_section->vma
9010
              + htab->glink_eh_frame->output_offset);
9011
      val -= p - htab->glink_eh_frame->contents;
9012
      bfd_put_32 (htab->elf.dynobj, val, p);
9013
      p += 4;
9014
      /* .glink size.  */
9015
      bfd_put_32 (htab->elf.dynobj, htab->glink->size, p);
9016
      p += 4;
9017
      /* Augmentation.  */
9018
      p += 1;
9019
 
9020
      if (info->shared
9021
          && htab->elf.dynamic_sections_created)
9022
        {
9023
          bfd_vma adv = (htab->glink->size - GLINK_PLTRESOLVE + 8) >> 2;
9024
          if (adv < 64)
9025
            *p++ = DW_CFA_advance_loc + adv;
9026
          else if (adv < 256)
9027
            {
9028
              *p++ = DW_CFA_advance_loc1;
9029
              *p++ = adv;
9030
            }
9031
          else if (adv < 65536)
9032
            {
9033
              *p++ = DW_CFA_advance_loc2;
9034
              bfd_put_16 (htab->elf.dynobj, adv, p);
9035
              p += 2;
9036
            }
9037
          else
9038
            {
9039
              *p++ = DW_CFA_advance_loc4;
9040
              bfd_put_32 (htab->elf.dynobj, adv, p);
9041
              p += 4;
9042
            }
9043
          *p++ = DW_CFA_register;
9044
          *p++ = 65;
9045
          p++;
9046
          *p++ = DW_CFA_advance_loc + 4;
9047
          *p++ = DW_CFA_restore_extended;
9048
          *p++ = 65;
9049
        }
9050
      BFD_ASSERT ((bfd_vma) ((p + 3 - htab->glink_eh_frame->contents) & -4)
9051
                  == htab->glink_eh_frame->size);
9052
 
9053
      if (htab->glink_eh_frame->sec_info_type == ELF_INFO_TYPE_EH_FRAME
9054
          && !_bfd_elf_write_section_eh_frame (output_bfd, info,
9055
                                               htab->glink_eh_frame,
9056
                                               htab->glink_eh_frame->contents))
9057
        return FALSE;
9058
    }
9059
 
9060 14 khays
  return ret;
9061
}
9062
 
9063
#define TARGET_LITTLE_SYM       bfd_elf32_powerpcle_vec
9064
#define TARGET_LITTLE_NAME      "elf32-powerpcle"
9065
#define TARGET_BIG_SYM          bfd_elf32_powerpc_vec
9066
#define TARGET_BIG_NAME         "elf32-powerpc"
9067
#define ELF_ARCH                bfd_arch_powerpc
9068
#define ELF_TARGET_ID           PPC32_ELF_DATA
9069
#define ELF_MACHINE_CODE        EM_PPC
9070
#ifdef __QNXTARGET__
9071
#define ELF_MAXPAGESIZE         0x1000
9072
#else
9073
#define ELF_MAXPAGESIZE         0x10000
9074
#endif
9075
#define ELF_MINPAGESIZE         0x1000
9076
#define ELF_COMMONPAGESIZE      0x1000
9077
#define elf_info_to_howto       ppc_elf_info_to_howto
9078
 
9079
#ifdef  EM_CYGNUS_POWERPC
9080
#define ELF_MACHINE_ALT1        EM_CYGNUS_POWERPC
9081
#endif
9082
 
9083
#ifdef EM_PPC_OLD
9084
#define ELF_MACHINE_ALT2        EM_PPC_OLD
9085
#endif
9086
 
9087
#define elf_backend_plt_not_loaded      1
9088
#define elf_backend_can_gc_sections     1
9089
#define elf_backend_can_refcount        1
9090
#define elf_backend_rela_normal         1
9091
 
9092
#define bfd_elf32_mkobject                      ppc_elf_mkobject
9093
#define bfd_elf32_bfd_merge_private_bfd_data    ppc_elf_merge_private_bfd_data
9094
#define bfd_elf32_bfd_relax_section             ppc_elf_relax_section
9095
#define bfd_elf32_bfd_reloc_type_lookup         ppc_elf_reloc_type_lookup
9096
#define bfd_elf32_bfd_reloc_name_lookup ppc_elf_reloc_name_lookup
9097
#define bfd_elf32_bfd_set_private_flags         ppc_elf_set_private_flags
9098
#define bfd_elf32_bfd_link_hash_table_create    ppc_elf_link_hash_table_create
9099
#define bfd_elf32_get_synthetic_symtab          ppc_elf_get_synthetic_symtab
9100
 
9101
#define elf_backend_object_p                    ppc_elf_object_p
9102
#define elf_backend_gc_mark_hook                ppc_elf_gc_mark_hook
9103
#define elf_backend_gc_sweep_hook               ppc_elf_gc_sweep_hook
9104
#define elf_backend_section_from_shdr           ppc_elf_section_from_shdr
9105
#define elf_backend_relocate_section            ppc_elf_relocate_section
9106
#define elf_backend_create_dynamic_sections     ppc_elf_create_dynamic_sections
9107
#define elf_backend_check_relocs                ppc_elf_check_relocs
9108
#define elf_backend_copy_indirect_symbol        ppc_elf_copy_indirect_symbol
9109
#define elf_backend_adjust_dynamic_symbol       ppc_elf_adjust_dynamic_symbol
9110
#define elf_backend_add_symbol_hook             ppc_elf_add_symbol_hook
9111
#define elf_backend_size_dynamic_sections       ppc_elf_size_dynamic_sections
9112
#define elf_backend_hash_symbol                 ppc_elf_hash_symbol
9113
#define elf_backend_finish_dynamic_symbol       ppc_elf_finish_dynamic_symbol
9114
#define elf_backend_finish_dynamic_sections     ppc_elf_finish_dynamic_sections
9115
#define elf_backend_fake_sections               ppc_elf_fake_sections
9116
#define elf_backend_additional_program_headers  ppc_elf_additional_program_headers
9117
#define elf_backend_grok_prstatus               ppc_elf_grok_prstatus
9118
#define elf_backend_grok_psinfo                 ppc_elf_grok_psinfo
9119
#define elf_backend_write_core_note             ppc_elf_write_core_note
9120
#define elf_backend_reloc_type_class            ppc_elf_reloc_type_class
9121
#define elf_backend_begin_write_processing      ppc_elf_begin_write_processing
9122
#define elf_backend_final_write_processing      ppc_elf_final_write_processing
9123
#define elf_backend_write_section               ppc_elf_write_section
9124
#define elf_backend_get_sec_type_attr           ppc_elf_get_sec_type_attr
9125
#define elf_backend_plt_sym_val                 ppc_elf_plt_sym_val
9126
#define elf_backend_action_discarded            ppc_elf_action_discarded
9127
#define elf_backend_init_index_section          _bfd_elf_init_1_index_section
9128
#define elf_backend_post_process_headers        _bfd_elf_set_osabi
9129
 
9130
#include "elf32-target.h"
9131
 
9132
/* VxWorks Target */
9133
 
9134
#undef TARGET_LITTLE_SYM
9135
#undef TARGET_LITTLE_NAME
9136
 
9137
#undef TARGET_BIG_SYM
9138
#define TARGET_BIG_SYM          bfd_elf32_powerpc_vxworks_vec
9139
#undef TARGET_BIG_NAME
9140
#define TARGET_BIG_NAME         "elf32-powerpc-vxworks"
9141
 
9142
/* VxWorks uses the elf default section flags for .plt.  */
9143
static const struct bfd_elf_special_section *
9144
ppc_elf_vxworks_get_sec_type_attr (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
9145
{
9146
  if (sec->name == NULL)
9147
    return NULL;
9148
 
9149
  if (strcmp (sec->name, ".plt") == 0)
9150
    return _bfd_elf_get_sec_type_attr (abfd, sec);
9151
 
9152
  return ppc_elf_get_sec_type_attr (abfd, sec);
9153
}
9154
 
9155
/* Like ppc_elf_link_hash_table_create, but overrides
9156
   appropriately for VxWorks.  */
9157
static struct bfd_link_hash_table *
9158
ppc_elf_vxworks_link_hash_table_create (bfd *abfd)
9159
{
9160
  struct bfd_link_hash_table *ret;
9161
 
9162
  ret = ppc_elf_link_hash_table_create (abfd);
9163
  if (ret)
9164
    {
9165
      struct ppc_elf_link_hash_table *htab
9166
        = (struct ppc_elf_link_hash_table *)ret;
9167
      htab->is_vxworks = 1;
9168
      htab->plt_type = PLT_VXWORKS;
9169
      htab->plt_entry_size = VXWORKS_PLT_ENTRY_SIZE;
9170
      htab->plt_slot_size = VXWORKS_PLT_ENTRY_SIZE;
9171
      htab->plt_initial_entry_size = VXWORKS_PLT_INITIAL_ENTRY_SIZE;
9172
    }
9173
  return ret;
9174
}
9175
 
9176
/* Tweak magic VxWorks symbols as they are loaded.  */
9177
static bfd_boolean
9178
ppc_elf_vxworks_add_symbol_hook (bfd *abfd,
9179
                                 struct bfd_link_info *info,
9180
                                 Elf_Internal_Sym *sym,
9181
                                 const char **namep ATTRIBUTE_UNUSED,
9182
                                 flagword *flagsp ATTRIBUTE_UNUSED,
9183
                                 asection **secp,
9184
                                 bfd_vma *valp)
9185
{
9186
  if (!elf_vxworks_add_symbol_hook(abfd, info, sym,namep, flagsp, secp,
9187
                                   valp))
9188
    return FALSE;
9189
 
9190
  return ppc_elf_add_symbol_hook(abfd, info, sym,namep, flagsp, secp, valp);
9191
}
9192
 
9193
static void
9194
ppc_elf_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
9195
{
9196
  ppc_elf_final_write_processing(abfd, linker);
9197
  elf_vxworks_final_write_processing(abfd, linker);
9198
}
9199
 
9200
/* On VxWorks, we emit relocations against _PROCEDURE_LINKAGE_TABLE_, so
9201
   define it.  */
9202
#undef elf_backend_want_plt_sym
9203
#define elf_backend_want_plt_sym                1
9204
#undef elf_backend_want_got_plt
9205
#define elf_backend_want_got_plt                1
9206
#undef elf_backend_got_symbol_offset
9207
#define elf_backend_got_symbol_offset           0
9208
#undef elf_backend_plt_not_loaded
9209
#define elf_backend_plt_not_loaded              0
9210
#undef elf_backend_plt_readonly
9211
#define elf_backend_plt_readonly                1
9212
#undef elf_backend_got_header_size
9213
#define elf_backend_got_header_size             12
9214
 
9215
#undef bfd_elf32_get_synthetic_symtab
9216
 
9217
#undef bfd_elf32_bfd_link_hash_table_create
9218
#define bfd_elf32_bfd_link_hash_table_create \
9219
  ppc_elf_vxworks_link_hash_table_create
9220
#undef elf_backend_add_symbol_hook
9221
#define elf_backend_add_symbol_hook \
9222
  ppc_elf_vxworks_add_symbol_hook
9223
#undef elf_backend_link_output_symbol_hook
9224
#define elf_backend_link_output_symbol_hook \
9225
  elf_vxworks_link_output_symbol_hook
9226
#undef elf_backend_final_write_processing
9227
#define elf_backend_final_write_processing \
9228
  ppc_elf_vxworks_final_write_processing
9229
#undef elf_backend_get_sec_type_attr
9230
#define elf_backend_get_sec_type_attr \
9231
  ppc_elf_vxworks_get_sec_type_attr
9232
#undef elf_backend_emit_relocs
9233
#define elf_backend_emit_relocs \
9234
  elf_vxworks_emit_relocs
9235
 
9236
#undef elf32_bed
9237
#define elf32_bed                               ppc_elf_vxworks_bed
9238
#undef elf_backend_post_process_headers
9239
 
9240
#include "elf32-target.h"

powered by: WebSVN 2.1.0

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