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

Subversion Repositories or1k

[/] [or1k/] [tags/] [VER_5_3/] [gdb-5.3/] [bfd/] [elf64-ppc.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1181 sfurman
/* PowerPC64-specific support for 64-bit ELF.
2
   Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
3
   Written by Linus Nordberg, Swox AB <info@swox.com>,
4
   based on elf32-ppc.c by Ian Lance Taylor.
5
 
6
This file is part of BFD, the Binary File Descriptor library.
7
 
8
This program is free software; you can redistribute it and/or modify
9
it under the terms of the GNU General Public License as published by
10
the Free Software Foundation; either version 2 of the License, or
11
(at your option) any later version.
12
 
13
This program is distributed in the hope that it will be useful,
14
but WITHOUT ANY WARRANTY; without even the implied warranty of
15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
GNU General Public License for more details.
17
 
18
You should have received a copy of the GNU General Public License
19
along with this program; if not, write to the Free Software
20
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
21
 
22
/* This file is based on the 64-bit PowerPC ELF ABI.  It is also based
23
   on the file elf32-ppc.c.  */
24
 
25
#include "bfd.h"
26
#include "sysdep.h"
27
#include "bfdlink.h"
28
#include "libbfd.h"
29
#include "elf-bfd.h"
30
#include "elf/ppc.h"
31
#include "elf64-ppc.h"
32
 
33
static void ppc_howto_init
34
  PARAMS ((void));
35
static reloc_howto_type *ppc64_elf_reloc_type_lookup
36
  PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
37
static void ppc64_elf_info_to_howto
38
  PARAMS ((bfd *abfd, arelent *cache_ptr, Elf64_Internal_Rela *dst));
39
static bfd_reloc_status_type ppc64_elf_ha_reloc
40
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
41
static bfd_reloc_status_type ppc64_elf_brtaken_reloc
42
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
43
static bfd_reloc_status_type ppc64_elf_sectoff_reloc
44
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
45
static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc
46
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
47
static bfd_reloc_status_type ppc64_elf_toc_reloc
48
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
49
static bfd_reloc_status_type ppc64_elf_toc_ha_reloc
50
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
51
static bfd_reloc_status_type ppc64_elf_toc64_reloc
52
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
53
static bfd_reloc_status_type ppc64_elf_unhandled_reloc
54
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
55
static boolean ppc64_elf_object_p
56
  PARAMS ((bfd *));
57
static boolean ppc64_elf_merge_private_bfd_data
58
  PARAMS ((bfd *, bfd *));
59
 
60
 
61
/* The name of the dynamic interpreter.  This is put in the .interp
62
   section.  */
63
#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
64
 
65
/* The size in bytes of an entry in the procedure linkage table.  */
66
#define PLT_ENTRY_SIZE 24
67
 
68
/* The initial size of the plt reserved for the dynamic linker.  */
69
#define PLT_INITIAL_ENTRY_SIZE PLT_ENTRY_SIZE
70
 
71
/* TOC base pointers offset from start of TOC.  */
72
#define TOC_BASE_OFF (0x8000)
73
 
74
/* .plt call stub instructions.  */
75
#define ADDIS_R12_R2    0x3d820000      /* addis %r12,%r2,xxx@ha     */
76
#define STD_R2_40R1     0xf8410028      /* std   %r2,40(%r1)         */
77
#define LD_R11_0R12     0xe96c0000      /* ld    %r11,xxx+0@l(%r12)  */
78
#define LD_R2_0R12      0xe84c0000      /* ld    %r2,xxx+8@l(%r12)   */
79
#define MTCTR_R11       0x7d6903a6      /* mtctr %r11                */
80
                                        /* ld    %r11,xxx+16@l(%r12) */
81
#define BCTR            0x4e800420      /* bctr                      */
82
 
83
/* The normal stub is this size.  */
84
#define PLT_CALL_STUB_SIZE (7*4)
85
 
86
/* But sometimes the .plt entry crosses a 64k boundary, and we need
87
   to adjust the high word with this insn.  */
88
#define ADDIS_R12_R12_1 0x3d8c0001      /* addis %r12,%r12,1    */
89
 
90
/* The .glink fixup call stub is the same as the .plt call stub, but
91
   the first instruction restores r2, and the std is omitted.  */
92
#define LD_R2_40R1      0xe8410028      /* ld    %r2,40(%r1)    */
93
 
94
/* Always allow this much space.  */
95
#define GLINK_CALL_STUB_SIZE (8*4)
96
 
97
/* Pad with this.  */
98
#define NOP             0x60000000
99
 
100
/* Some other nops.  */
101
#define CROR_151515     0x4def7b82
102
#define CROR_313131     0x4ffffb82
103
 
104
/* .glink entries for the first 32k functions are two instructions.  */
105
#define LI_R0_0         0x38000000      /* li    %r0,0          */
106
#define B_DOT           0x48000000      /* b     .              */
107
 
108
/* After that, we need two instructions to load the index, followed by
109
   a branch.  */
110
#define LIS_R0_0        0x3c000000      /* lis   %r0,0          */
111
#define ORI_R0_R0_0     0x60000000      /* ori   %r0,%r0,0      */
112
 
113
/* Instructions to save and restore floating point regs.  */
114
#define STFD_FR0_0R1    0xd8010000      /* stfd  %fr0,0(%r1)    */
115
#define LFD_FR0_0R1     0xc8010000      /* lfd   %fr0,0(%r1)    */
116
#define BLR             0x4e800020      /* blr                  */
117
 
118
/* Since .opd is an array of descriptors and each entry will end up
119
   with identical R_PPC64_RELATIVE relocs, there is really no need to
120
   propagate .opd relocs;  The dynamic linker should be taught to
121
   relocate .opd without reloc entries.  */
122
#ifndef NO_OPD_RELOCS
123
#define NO_OPD_RELOCS 0
124
#endif
125
 
126
#define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
127
 
128
/* Relocation HOWTO's.  */
129
static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC_max];
130
 
131
static reloc_howto_type ppc64_elf_howto_raw[] = {
132
  /* This reloc does nothing.  */
133
  HOWTO (R_PPC64_NONE,          /* type */
134
         0,                      /* rightshift */
135
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
136
         8,                     /* bitsize */
137
         false,                 /* pc_relative */
138
         0,                      /* bitpos */
139
         complain_overflow_dont, /* complain_on_overflow */
140
         bfd_elf_generic_reloc, /* special_function */
141
         "R_PPC64_NONE",        /* name */
142
         false,                 /* partial_inplace */
143
         0,                      /* src_mask */
144
         0,                      /* dst_mask */
145
         false),                /* pcrel_offset */
146
 
147
  /* A standard 32 bit relocation.  */
148
  HOWTO (R_PPC64_ADDR32,        /* type */
149
         0,                      /* rightshift */
150
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
151
         32,                    /* bitsize */
152
         false,                 /* pc_relative */
153
         0,                      /* bitpos */
154
         complain_overflow_bitfield, /* complain_on_overflow */
155
         bfd_elf_generic_reloc, /* special_function */
156
         "R_PPC64_ADDR32",      /* name */
157
         false,                 /* partial_inplace */
158
         0,                      /* src_mask */
159
         0xffffffff,            /* dst_mask */
160
         false),                /* pcrel_offset */
161
 
162
  /* An absolute 26 bit branch; the lower two bits must be zero.
163
     FIXME: we don't check that, we just clear them.  */
164
  HOWTO (R_PPC64_ADDR24,        /* type */
165
         0,                      /* rightshift */
166
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
167
         26,                    /* bitsize */
168
         false,                 /* pc_relative */
169
         0,                      /* bitpos */
170
         complain_overflow_bitfield, /* complain_on_overflow */
171
         bfd_elf_generic_reloc, /* special_function */
172
         "R_PPC64_ADDR24",      /* name */
173
         false,                 /* partial_inplace */
174
         0,                      /* src_mask */
175
         0x03fffffc,            /* dst_mask */
176
         false),                /* pcrel_offset */
177
 
178
  /* A standard 16 bit relocation.  */
179
  HOWTO (R_PPC64_ADDR16,        /* type */
180
         0,                      /* rightshift */
181
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
182
         16,                    /* bitsize */
183
         false,                 /* pc_relative */
184
         0,                      /* bitpos */
185
         complain_overflow_bitfield, /* complain_on_overflow */
186
         bfd_elf_generic_reloc, /* special_function */
187
         "R_PPC64_ADDR16",      /* name */
188
         false,                 /* partial_inplace */
189
         0,                      /* src_mask */
190
         0xffff,                /* dst_mask */
191
         false),                /* pcrel_offset */
192
 
193
  /* A 16 bit relocation without overflow.  */
194
  HOWTO (R_PPC64_ADDR16_LO,     /* type */
195
         0,                      /* rightshift */
196
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
197
         16,                    /* bitsize */
198
         false,                 /* pc_relative */
199
         0,                      /* bitpos */
200
         complain_overflow_dont,/* complain_on_overflow */
201
         bfd_elf_generic_reloc, /* special_function */
202
         "R_PPC64_ADDR16_LO",   /* name */
203
         false,                 /* partial_inplace */
204
         0,                      /* src_mask */
205
         0xffff,                /* dst_mask */
206
         false),                /* pcrel_offset */
207
 
208
  /* Bits 16-31 of an address.  */
209
  HOWTO (R_PPC64_ADDR16_HI,     /* type */
210
         16,                    /* rightshift */
211
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
212
         16,                    /* bitsize */
213
         false,                 /* pc_relative */
214
         0,                      /* bitpos */
215
         complain_overflow_dont, /* complain_on_overflow */
216
         bfd_elf_generic_reloc, /* special_function */
217
         "R_PPC64_ADDR16_HI",   /* name */
218
         false,                 /* partial_inplace */
219
         0,                      /* src_mask */
220
         0xffff,                /* dst_mask */
221
         false),                /* pcrel_offset */
222
 
223
  /* Bits 16-31 of an address, plus 1 if the contents of the low 16
224
     bits, treated as a signed number, is negative.  */
225
  HOWTO (R_PPC64_ADDR16_HA,     /* type */
226
         16,                    /* rightshift */
227
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
228
         16,                    /* bitsize */
229
         false,                 /* pc_relative */
230
         0,                      /* bitpos */
231
         complain_overflow_dont, /* complain_on_overflow */
232
         ppc64_elf_ha_reloc,    /* special_function */
233
         "R_PPC64_ADDR16_HA",   /* name */
234
         false,                 /* partial_inplace */
235
         0,                      /* src_mask */
236
         0xffff,                /* dst_mask */
237
         false),                /* pcrel_offset */
238
 
239
  /* An absolute 16 bit branch; the lower two bits must be zero.
240
     FIXME: we don't check that, we just clear them.  */
241
  HOWTO (R_PPC64_ADDR14,        /* type */
242
         0,                      /* rightshift */
243
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
244
         16,                    /* bitsize */
245
         false,                 /* pc_relative */
246
         0,                      /* bitpos */
247
         complain_overflow_bitfield, /* complain_on_overflow */
248
         bfd_elf_generic_reloc, /* special_function */
249
         "R_PPC64_ADDR14",      /* name */
250
         false,                 /* partial_inplace */
251
         0,                      /* src_mask */
252
         0x0000fffc,            /* dst_mask */
253
         false),                /* pcrel_offset */
254
 
255
  /* An absolute 16 bit branch, for which bit 10 should be set to
256
     indicate that the branch is expected to be taken.  The lower two
257
     bits must be zero.  */
258
  HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */
259
         0,                      /* rightshift */
260
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
261
         16,                    /* bitsize */
262
         false,                 /* pc_relative */
263
         0,                      /* bitpos */
264
         complain_overflow_bitfield, /* complain_on_overflow */
265
         ppc64_elf_brtaken_reloc, /* special_function */
266
         "R_PPC64_ADDR14_BRTAKEN",/* name */
267
         false,                 /* partial_inplace */
268
         0,                      /* src_mask */
269
         0x0000fffc,            /* dst_mask */
270
         false),                /* pcrel_offset */
271
 
272
  /* An absolute 16 bit branch, for which bit 10 should be set to
273
     indicate that the branch is not expected to be taken.  The lower
274
     two bits must be zero.  */
275
  HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */
276
         0,                      /* rightshift */
277
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
278
         16,                    /* bitsize */
279
         false,                 /* pc_relative */
280
         0,                      /* bitpos */
281
         complain_overflow_bitfield, /* complain_on_overflow */
282
         ppc64_elf_brtaken_reloc, /* special_function */
283
         "R_PPC64_ADDR14_BRNTAKEN",/* name */
284
         false,                 /* partial_inplace */
285
         0,                      /* src_mask */
286
         0x0000fffc,            /* dst_mask */
287
         false),                /* pcrel_offset */
288
 
289
  /* A relative 26 bit branch; the lower two bits must be zero.  */
290
  HOWTO (R_PPC64_REL24,         /* type */
291
         0,                      /* rightshift */
292
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
293
         26,                    /* bitsize */
294
         true,                  /* pc_relative */
295
         0,                      /* bitpos */
296
         complain_overflow_signed, /* complain_on_overflow */
297
         bfd_elf_generic_reloc, /* special_function */
298
         "R_PPC64_REL24",       /* name */
299
         false,                 /* partial_inplace */
300
         0,                      /* src_mask */
301
         0x03fffffc,            /* dst_mask */
302
         true),                 /* pcrel_offset */
303
 
304
  /* A relative 16 bit branch; the lower two bits must be zero.  */
305
  HOWTO (R_PPC64_REL14,         /* type */
306
         0,                      /* rightshift */
307
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
308
         16,                    /* bitsize */
309
         true,                  /* pc_relative */
310
         0,                      /* bitpos */
311
         complain_overflow_signed, /* complain_on_overflow */
312
         bfd_elf_generic_reloc, /* special_function */
313
         "R_PPC64_REL14",       /* name */
314
         false,                 /* partial_inplace */
315
         0,                      /* src_mask */
316
         0x0000fffc,            /* dst_mask */
317
         true),                 /* pcrel_offset */
318
 
319
  /* A relative 16 bit branch.  Bit 10 should be set to indicate that
320
     the branch is expected to be taken.  The lower two bits must be
321
     zero.  */
322
  HOWTO (R_PPC64_REL14_BRTAKEN, /* type */
323
         0,                      /* rightshift */
324
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
325
         16,                    /* bitsize */
326
         true,                  /* pc_relative */
327
         0,                      /* bitpos */
328
         complain_overflow_signed, /* complain_on_overflow */
329
         ppc64_elf_brtaken_reloc, /* special_function */
330
         "R_PPC64_REL14_BRTAKEN", /* name */
331
         false,                 /* partial_inplace */
332
         0,                      /* src_mask */
333
         0x0000fffc,            /* dst_mask */
334
         true),                 /* pcrel_offset */
335
 
336
  /* A relative 16 bit branch.  Bit 10 should be set to indicate that
337
     the branch is not expected to be taken.  The lower two bits must
338
     be zero.  */
339
  HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */
340
         0,                      /* rightshift */
341
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
342
         16,                    /* bitsize */
343
         true,                  /* pc_relative */
344
         0,                      /* bitpos */
345
         complain_overflow_signed, /* complain_on_overflow */
346
         ppc64_elf_brtaken_reloc, /* special_function */
347
         "R_PPC64_REL14_BRNTAKEN",/* name */
348
         false,                 /* partial_inplace */
349
         0,                      /* src_mask */
350
         0x0000fffc,            /* dst_mask */
351
         true),                 /* pcrel_offset */
352
 
353
  /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
354
     symbol.  */
355
  HOWTO (R_PPC64_GOT16,         /* type */
356
         0,                      /* rightshift */
357
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
358
         16,                    /* bitsize */
359
         false,                 /* pc_relative */
360
         0,                      /* bitpos */
361
         complain_overflow_signed, /* complain_on_overflow */
362
         ppc64_elf_unhandled_reloc, /* special_function */
363
         "R_PPC64_GOT16",       /* name */
364
         false,                 /* partial_inplace */
365
         0,                      /* src_mask */
366
         0xffff,                /* dst_mask */
367
         false),                /* pcrel_offset */
368
 
369
  /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
370
     the symbol.  */
371
  HOWTO (R_PPC64_GOT16_LO,      /* type */
372
         0,                      /* rightshift */
373
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
374
         16,                    /* bitsize */
375
         false,                 /* pc_relative */
376
         0,                      /* bitpos */
377
         complain_overflow_dont, /* complain_on_overflow */
378
         ppc64_elf_unhandled_reloc, /* special_function */
379
         "R_PPC64_GOT16_LO",    /* name */
380
         false,                 /* partial_inplace */
381
         0,                      /* src_mask */
382
         0xffff,                /* dst_mask */
383
         false),                /* pcrel_offset */
384
 
385
  /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
386
     the symbol.  */
387
  HOWTO (R_PPC64_GOT16_HI,      /* type */
388
         16,                    /* rightshift */
389
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
390
         16,                    /* bitsize */
391
         false,                 /* pc_relative */
392
         0,                      /* bitpos */
393
         complain_overflow_dont,/* complain_on_overflow */
394
         ppc64_elf_unhandled_reloc, /* special_function */
395
         "R_PPC64_GOT16_HI",    /* name */
396
         false,                 /* partial_inplace */
397
         0,                      /* src_mask */
398
         0xffff,                /* dst_mask */
399
         false),                /* pcrel_offset */
400
 
401
  /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
402
     the symbol.  */
403
  HOWTO (R_PPC64_GOT16_HA,      /* type */
404
         16,                    /* rightshift */
405
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
406
         16,                    /* bitsize */
407
         false,                 /* pc_relative */
408
         0,                      /* bitpos */
409
         complain_overflow_dont,/* complain_on_overflow */
410
         ppc64_elf_unhandled_reloc, /* special_function */
411
         "R_PPC64_GOT16_HA",    /* name */
412
         false,                 /* partial_inplace */
413
         0,                      /* src_mask */
414
         0xffff,                /* dst_mask */
415
         false),                /* pcrel_offset */
416
 
417
  /* This is used only by the dynamic linker.  The symbol should exist
418
     both in the object being run and in some shared library.  The
419
     dynamic linker copies the data addressed by the symbol from the
420
     shared library into the object, because the object being
421
     run has to have the data at some particular address.  */
422
  HOWTO (R_PPC64_COPY,          /* type */
423
         0,                      /* rightshift */
424
         0,                      /* this one is variable size */
425
         0,                      /* bitsize */
426
         false,                 /* pc_relative */
427
         0,                      /* bitpos */
428
         complain_overflow_dont, /* complain_on_overflow */
429
         ppc64_elf_unhandled_reloc, /* special_function */
430
         "R_PPC64_COPY",        /* name */
431
         false,                 /* partial_inplace */
432
         0,                      /* src_mask */
433
         0,                      /* dst_mask */
434
         false),                /* pcrel_offset */
435
 
436
  /* Like R_PPC64_ADDR64, but used when setting global offset table
437
     entries.  */
438
  HOWTO (R_PPC64_GLOB_DAT,      /* type */
439
         0,                      /* rightshift */
440
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
441
         64,                    /* bitsize */
442
         false,                 /* pc_relative */
443
         0,                      /* bitpos */
444
         complain_overflow_dont, /* complain_on_overflow */
445
         ppc64_elf_unhandled_reloc,  /* special_function */
446
         "R_PPC64_GLOB_DAT",    /* name */
447
         false,                 /* partial_inplace */
448
         0,                      /* src_mask */
449
         ONES (64),             /* dst_mask */
450
         false),                /* pcrel_offset */
451
 
452
  /* Created by the link editor.  Marks a procedure linkage table
453
     entry for a symbol.  */
454
  HOWTO (R_PPC64_JMP_SLOT,      /* type */
455
         0,                      /* rightshift */
456
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
457
         0,                      /* bitsize */
458
         false,                 /* pc_relative */
459
         0,                      /* bitpos */
460
         complain_overflow_dont, /* complain_on_overflow */
461
         ppc64_elf_unhandled_reloc, /* special_function */
462
         "R_PPC64_JMP_SLOT",    /* name */
463
         false,                 /* partial_inplace */
464
         0,                      /* src_mask */
465
         0,                      /* dst_mask */
466
         false),                /* pcrel_offset */
467
 
468
  /* Used only by the dynamic linker.  When the object is run, this
469
     doubleword64 is set to the load address of the object, plus the
470
     addend.  */
471
  HOWTO (R_PPC64_RELATIVE,      /* type */
472
         0,                      /* rightshift */
473
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
474
         64,                    /* bitsize */
475
         false,                 /* pc_relative */
476
         0,                      /* bitpos */
477
         complain_overflow_dont, /* complain_on_overflow */
478
         bfd_elf_generic_reloc, /* special_function */
479
         "R_PPC64_RELATIVE",    /* name */
480
         false,                 /* partial_inplace */
481
         0,                      /* src_mask */
482
         ONES (64),             /* dst_mask */
483
         false),                /* pcrel_offset */
484
 
485
  /* Like R_PPC64_ADDR32, but may be unaligned.  */
486
  HOWTO (R_PPC64_UADDR32,       /* 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_PPC64_UADDR32",     /* name */
495
         false,                 /* partial_inplace */
496
         0,                      /* src_mask */
497
         0xffffffff,            /* dst_mask */
498
         false),                /* pcrel_offset */
499
 
500
  /* Like R_PPC64_ADDR16, but may be unaligned.  */
501
  HOWTO (R_PPC64_UADDR16,       /* type */
502
         0,                      /* rightshift */
503
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
504
         16,                    /* bitsize */
505
         false,                 /* pc_relative */
506
         0,                      /* bitpos */
507
         complain_overflow_bitfield, /* complain_on_overflow */
508
         bfd_elf_generic_reloc, /* special_function */
509
         "R_PPC64_UADDR16",     /* name */
510
         false,                 /* partial_inplace */
511
         0,                      /* src_mask */
512
         0xffff,                /* dst_mask */
513
         false),                /* pcrel_offset */
514
 
515
  /* 32-bit PC relative.  */
516
  HOWTO (R_PPC64_REL32,         /* type */
517
         0,                      /* rightshift */
518
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
519
         32,                    /* bitsize */
520
         true,                  /* pc_relative */
521
         0,                      /* bitpos */
522
         /* FIXME: Verify.  Was complain_overflow_bitfield.  */
523
         complain_overflow_signed, /* complain_on_overflow */
524
         bfd_elf_generic_reloc, /* special_function */
525
         "R_PPC64_REL32",       /* name */
526
         false,                 /* partial_inplace */
527
         0,                      /* src_mask */
528
         0xffffffff,            /* dst_mask */
529
         true),                 /* pcrel_offset */
530
 
531
  /* 32-bit relocation to the symbol's procedure linkage table.  */
532
  HOWTO (R_PPC64_PLT32,         /* type */
533
         0,                      /* rightshift */
534
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
535
         32,                    /* bitsize */
536
         false,                 /* pc_relative */
537
         0,                      /* bitpos */
538
         complain_overflow_bitfield, /* complain_on_overflow */
539
         ppc64_elf_unhandled_reloc, /* special_function */
540
         "R_PPC64_PLT32",       /* name */
541
         false,                 /* partial_inplace */
542
         0,                      /* src_mask */
543
         0xffffffff,            /* dst_mask */
544
         false),                /* pcrel_offset */
545
 
546
  /* 32-bit PC relative relocation to the symbol's procedure linkage table.
547
     FIXME: R_PPC64_PLTREL32 not supported.  */
548
  HOWTO (R_PPC64_PLTREL32,      /* type */
549
         0,                      /* rightshift */
550
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
551
         32,                    /* bitsize */
552
         true,                  /* pc_relative */
553
         0,                      /* bitpos */
554
         complain_overflow_signed, /* complain_on_overflow */
555
         bfd_elf_generic_reloc, /* special_function */
556
         "R_PPC64_PLTREL32",    /* name */
557
         false,                 /* partial_inplace */
558
         0,                      /* src_mask */
559
         0xffffffff,            /* dst_mask */
560
         true),                 /* pcrel_offset */
561
 
562
  /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
563
     the symbol.  */
564
  HOWTO (R_PPC64_PLT16_LO,      /* type */
565
         0,                      /* rightshift */
566
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
567
         16,                    /* bitsize */
568
         false,                 /* pc_relative */
569
         0,                      /* bitpos */
570
         complain_overflow_dont, /* complain_on_overflow */
571
         ppc64_elf_unhandled_reloc, /* special_function */
572
         "R_PPC64_PLT16_LO",    /* name */
573
         false,                 /* partial_inplace */
574
         0,                      /* src_mask */
575
         0xffff,                /* dst_mask */
576
         false),                /* pcrel_offset */
577
 
578
  /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
579
     the symbol.  */
580
  HOWTO (R_PPC64_PLT16_HI,      /* type */
581
         16,                    /* rightshift */
582
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
583
         16,                    /* bitsize */
584
         false,                 /* pc_relative */
585
         0,                      /* bitpos */
586
         complain_overflow_dont, /* complain_on_overflow */
587
         ppc64_elf_unhandled_reloc, /* special_function */
588
         "R_PPC64_PLT16_HI",    /* name */
589
         false,                 /* partial_inplace */
590
         0,                      /* src_mask */
591
         0xffff,                /* dst_mask */
592
         false),                /* pcrel_offset */
593
 
594
  /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
595
     the symbol.  */
596
  HOWTO (R_PPC64_PLT16_HA,      /* type */
597
         16,                    /* rightshift */
598
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
599
         16,                    /* bitsize */
600
         false,                 /* pc_relative */
601
         0,                      /* bitpos */
602
         complain_overflow_dont, /* complain_on_overflow */
603
         ppc64_elf_unhandled_reloc, /* special_function */
604
         "R_PPC64_PLT16_HA",    /* name */
605
         false,                 /* partial_inplace */
606
         0,                      /* src_mask */
607
         0xffff,                /* dst_mask */
608
         false),                /* pcrel_offset */
609
 
610
  /* 16-bit section relative relocation.  */
611
  HOWTO (R_PPC64_SECTOFF,       /* type */
612
         0,                      /* rightshift */
613
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
614
         16,                    /* bitsize */
615
         false,                 /* pc_relative */
616
         0,                      /* bitpos */
617
         complain_overflow_bitfield, /* complain_on_overflow */
618
         ppc64_elf_sectoff_reloc, /* special_function */
619
         "R_PPC64_SECTOFF",     /* name */
620
         false,                 /* partial_inplace */
621
         0,                      /* src_mask */
622
         0xffff,                /* dst_mask */
623
         false),                /* pcrel_offset */
624
 
625
  /* Like R_PPC64_SECTOFF, but no overflow warning.  */
626
  HOWTO (R_PPC64_SECTOFF_LO,    /* type */
627
         0,                      /* rightshift */
628
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
629
         16,                    /* bitsize */
630
         false,                 /* pc_relative */
631
         0,                      /* bitpos */
632
         complain_overflow_dont, /* complain_on_overflow */
633
         ppc64_elf_sectoff_reloc, /* special_function */
634
         "R_PPC64_SECTOFF_LO",  /* name */
635
         false,                 /* partial_inplace */
636
         0,                      /* src_mask */
637
         0xffff,                /* dst_mask */
638
         false),                /* pcrel_offset */
639
 
640
  /* 16-bit upper half section relative relocation.  */
641
  HOWTO (R_PPC64_SECTOFF_HI,    /* type */
642
         16,                    /* rightshift */
643
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
644
         16,                    /* bitsize */
645
         false,                 /* pc_relative */
646
         0,                      /* bitpos */
647
         complain_overflow_dont, /* complain_on_overflow */
648
         ppc64_elf_sectoff_reloc, /* special_function */
649
         "R_PPC64_SECTOFF_HI",  /* name */
650
         false,                 /* partial_inplace */
651
         0,                      /* src_mask */
652
         0xffff,                /* dst_mask */
653
         false),                /* pcrel_offset */
654
 
655
  /* 16-bit upper half adjusted section relative relocation.  */
656
  HOWTO (R_PPC64_SECTOFF_HA,    /* type */
657
         16,                    /* rightshift */
658
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
659
         16,                    /* bitsize */
660
         false,                 /* pc_relative */
661
         0,                      /* bitpos */
662
         complain_overflow_dont, /* complain_on_overflow */
663
         ppc64_elf_sectoff_ha_reloc, /* special_function */
664
         "R_PPC64_SECTOFF_HA",  /* name */
665
         false,                 /* partial_inplace */
666
         0,                      /* src_mask */
667
         0xffff,                /* dst_mask */
668
         false),                /* pcrel_offset */
669
 
670
  /* Like R_PPC64_REL24 without touching the two least significant
671
     bits.  Should have been named R_PPC64_REL30!  */
672
  HOWTO (R_PPC64_ADDR30,        /* type */
673
         2,                     /* rightshift */
674
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
675
         30,                    /* bitsize */
676
         true,                  /* pc_relative */
677
         0,                      /* bitpos */
678
         complain_overflow_dont, /* complain_on_overflow */
679
         bfd_elf_generic_reloc, /* special_function */
680
         "R_PPC64_ADDR30",      /* name */
681
         false,                 /* partial_inplace */
682
         0,                      /* src_mask */
683
         0xfffffffc,            /* dst_mask */
684
         true),                 /* pcrel_offset */
685
 
686
  /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI.  */
687
 
688
  /* A standard 64-bit relocation.  */
689
  HOWTO (R_PPC64_ADDR64,        /* type */
690
         0,                      /* rightshift */
691
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
692
         64,                    /* bitsize */
693
         false,                 /* pc_relative */
694
         0,                      /* bitpos */
695
         complain_overflow_dont, /* complain_on_overflow */
696
         bfd_elf_generic_reloc, /* special_function */
697
         "R_PPC64_ADDR64",      /* name */
698
         false,                 /* partial_inplace */
699
         0,                      /* src_mask */
700
         ONES (64),             /* dst_mask */
701
         false),                /* pcrel_offset */
702
 
703
  /* The bits 32-47 of an address.  */
704
  HOWTO (R_PPC64_ADDR16_HIGHER, /* type */
705
         32,                    /* rightshift */
706
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
707
         16,                    /* bitsize */
708
         false,                 /* pc_relative */
709
         0,                      /* bitpos */
710
         complain_overflow_dont, /* complain_on_overflow */
711
         bfd_elf_generic_reloc, /* special_function */
712
         "R_PPC64_ADDR16_HIGHER", /* name */
713
         false,                 /* partial_inplace */
714
         0,                      /* src_mask */
715
         0xffff,                /* dst_mask */
716
         false),                /* pcrel_offset */
717
 
718
  /* The bits 32-47 of an address, plus 1 if the contents of the low
719
     16 bits, treated as a signed number, is negative.  */
720
  HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */
721
         32,                    /* rightshift */
722
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
723
         16,                    /* bitsize */
724
         false,                 /* pc_relative */
725
         0,                      /* bitpos */
726
         complain_overflow_dont, /* complain_on_overflow */
727
         ppc64_elf_ha_reloc,    /* special_function */
728
         "R_PPC64_ADDR16_HIGHERA", /* name */
729
         false,                 /* partial_inplace */
730
         0,                      /* src_mask */
731
         0xffff,                /* dst_mask */
732
         false),                /* pcrel_offset */
733
 
734
  /* The bits 48-63 of an address.  */
735
  HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */
736
         48,                    /* rightshift */
737
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
738
         16,                    /* bitsize */
739
         false,                 /* pc_relative */
740
         0,                      /* bitpos */
741
         complain_overflow_dont, /* complain_on_overflow */
742
         bfd_elf_generic_reloc, /* special_function */
743
         "R_PPC64_ADDR16_HIGHEST", /* name */
744
         false,                 /* partial_inplace */
745
         0,                      /* src_mask */
746
         0xffff,                /* dst_mask */
747
         false),                /* pcrel_offset */
748
 
749
  /* The bits 48-63 of an address, plus 1 if the contents of the low
750
     16 bits, treated as a signed number, is negative.  */
751
  HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */
752
         48,                    /* rightshift */
753
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
754
         16,                    /* bitsize */
755
         false,                 /* pc_relative */
756
         0,                      /* bitpos */
757
         complain_overflow_dont, /* complain_on_overflow */
758
         ppc64_elf_ha_reloc,    /* special_function */
759
         "R_PPC64_ADDR16_HIGHESTA", /* name */
760
         false,                 /* partial_inplace */
761
         0,                      /* src_mask */
762
         0xffff,                /* dst_mask */
763
         false),                /* pcrel_offset */
764
 
765
  /* Like ADDR64, but may be unaligned.  */
766
  HOWTO (R_PPC64_UADDR64,       /* type */
767
         0,                      /* rightshift */
768
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
769
         64,                    /* bitsize */
770
         false,                 /* pc_relative */
771
         0,                      /* bitpos */
772
         complain_overflow_dont, /* complain_on_overflow */
773
         bfd_elf_generic_reloc, /* special_function */
774
         "R_PPC64_UADDR64",     /* name */
775
         false,                 /* partial_inplace */
776
         0,                      /* src_mask */
777
         ONES (64),             /* dst_mask */
778
         false),                /* pcrel_offset */
779
 
780
  /* 64-bit relative relocation.  */
781
  HOWTO (R_PPC64_REL64,         /* type */
782
         0,                      /* rightshift */
783
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
784
         64,                    /* bitsize */
785
         true,                  /* pc_relative */
786
         0,                      /* bitpos */
787
         complain_overflow_dont, /* complain_on_overflow */
788
         bfd_elf_generic_reloc, /* special_function */
789
         "R_PPC64_REL64",       /* name */
790
         false,                 /* partial_inplace */
791
         0,                      /* src_mask */
792
         ONES (64),             /* dst_mask */
793
         true),                 /* pcrel_offset */
794
 
795
  /* 64-bit relocation to the symbol's procedure linkage table.  */
796
  HOWTO (R_PPC64_PLT64,         /* type */
797
         0,                      /* rightshift */
798
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
799
         64,                    /* bitsize */
800
         false,                 /* pc_relative */
801
         0,                      /* bitpos */
802
         complain_overflow_dont, /* complain_on_overflow */
803
         ppc64_elf_unhandled_reloc, /* special_function */
804
         "R_PPC64_PLT64",       /* name */
805
         false,                 /* partial_inplace */
806
         0,                      /* src_mask */
807
         ONES (64),             /* dst_mask */
808
         false),                /* pcrel_offset */
809
 
810
  /* 64-bit PC relative relocation to the symbol's procedure linkage
811
     table.  */
812
  /* FIXME: R_PPC64_PLTREL64 not supported.  */
813
  HOWTO (R_PPC64_PLTREL64,      /* type */
814
         0,                      /* rightshift */
815
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
816
         64,                    /* bitsize */
817
         true,                  /* pc_relative */
818
         0,                      /* bitpos */
819
         complain_overflow_dont, /* complain_on_overflow */
820
         ppc64_elf_unhandled_reloc, /* special_function */
821
         "R_PPC64_PLTREL64",    /* name */
822
         false,                 /* partial_inplace */
823
         0,                      /* src_mask */
824
         ONES (64),             /* dst_mask */
825
         true),                 /* pcrel_offset */
826
 
827
  /* 16 bit TOC-relative relocation.  */
828
 
829
  /* R_PPC64_TOC16        47       half16*      S + A - .TOC.  */
830
  HOWTO (R_PPC64_TOC16,         /* type */
831
         0,                      /* rightshift */
832
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
833
         16,                    /* bitsize */
834
         false,                 /* pc_relative */
835
         0,                      /* bitpos */
836
         complain_overflow_signed, /* complain_on_overflow */
837
         ppc64_elf_toc_reloc,   /* special_function */
838
         "R_PPC64_TOC16",       /* name */
839
         false,                 /* partial_inplace */
840
         0,                      /* src_mask */
841
         0xffff,                /* dst_mask */
842
         false),                /* pcrel_offset */
843
 
844
  /* 16 bit TOC-relative relocation without overflow.  */
845
 
846
  /* R_PPC64_TOC16_LO     48       half16        #lo (S + A - .TOC.)  */
847
  HOWTO (R_PPC64_TOC16_LO,      /* type */
848
         0,                      /* rightshift */
849
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
850
         16,                    /* bitsize */
851
         false,                 /* pc_relative */
852
         0,                      /* bitpos */
853
         complain_overflow_dont, /* complain_on_overflow */
854
         ppc64_elf_toc_reloc,   /* special_function */
855
         "R_PPC64_TOC16_LO",    /* name */
856
         false,                 /* partial_inplace */
857
         0,                      /* src_mask */
858
         0xffff,                /* dst_mask */
859
         false),                /* pcrel_offset */
860
 
861
  /* 16 bit TOC-relative relocation, high 16 bits.  */
862
 
863
  /* R_PPC64_TOC16_HI     49       half16        #hi (S + A - .TOC.)  */
864
  HOWTO (R_PPC64_TOC16_HI,      /* type */
865
         16,                    /* rightshift */
866
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
867
         16,                    /* bitsize */
868
         false,                 /* pc_relative */
869
         0,                      /* bitpos */
870
         complain_overflow_dont, /* complain_on_overflow */
871
         ppc64_elf_toc_reloc,   /* special_function */
872
         "R_PPC64_TOC16_HI",    /* name */
873
         false,                 /* partial_inplace */
874
         0,                      /* src_mask */
875
         0xffff,                /* dst_mask */
876
         false),                /* pcrel_offset */
877
 
878
  /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
879
     contents of the low 16 bits, treated as a signed number, is
880
     negative.  */
881
 
882
  /* R_PPC64_TOC16_HA     50       half16        #ha (S + A - .TOC.)  */
883
  HOWTO (R_PPC64_TOC16_HA,      /* type */
884
         16,                    /* rightshift */
885
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
886
         16,                    /* bitsize */
887
         false,                 /* pc_relative */
888
         0,                      /* bitpos */
889
         complain_overflow_dont, /* complain_on_overflow */
890
         ppc64_elf_toc_ha_reloc, /* special_function */
891
         "R_PPC64_TOC16_HA",    /* name */
892
         false,                 /* partial_inplace */
893
         0,                      /* src_mask */
894
         0xffff,                /* dst_mask */
895
         false),                /* pcrel_offset */
896
 
897
  /* 64-bit relocation; insert value of TOC base (.TOC.).  */
898
 
899
  /* R_PPC64_TOC                  51       doubleword64  .TOC.  */
900
  HOWTO (R_PPC64_TOC,           /* type */
901
         0,                      /* rightshift */
902
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
903
         64,                    /* bitsize */
904
         false,                 /* pc_relative */
905
         0,                      /* bitpos */
906
         complain_overflow_bitfield, /* complain_on_overflow */
907
         ppc64_elf_toc64_reloc, /* special_function */
908
         "R_PPC64_TOC",         /* name */
909
         false,                 /* partial_inplace */
910
         0,                      /* src_mask */
911
         ONES (64),             /* dst_mask */
912
         false),                /* pcrel_offset */
913
 
914
  /* Like R_PPC64_GOT16, but also informs the link editor that the
915
     value to relocate may (!) refer to a PLT entry which the link
916
     editor (a) may replace with the symbol value.  If the link editor
917
     is unable to fully resolve the symbol, it may (b) create a PLT
918
     entry and store the address to the new PLT entry in the GOT.
919
     This permits lazy resolution of function symbols at run time.
920
     The link editor may also skip all of this and just (c) emit a
921
     R_PPC64_GLOB_DAT to tie the symbol to the GOT entry.  */
922
  /* FIXME: R_PPC64_PLTGOT16 not implemented.  */
923
    HOWTO (R_PPC64_PLTGOT16,    /* type */
924
         0,                      /* rightshift */
925
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
926
         16,                    /* bitsize */
927
         false,                 /* pc_relative */
928
         0,                      /* bitpos */
929
         complain_overflow_signed, /* complain_on_overflow */
930
         ppc64_elf_unhandled_reloc, /* special_function */
931
         "R_PPC64_PLTGOT16",    /* name */
932
         false,                 /* partial_inplace */
933
         0,                      /* src_mask */
934
         0xffff,                /* dst_mask */
935
         false),                /* pcrel_offset */
936
 
937
  /* Like R_PPC64_PLTGOT16, but without overflow.  */
938
  /* FIXME: R_PPC64_PLTGOT16_LO not implemented.  */
939
  HOWTO (R_PPC64_PLTGOT16_LO,   /* type */
940
         0,                      /* rightshift */
941
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
942
         16,                    /* bitsize */
943
         false,                 /* pc_relative */
944
         0,                      /* bitpos */
945
         complain_overflow_dont, /* complain_on_overflow */
946
         ppc64_elf_unhandled_reloc, /* special_function */
947
         "R_PPC64_PLTGOT16_LO", /* name */
948
         false,                 /* partial_inplace */
949
         0,                      /* src_mask */
950
         0xffff,                /* dst_mask */
951
         false),                /* pcrel_offset */
952
 
953
  /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address.  */
954
  /* FIXME: R_PPC64_PLTGOT16_HI not implemented.  */
955
  HOWTO (R_PPC64_PLTGOT16_HI,   /* type */
956
         16,                    /* rightshift */
957
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
958
         16,                    /* bitsize */
959
         false,                 /* pc_relative */
960
         0,                      /* bitpos */
961
         complain_overflow_dont, /* complain_on_overflow */
962
         ppc64_elf_unhandled_reloc, /* special_function */
963
         "R_PPC64_PLTGOT16_HI", /* name */
964
         false,                 /* partial_inplace */
965
         0,                      /* src_mask */
966
         0xffff,                /* dst_mask */
967
         false),                /* pcrel_offset */
968
 
969
  /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
970
     1 if the contents of the low 16 bits, treated as a signed number,
971
     is negative.  */
972
  /* FIXME: R_PPC64_PLTGOT16_HA not implemented.  */
973
  HOWTO (R_PPC64_PLTGOT16_HA,   /* type */
974
         16,                    /* rightshift */
975
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
976
         16,                    /* bitsize */
977
         false,                 /* pc_relative */
978
         0,                      /* bitpos */
979
         complain_overflow_dont,/* complain_on_overflow */
980
         ppc64_elf_unhandled_reloc, /* special_function */
981
         "R_PPC64_PLTGOT16_HA", /* name */
982
         false,                 /* partial_inplace */
983
         0,                      /* src_mask */
984
         0xffff,                /* dst_mask */
985
         false),                /* pcrel_offset */
986
 
987
  /* Like R_PPC64_ADDR16, but for instructions with a DS field.  */
988
  HOWTO (R_PPC64_ADDR16_DS,     /* type */
989
         0,                      /* rightshift */
990
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
991
         16,                    /* bitsize */
992
         false,                 /* pc_relative */
993
         0,                      /* bitpos */
994
         complain_overflow_bitfield, /* complain_on_overflow */
995
         bfd_elf_generic_reloc, /* special_function */
996
         "R_PPC64_ADDR16_DS",   /* name */
997
         false,                 /* partial_inplace */
998
         0,                      /* src_mask */
999
         0xfffc,                /* dst_mask */
1000
         false),                /* pcrel_offset */
1001
 
1002
  /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field.  */
1003
  HOWTO (R_PPC64_ADDR16_LO_DS,  /* type */
1004
         0,                      /* rightshift */
1005
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1006
         16,                    /* bitsize */
1007
         false,                 /* pc_relative */
1008
         0,                      /* bitpos */
1009
         complain_overflow_dont,/* complain_on_overflow */
1010
         bfd_elf_generic_reloc, /* special_function */
1011
         "R_PPC64_ADDR16_LO_DS",/* name */
1012
         false,                 /* partial_inplace */
1013
         0,                      /* src_mask */
1014
         0xfffc,                /* dst_mask */
1015
         false),                /* pcrel_offset */
1016
 
1017
  /* Like R_PPC64_GOT16, but for instructions with a DS field.  */
1018
  HOWTO (R_PPC64_GOT16_DS,      /* type */
1019
         0,                      /* rightshift */
1020
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1021
         16,                    /* bitsize */
1022
         false,                 /* pc_relative */
1023
         0,                      /* bitpos */
1024
         complain_overflow_signed, /* complain_on_overflow */
1025
         ppc64_elf_unhandled_reloc, /* special_function */
1026
         "R_PPC64_GOT16_DS",    /* name */
1027
         false,                 /* partial_inplace */
1028
         0,                      /* src_mask */
1029
         0xfffc,                /* dst_mask */
1030
         false),                /* pcrel_offset */
1031
 
1032
  /* Like R_PPC64_GOT16_LO, but for instructions with a DS field.  */
1033
  HOWTO (R_PPC64_GOT16_LO_DS,   /* type */
1034
         0,                      /* rightshift */
1035
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1036
         16,                    /* bitsize */
1037
         false,                 /* pc_relative */
1038
         0,                      /* bitpos */
1039
         complain_overflow_dont, /* complain_on_overflow */
1040
         ppc64_elf_unhandled_reloc, /* special_function */
1041
         "R_PPC64_GOT16_LO_DS", /* name */
1042
         false,                 /* partial_inplace */
1043
         0,                      /* src_mask */
1044
         0xfffc,                /* dst_mask */
1045
         false),                /* pcrel_offset */
1046
 
1047
  /* Like R_PPC64_PLT16_LO, but for instructions with a DS field.  */
1048
  HOWTO (R_PPC64_PLT16_LO_DS,   /* type */
1049
         0,                      /* rightshift */
1050
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1051
         16,                    /* bitsize */
1052
         false,                 /* pc_relative */
1053
         0,                      /* bitpos */
1054
         complain_overflow_dont, /* complain_on_overflow */
1055
         ppc64_elf_unhandled_reloc, /* special_function */
1056
         "R_PPC64_PLT16_LO_DS", /* name */
1057
         false,                 /* partial_inplace */
1058
         0,                      /* src_mask */
1059
         0xfffc,                /* dst_mask */
1060
         false),                /* pcrel_offset */
1061
 
1062
  /* Like R_PPC64_SECTOFF, but for instructions with a DS field.  */
1063
  HOWTO (R_PPC64_SECTOFF_DS,    /* type */
1064
         0,                      /* rightshift */
1065
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1066
         16,                    /* bitsize */
1067
         false,                 /* pc_relative */
1068
         0,                      /* bitpos */
1069
         complain_overflow_bitfield, /* complain_on_overflow */
1070
         ppc64_elf_sectoff_reloc, /* special_function */
1071
         "R_PPC64_SECTOFF_DS",  /* name */
1072
         false,                 /* partial_inplace */
1073
         0,                      /* src_mask */
1074
         0xfffc,                /* dst_mask */
1075
         false),                /* pcrel_offset */
1076
 
1077
  /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field.  */
1078
  HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */
1079
         0,                      /* rightshift */
1080
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1081
         16,                    /* bitsize */
1082
         false,                 /* pc_relative */
1083
         0,                      /* bitpos */
1084
         complain_overflow_dont, /* complain_on_overflow */
1085
         ppc64_elf_sectoff_reloc, /* special_function */
1086
         "R_PPC64_SECTOFF_LO_DS",/* name */
1087
         false,                 /* partial_inplace */
1088
         0,                      /* src_mask */
1089
         0xfffc,                /* dst_mask */
1090
         false),                /* pcrel_offset */
1091
 
1092
  /* Like R_PPC64_TOC16, but for instructions with a DS field.  */
1093
  HOWTO (R_PPC64_TOC16_DS,      /* type */
1094
         0,                      /* rightshift */
1095
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1096
         16,                    /* bitsize */
1097
         false,                 /* pc_relative */
1098
         0,                      /* bitpos */
1099
         complain_overflow_signed, /* complain_on_overflow */
1100
         ppc64_elf_toc_reloc,   /* special_function */
1101
         "R_PPC64_TOC16_DS",    /* name */
1102
         false,                 /* partial_inplace */
1103
         0,                      /* src_mask */
1104
         0xfffc,                /* dst_mask */
1105
         false),                /* pcrel_offset */
1106
 
1107
  /* Like R_PPC64_TOC16_LO, but for instructions with a DS field.  */
1108
  HOWTO (R_PPC64_TOC16_LO_DS,   /* type */
1109
         0,                      /* rightshift */
1110
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1111
         16,                    /* bitsize */
1112
         false,                 /* pc_relative */
1113
         0,                      /* bitpos */
1114
         complain_overflow_dont, /* complain_on_overflow */
1115
         ppc64_elf_toc_reloc,   /* special_function */
1116
         "R_PPC64_TOC16_LO_DS", /* name */
1117
         false,                 /* partial_inplace */
1118
         0,                      /* src_mask */
1119
         0xfffc,                /* dst_mask */
1120
         false),                /* pcrel_offset */
1121
 
1122
  /* Like R_PPC64_PLTGOT16, but for instructions with a DS field.  */
1123
  /* FIXME: R_PPC64_PLTGOT16_DS not implemented.  */
1124
    HOWTO (R_PPC64_PLTGOT16_DS, /* type */
1125
         0,                      /* rightshift */
1126
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1127
         16,                    /* bitsize */
1128
         false,                 /* pc_relative */
1129
         0,                      /* bitpos */
1130
         complain_overflow_signed, /* complain_on_overflow */
1131
         ppc64_elf_unhandled_reloc, /* special_function */
1132
         "R_PPC64_PLTGOT16_DS", /* name */
1133
         false,                 /* partial_inplace */
1134
         0,                      /* src_mask */
1135
         0xfffc,                /* dst_mask */
1136
         false),                /* pcrel_offset */
1137
 
1138
  /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field.  */
1139
  /* FIXME: R_PPC64_PLTGOT16_LO not implemented.  */
1140
  HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */
1141
         0,                      /* rightshift */
1142
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1143
         16,                    /* bitsize */
1144
         false,                 /* pc_relative */
1145
         0,                      /* bitpos */
1146
         complain_overflow_dont, /* complain_on_overflow */
1147
         ppc64_elf_unhandled_reloc, /* special_function */
1148
         "R_PPC64_PLTGOT16_LO_DS",/* name */
1149
         false,                 /* partial_inplace */
1150
         0,                      /* src_mask */
1151
         0xfffc,                /* dst_mask */
1152
         false),                /* pcrel_offset */
1153
 
1154
  /* GNU extension to record C++ vtable hierarchy.  */
1155
  HOWTO (R_PPC64_GNU_VTINHERIT, /* type */
1156
         0,                      /* rightshift */
1157
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
1158
         0,                      /* bitsize */
1159
         false,                 /* pc_relative */
1160
         0,                      /* bitpos */
1161
         complain_overflow_dont, /* complain_on_overflow */
1162
         NULL,                  /* special_function */
1163
         "R_PPC64_GNU_VTINHERIT", /* name */
1164
         false,                 /* partial_inplace */
1165
         0,                      /* src_mask */
1166
         0,                      /* dst_mask */
1167
         false),                /* pcrel_offset */
1168
 
1169
  /* GNU extension to record C++ vtable member usage.  */
1170
  HOWTO (R_PPC64_GNU_VTENTRY,   /* type */
1171
         0,                      /* rightshift */
1172
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
1173
         0,                      /* bitsize */
1174
         false,                 /* pc_relative */
1175
         0,                      /* bitpos */
1176
         complain_overflow_dont, /* complain_on_overflow */
1177
         NULL,                  /* special_function */
1178
         "R_PPC64_GNU_VTENTRY", /* name */
1179
         false,                 /* partial_inplace */
1180
         0,                      /* src_mask */
1181
         0,                      /* dst_mask */
1182
         false),                /* pcrel_offset */
1183
};
1184
 
1185
 
1186
/* Initialize the ppc64_elf_howto_table, so that linear accesses can
1187
   be done.  */
1188
 
1189
static void
1190
ppc_howto_init ()
1191
{
1192
  unsigned int i, type;
1193
 
1194
  for (i = 0;
1195
       i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
1196
       i++)
1197
    {
1198
      type = ppc64_elf_howto_raw[i].type;
1199
      BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table)
1200
                          / sizeof (ppc64_elf_howto_table[0])));
1201
      ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
1202
    }
1203
}
1204
 
1205
static reloc_howto_type *
1206
ppc64_elf_reloc_type_lookup (abfd, code)
1207
     bfd *abfd ATTRIBUTE_UNUSED;
1208
     bfd_reloc_code_real_type code;
1209
{
1210
  enum elf_ppc_reloc_type ppc_reloc = R_PPC_NONE;
1211
 
1212
  if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
1213
    /* Initialize howto table if needed.  */
1214
    ppc_howto_init ();
1215
 
1216
  switch ((int) code)
1217
    {
1218
    default:
1219
      return (reloc_howto_type *) NULL;
1220
 
1221
    case BFD_RELOC_NONE:                 ppc_reloc = R_PPC64_NONE;
1222
      break;
1223
    case BFD_RELOC_32:                   ppc_reloc = R_PPC64_ADDR32;
1224
      break;
1225
    case BFD_RELOC_PPC_BA26:             ppc_reloc = R_PPC64_ADDR24;
1226
      break;
1227
    case BFD_RELOC_16:                   ppc_reloc = R_PPC64_ADDR16;
1228
      break;
1229
    case BFD_RELOC_LO16:                 ppc_reloc = R_PPC64_ADDR16_LO;
1230
      break;
1231
    case BFD_RELOC_HI16:                 ppc_reloc = R_PPC64_ADDR16_HI;
1232
      break;
1233
    case BFD_RELOC_HI16_S:               ppc_reloc = R_PPC64_ADDR16_HA;
1234
      break;
1235
    case BFD_RELOC_PPC_BA16:             ppc_reloc = R_PPC64_ADDR14;
1236
      break;
1237
    case BFD_RELOC_PPC_BA16_BRTAKEN:     ppc_reloc = R_PPC64_ADDR14_BRTAKEN;
1238
      break;
1239
    case BFD_RELOC_PPC_BA16_BRNTAKEN:    ppc_reloc = R_PPC64_ADDR14_BRNTAKEN;
1240
      break;
1241
    case BFD_RELOC_PPC_B26:              ppc_reloc = R_PPC64_REL24;
1242
      break;
1243
    case BFD_RELOC_PPC_B16:              ppc_reloc = R_PPC64_REL14;
1244
      break;
1245
    case BFD_RELOC_PPC_B16_BRTAKEN:      ppc_reloc = R_PPC64_REL14_BRTAKEN;
1246
      break;
1247
    case BFD_RELOC_PPC_B16_BRNTAKEN:     ppc_reloc = R_PPC64_REL14_BRNTAKEN;
1248
      break;
1249
    case BFD_RELOC_16_GOTOFF:            ppc_reloc = R_PPC64_GOT16;
1250
      break;
1251
    case BFD_RELOC_LO16_GOTOFF:          ppc_reloc = R_PPC64_GOT16_LO;
1252
      break;
1253
    case BFD_RELOC_HI16_GOTOFF:          ppc_reloc = R_PPC64_GOT16_HI;
1254
      break;
1255
    case BFD_RELOC_HI16_S_GOTOFF:        ppc_reloc = R_PPC64_GOT16_HA;
1256
      break;
1257
    case BFD_RELOC_PPC_COPY:             ppc_reloc = R_PPC64_COPY;
1258
      break;
1259
    case BFD_RELOC_PPC_GLOB_DAT:         ppc_reloc = R_PPC64_GLOB_DAT;
1260
      break;
1261
    case BFD_RELOC_32_PCREL:             ppc_reloc = R_PPC64_REL32;
1262
      break;
1263
    case BFD_RELOC_32_PLTOFF:            ppc_reloc = R_PPC64_PLT32;
1264
      break;
1265
    case BFD_RELOC_32_PLT_PCREL:         ppc_reloc = R_PPC64_PLTREL32;
1266
      break;
1267
    case BFD_RELOC_LO16_PLTOFF:          ppc_reloc = R_PPC64_PLT16_LO;
1268
      break;
1269
    case BFD_RELOC_HI16_PLTOFF:          ppc_reloc = R_PPC64_PLT16_HI;
1270
      break;
1271
    case BFD_RELOC_HI16_S_PLTOFF:        ppc_reloc = R_PPC64_PLT16_HA;
1272
      break;
1273
    case BFD_RELOC_16_BASEREL:           ppc_reloc = R_PPC64_SECTOFF;
1274
      break;
1275
    case BFD_RELOC_LO16_BASEREL:         ppc_reloc = R_PPC64_SECTOFF_LO;
1276
      break;
1277
    case BFD_RELOC_HI16_BASEREL:         ppc_reloc = R_PPC64_SECTOFF_HI;
1278
      break;
1279
    case BFD_RELOC_HI16_S_BASEREL:       ppc_reloc = R_PPC64_SECTOFF_HA;
1280
      break;
1281
    case BFD_RELOC_CTOR:                 ppc_reloc = R_PPC64_ADDR64;
1282
      break;
1283
    case BFD_RELOC_64:                   ppc_reloc = R_PPC64_ADDR64;
1284
      break;
1285
    case BFD_RELOC_PPC64_HIGHER:         ppc_reloc = R_PPC64_ADDR16_HIGHER;
1286
      break;
1287
    case BFD_RELOC_PPC64_HIGHER_S:       ppc_reloc = R_PPC64_ADDR16_HIGHERA;
1288
      break;
1289
    case BFD_RELOC_PPC64_HIGHEST:        ppc_reloc = R_PPC64_ADDR16_HIGHEST;
1290
      break;
1291
    case BFD_RELOC_PPC64_HIGHEST_S:      ppc_reloc = R_PPC64_ADDR16_HIGHESTA;
1292
      break;
1293
    case BFD_RELOC_64_PCREL:             ppc_reloc = R_PPC64_REL64;
1294
      break;
1295
    case BFD_RELOC_64_PLTOFF:            ppc_reloc = R_PPC64_PLT64;
1296
      break;
1297
    case BFD_RELOC_64_PLT_PCREL:         ppc_reloc = R_PPC64_PLTREL64;
1298
      break;
1299
    case BFD_RELOC_PPC_TOC16:            ppc_reloc = R_PPC64_TOC16;
1300
      break;
1301
    case BFD_RELOC_PPC64_TOC16_LO:       ppc_reloc = R_PPC64_TOC16_LO;
1302
      break;
1303
    case BFD_RELOC_PPC64_TOC16_HI:       ppc_reloc = R_PPC64_TOC16_HI;
1304
      break;
1305
    case BFD_RELOC_PPC64_TOC16_HA:       ppc_reloc = R_PPC64_TOC16_HA;
1306
      break;
1307
    case BFD_RELOC_PPC64_TOC:            ppc_reloc = R_PPC64_TOC;
1308
      break;
1309
    case BFD_RELOC_PPC64_PLTGOT16:       ppc_reloc = R_PPC64_PLTGOT16;
1310
      break;
1311
    case BFD_RELOC_PPC64_PLTGOT16_LO:    ppc_reloc = R_PPC64_PLTGOT16_LO;
1312
      break;
1313
    case BFD_RELOC_PPC64_PLTGOT16_HI:    ppc_reloc = R_PPC64_PLTGOT16_HI;
1314
      break;
1315
    case BFD_RELOC_PPC64_PLTGOT16_HA:    ppc_reloc = R_PPC64_PLTGOT16_HA;
1316
      break;
1317
    case BFD_RELOC_PPC64_ADDR16_DS:      ppc_reloc = R_PPC64_ADDR16_DS;
1318
      break;
1319
    case BFD_RELOC_PPC64_ADDR16_LO_DS:   ppc_reloc = R_PPC64_ADDR16_LO_DS;
1320
      break;
1321
    case BFD_RELOC_PPC64_GOT16_DS:       ppc_reloc = R_PPC64_GOT16_DS;
1322
      break;
1323
    case BFD_RELOC_PPC64_GOT16_LO_DS:    ppc_reloc = R_PPC64_GOT16_LO_DS;
1324
      break;
1325
    case BFD_RELOC_PPC64_PLT16_LO_DS:    ppc_reloc = R_PPC64_PLT16_LO_DS;
1326
      break;
1327
    case BFD_RELOC_PPC64_SECTOFF_DS:     ppc_reloc = R_PPC64_SECTOFF_DS;
1328
      break;
1329
    case BFD_RELOC_PPC64_SECTOFF_LO_DS:  ppc_reloc = R_PPC64_SECTOFF_LO_DS;
1330
      break;
1331
    case BFD_RELOC_PPC64_TOC16_DS:       ppc_reloc = R_PPC64_TOC16_DS;
1332
      break;
1333
    case BFD_RELOC_PPC64_TOC16_LO_DS:    ppc_reloc = R_PPC64_TOC16_LO_DS;
1334
      break;
1335
    case BFD_RELOC_PPC64_PLTGOT16_DS:    ppc_reloc = R_PPC64_PLTGOT16_DS;
1336
      break;
1337
    case BFD_RELOC_PPC64_PLTGOT16_LO_DS: ppc_reloc = R_PPC64_PLTGOT16_LO_DS;
1338
      break;
1339
    case BFD_RELOC_VTABLE_INHERIT:       ppc_reloc = R_PPC64_GNU_VTINHERIT;
1340
      break;
1341
    case BFD_RELOC_VTABLE_ENTRY:         ppc_reloc = R_PPC64_GNU_VTENTRY;
1342
      break;
1343
    }
1344
 
1345
  return ppc64_elf_howto_table[(int) ppc_reloc];
1346
};
1347
 
1348
/* Set the howto pointer for a PowerPC ELF reloc.  */
1349
 
1350
static void
1351
ppc64_elf_info_to_howto (abfd, cache_ptr, dst)
1352
     bfd *abfd ATTRIBUTE_UNUSED;
1353
     arelent *cache_ptr;
1354
     Elf64_Internal_Rela *dst;
1355
{
1356
  unsigned int type;
1357
 
1358
  /* Initialize howto table if needed.  */
1359
  if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
1360
    ppc_howto_init ();
1361
 
1362
  type = ELF64_R_TYPE (dst->r_info);
1363
  BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table)
1364
                      / sizeof (ppc64_elf_howto_table[0])));
1365
  cache_ptr->howto = ppc64_elf_howto_table[type];
1366
}
1367
 
1368
/* Handle the R_PPC_ADDR16_HA and similar relocs.  */
1369
 
1370
static bfd_reloc_status_type
1371
ppc64_elf_ha_reloc (abfd, reloc_entry, symbol, data,
1372
                    input_section, output_bfd, error_message)
1373
     bfd *abfd;
1374
     arelent *reloc_entry;
1375
     asymbol *symbol;
1376
     PTR data;
1377
     asection *input_section;
1378
     bfd *output_bfd;
1379
     char **error_message;
1380
{
1381
  /* If this is a relocatable link (output_bfd test tells us), just
1382
     call the generic function.  Any adjustment will be done at final
1383
     link time.  */
1384
  if (output_bfd != NULL)
1385
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1386
                                  input_section, output_bfd, error_message);
1387
 
1388
  /* Adjust the addend for sign extension of the low 16 bits.
1389
     We won't actually be using the low 16 bits, so trashing them
1390
     doesn't matter.  */
1391
  reloc_entry->addend += 0x8000;
1392
  return bfd_reloc_continue;
1393
}
1394
 
1395
static bfd_reloc_status_type
1396
ppc64_elf_brtaken_reloc (abfd, reloc_entry, symbol, data,
1397
                         input_section, output_bfd, error_message)
1398
     bfd *abfd;
1399
     arelent *reloc_entry;
1400
     asymbol *symbol;
1401
     PTR data;
1402
     asection *input_section;
1403
     bfd *output_bfd;
1404
     char **error_message;
1405
{
1406
  long insn;
1407
  enum elf_ppc_reloc_type r_type;
1408
  bfd_size_type octets;
1409
  /* Disabled until we sort out how ld should choose 'y' vs 'at'.  */
1410
  boolean is_power4 = false;
1411
 
1412
  /* If this is a relocatable link (output_bfd test tells us), just
1413
     call the generic function.  Any adjustment will be done at final
1414
     link time.  */
1415
  if (output_bfd != NULL)
1416
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1417
                                  input_section, output_bfd, error_message);
1418
 
1419
  octets = reloc_entry->address * bfd_octets_per_byte (abfd);
1420
  insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
1421
  insn &= ~(0x01 << 21);
1422
  r_type = (enum elf_ppc_reloc_type) reloc_entry->howto->type;
1423
  if (r_type == R_PPC64_ADDR14_BRTAKEN
1424
      || r_type == R_PPC64_REL14_BRTAKEN)
1425
    insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field.  */
1426
 
1427
  if (is_power4)
1428
    {
1429
      /* Set 'a' bit.  This is 0b00010 in BO field for branch
1430
         on CR(BI) insns (BO == 001at or 011at), and 0b01000
1431
         for branch on CTR insns (BO == 1a00t or 1a01t).  */
1432
      if ((insn & (0x14 << 21)) == (0x04 << 21))
1433
        insn |= 0x02 << 21;
1434
      else if ((insn & (0x14 << 21)) == (0x10 << 21))
1435
        insn |= 0x08 << 21;
1436
      else
1437
        return bfd_reloc_continue;
1438
    }
1439
  else
1440
    {
1441
      bfd_vma target = 0;
1442
      bfd_vma from;
1443
 
1444
      if (!bfd_is_com_section (symbol->section))
1445
        target = symbol->value;
1446
      target += symbol->section->output_section->vma;
1447
      target += symbol->section->output_offset;
1448
      target += reloc_entry->addend;
1449
 
1450
      from = (reloc_entry->address
1451
              + input_section->output_offset
1452
              + input_section->output_section->vma);
1453
 
1454
      /* Invert 'y' bit if not the default.  */
1455
      if ((bfd_signed_vma) (target - from) < 0)
1456
        insn ^= 0x01 << 21;
1457
    }
1458
  bfd_put_32 (abfd, (bfd_vma) insn, (bfd_byte *) data + octets);
1459
  return bfd_reloc_continue;
1460
}
1461
 
1462
static bfd_reloc_status_type
1463
ppc64_elf_sectoff_reloc (abfd, reloc_entry, symbol, data,
1464
                         input_section, output_bfd, error_message)
1465
     bfd *abfd;
1466
     arelent *reloc_entry;
1467
     asymbol *symbol;
1468
     PTR data;
1469
     asection *input_section;
1470
     bfd *output_bfd;
1471
     char **error_message;
1472
{
1473
  /* If this is a relocatable link (output_bfd test tells us), just
1474
     call the generic function.  Any adjustment will be done at final
1475
     link time.  */
1476
  if (output_bfd != NULL)
1477
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1478
                                  input_section, output_bfd, error_message);
1479
 
1480
  /* Subtract the symbol section base address.  */
1481
  reloc_entry->addend -= symbol->section->output_section->vma;
1482
  return bfd_reloc_continue;
1483
}
1484
 
1485
static bfd_reloc_status_type
1486
ppc64_elf_sectoff_ha_reloc (abfd, reloc_entry, symbol, data,
1487
                            input_section, output_bfd, error_message)
1488
     bfd *abfd;
1489
     arelent *reloc_entry;
1490
     asymbol *symbol;
1491
     PTR data;
1492
     asection *input_section;
1493
     bfd *output_bfd;
1494
     char **error_message;
1495
{
1496
  /* If this is a relocatable link (output_bfd test tells us), just
1497
     call the generic function.  Any adjustment will be done at final
1498
     link time.  */
1499
  if (output_bfd != NULL)
1500
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1501
                                  input_section, output_bfd, error_message);
1502
 
1503
  /* Subtract the symbol section base address.  */
1504
  reloc_entry->addend -= symbol->section->output_section->vma;
1505
 
1506
  /* Adjust the addend for sign extension of the low 16 bits.  */
1507
  reloc_entry->addend += 0x8000;
1508
  return bfd_reloc_continue;
1509
}
1510
 
1511
static bfd_reloc_status_type
1512
ppc64_elf_toc_reloc (abfd, reloc_entry, symbol, data,
1513
                     input_section, output_bfd, error_message)
1514
     bfd *abfd;
1515
     arelent *reloc_entry;
1516
     asymbol *symbol;
1517
     PTR data;
1518
     asection *input_section;
1519
     bfd *output_bfd;
1520
     char **error_message;
1521
{
1522
  bfd_vma TOCstart;
1523
 
1524
  /* If this is a relocatable link (output_bfd test tells us), just
1525
     call the generic function.  Any adjustment will be done at final
1526
     link time.  */
1527
  if (output_bfd != NULL)
1528
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1529
                                  input_section, output_bfd, error_message);
1530
 
1531
  TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
1532
  if (TOCstart == 0)
1533
    TOCstart = ppc64_elf_toc (input_section->output_section->owner);
1534
 
1535
  /* Subtract the TOC base address.  */
1536
  reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
1537
  return bfd_reloc_continue;
1538
}
1539
 
1540
static bfd_reloc_status_type
1541
ppc64_elf_toc_ha_reloc (abfd, reloc_entry, symbol, data,
1542
                        input_section, output_bfd, error_message)
1543
     bfd *abfd;
1544
     arelent *reloc_entry;
1545
     asymbol *symbol;
1546
     PTR data;
1547
     asection *input_section;
1548
     bfd *output_bfd;
1549
     char **error_message;
1550
{
1551
  bfd_vma TOCstart;
1552
 
1553
  /* If this is a relocatable link (output_bfd test tells us), just
1554
     call the generic function.  Any adjustment will be done at final
1555
     link time.  */
1556
  if (output_bfd != NULL)
1557
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1558
                                  input_section, output_bfd, error_message);
1559
 
1560
  TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
1561
  if (TOCstart == 0)
1562
    TOCstart = ppc64_elf_toc (input_section->output_section->owner);
1563
 
1564
  /* Subtract the TOC base address.  */
1565
  reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
1566
 
1567
  /* Adjust the addend for sign extension of the low 16 bits.  */
1568
  reloc_entry->addend += 0x8000;
1569
  return bfd_reloc_continue;
1570
}
1571
 
1572
static bfd_reloc_status_type
1573
ppc64_elf_toc64_reloc (abfd, reloc_entry, symbol, data,
1574
                       input_section, output_bfd, error_message)
1575
     bfd *abfd;
1576
     arelent *reloc_entry;
1577
     asymbol *symbol;
1578
     PTR data;
1579
     asection *input_section;
1580
     bfd *output_bfd;
1581
     char **error_message;
1582
{
1583
  bfd_vma TOCstart;
1584
  bfd_size_type octets;
1585
 
1586
  /* If this is a relocatable link (output_bfd test tells us), just
1587
     call the generic function.  Any adjustment will be done at final
1588
     link time.  */
1589
  if (output_bfd != NULL)
1590
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1591
                                  input_section, output_bfd, error_message);
1592
 
1593
  TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
1594
  if (TOCstart == 0)
1595
    TOCstart = ppc64_elf_toc (input_section->output_section->owner);
1596
 
1597
  octets = reloc_entry->address * bfd_octets_per_byte (abfd);
1598
  bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
1599
  return bfd_reloc_ok;
1600
}
1601
 
1602
static bfd_reloc_status_type
1603
ppc64_elf_unhandled_reloc (abfd, reloc_entry, symbol, data,
1604
                           input_section, output_bfd, error_message)
1605
     bfd *abfd;
1606
     arelent *reloc_entry;
1607
     asymbol *symbol;
1608
     PTR data;
1609
     asection *input_section;
1610
     bfd *output_bfd;
1611
     char **error_message;
1612
{
1613
  /* If this is a relocatable link (output_bfd test tells us), just
1614
     call the generic function.  Any adjustment will be done at final
1615
     link time.  */
1616
  if (output_bfd != NULL)
1617
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1618
                                  input_section, output_bfd, error_message);
1619
 
1620
  if (error_message != NULL)
1621
    {
1622
      static char buf[60];
1623
      sprintf (buf, "generic linker can't handle %s",
1624
               reloc_entry->howto->name);
1625
      *error_message = buf;
1626
    }
1627
  return bfd_reloc_dangerous;
1628
}
1629
 
1630
/* Fix bad default arch selected for a 64 bit input bfd when the
1631
   default is 32 bit.  */
1632
 
1633
static boolean
1634
ppc64_elf_object_p (abfd)
1635
     bfd *abfd;
1636
{
1637
  if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 32)
1638
    {
1639
      Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
1640
 
1641
      if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
1642
        {
1643
          /* Relies on arch after 32 bit default being 64 bit default.  */
1644
          abfd->arch_info = abfd->arch_info->next;
1645
          BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
1646
        }
1647
    }
1648
  return true;
1649
}
1650
 
1651
/* Merge backend specific data from an object file to the output
1652
   object file when linking.  */
1653
 
1654
static boolean
1655
ppc64_elf_merge_private_bfd_data (ibfd, obfd)
1656
     bfd *ibfd;
1657
     bfd *obfd;
1658
{
1659
  /* Check if we have the same endianess.  */
1660
  if (ibfd->xvec->byteorder != obfd->xvec->byteorder
1661
      && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
1662
    {
1663
      const char *msg;
1664
 
1665
      if (bfd_big_endian (ibfd))
1666
        msg = _("%s: compiled for a big endian system and target is little endian");
1667
      else
1668
        msg = _("%s: compiled for a little endian system and target is big endian");
1669
 
1670
      (*_bfd_error_handler) (msg, bfd_archive_filename (ibfd));
1671
 
1672
      bfd_set_error (bfd_error_wrong_format);
1673
      return false;
1674
    }
1675
 
1676
  return true;
1677
}
1678
 
1679
/* The following functions are specific to the ELF linker, while
1680
   functions above are used generally.  Those named ppc64_elf_* are
1681
   called by the main ELF linker code.  They appear in this file more
1682
   or less in the order in which they are called.  eg.
1683
   ppc64_elf_check_relocs is called early in the link process,
1684
   ppc64_elf_finish_dynamic_sections is one of the last functions
1685
   called.
1686
 
1687
   PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
1688
   functions have both a function code symbol and a function descriptor
1689
   symbol.  A call to foo in a relocatable object file looks like:
1690
 
1691
   .            .text
1692
   .    x:
1693
   .            bl      .foo
1694
   .            nop
1695
 
1696
   The function definition in another object file might be:
1697
 
1698
   .            .section .opd
1699
   .    foo:    .quad   .foo
1700
   .            .quad   .TOC.@tocbase
1701
   .            .quad   0
1702
   .
1703
   .            .text
1704
   .    .foo:   blr
1705
 
1706
   When the linker resolves the call during a static link, the branch
1707
   unsurprisingly just goes to .foo and the .opd information is unused.
1708
   If the function definition is in a shared library, things are a little
1709
   different:  The call goes via a plt call stub, the opd information gets
1710
   copied to the plt, and the linker patches the nop.
1711
 
1712
   .    x:
1713
   .            bl      .foo_stub
1714
   .            ld      2,40(1)
1715
   .
1716
   .
1717
   .    .foo_stub:
1718
   .            addis   12,2,Lfoo@toc@ha        # in practice, the call stub
1719
   .            addi    12,12,Lfoo@toc@l        # is slightly optimised, but
1720
   .            std     2,40(1)                 # this is the general idea
1721
   .            ld      11,0(12)
1722
   .            ld      2,8(12)
1723
   .            mtctr   11
1724
   .            ld      11,16(12)
1725
   .            bctr
1726
   .
1727
   .            .section .plt
1728
   .    Lfoo:   reloc (R_PPC64_JMP_SLOT, foo)
1729
 
1730
   The "reloc ()" notation is supposed to indicate that the linker emits
1731
   an R_PPC64_JMP_SLOT reloc against foo.  The dynamic linker does the opd
1732
   copying.
1733
 
1734
   What are the difficulties here?  Well, firstly, the relocations
1735
   examined by the linker in check_relocs are against the function code
1736
   sym .foo, while the dynamic relocation in the plt is emitted against
1737
   the function descriptor symbol, foo.  Somewhere along the line, we need
1738
   to carefully copy dynamic link information from one symbol to the other.
1739
   Secondly, the generic part of the elf linker will make .foo a dynamic
1740
   symbol as is normal for most other backends.  We need foo dynamic
1741
   instead, at least for an application final link.  However, when
1742
   creating a shared library containing foo, we need to have both symbols
1743
   dynamic so that references to .foo are satisfied during the early
1744
   stages of linking.  Otherwise the linker might decide to pull in a
1745
   definition from some other object, eg. a static library.  */
1746
 
1747
/* The linker needs to keep track of the number of relocs that it
1748
   decides to copy as dynamic relocs in check_relocs for each symbol.
1749
   This is so that it can later discard them if they are found to be
1750
   unnecessary.  We store the information in a field extending the
1751
   regular ELF linker hash table.  */
1752
 
1753
struct ppc_dyn_relocs
1754
{
1755
  struct ppc_dyn_relocs *next;
1756
 
1757
  /* The input section of the reloc.  */
1758
  asection *sec;
1759
 
1760
  /* Total number of relocs copied for the input section.  */
1761
  bfd_size_type count;
1762
 
1763
  /* Number of pc-relative relocs copied for the input section.  */
1764
  bfd_size_type pc_count;
1765
};
1766
 
1767
/* Of those relocs that might be copied as dynamic relocs, this macro
1768
   selects between relative and absolute types.  */
1769
 
1770
#define IS_ABSOLUTE_RELOC(RTYPE)                \
1771
  ((RTYPE) != R_PPC64_REL32                     \
1772
   && (RTYPE) != R_PPC64_REL64                  \
1773
   && (RTYPE) != R_PPC64_ADDR30)
1774
 
1775
/* Section name for stubs is the associated section name plus this
1776
   string.  */
1777
#define STUB_SUFFIX ".stub"
1778
 
1779
/* Linker stubs.
1780
   ppc_stub_long_branch:
1781
   Used when a 14 bit branch (or even a 24 bit branch) can't reach its
1782
   destination, but a 24 bit branch in a stub section will reach.
1783
   .    b       dest
1784
 
1785
   ppc_stub_plt_branch:
1786
   Similar to the above, but a 24 bit branch in the stub section won't
1787
   reach its destination.
1788
   .    addis   %r12,%r2,xxx@ha
1789
   .    ld      %r11,xxx@l(%r12)
1790
   .    mtctr   %r11
1791
   .    bctr
1792
 
1793
   ppc_stub_plt_call:
1794
   Used to call a function in a shared library.
1795
   .    addis   %r12,%r2,xxx@ha
1796
   .    std     %r2,40(%r1)
1797
   .    ld      %r11,xxx+0@l(%r12)
1798
   .    ld      %r2,xxx+8@l(%r12)
1799
   .    mtctr   %r11
1800
   .    ld      %r11,xxx+16@l(%r12)
1801
   .    bctr
1802
*/
1803
 
1804
enum ppc_stub_type {
1805
  ppc_stub_none,
1806
  ppc_stub_long_branch,
1807
  ppc_stub_plt_branch,
1808
  ppc_stub_plt_call
1809
};
1810
 
1811
struct ppc_stub_hash_entry {
1812
 
1813
  /* Base hash table entry structure.  */
1814
  struct bfd_hash_entry root;
1815
 
1816
  /* The stub section.  */
1817
  asection *stub_sec;
1818
 
1819
  /* Offset within stub_sec of the beginning of this stub.  */
1820
  bfd_vma stub_offset;
1821
 
1822
  /* Given the symbol's value and its section we can determine its final
1823
     value when building the stubs (so the stub knows where to jump.  */
1824
  bfd_vma target_value;
1825
  asection *target_section;
1826
 
1827
  enum ppc_stub_type stub_type;
1828
 
1829
  /* The symbol table entry, if any, that this was derived from.  */
1830
  struct ppc_link_hash_entry *h;
1831
 
1832
  /* Where this stub is being called from, or, in the case of combined
1833
     stub sections, the first input section in the group.  */
1834
  asection *id_sec;
1835
};
1836
 
1837
struct ppc_branch_hash_entry {
1838
 
1839
  /* Base hash table entry structure.  */
1840
  struct bfd_hash_entry root;
1841
 
1842
  /* Offset within .branch_lt.  */
1843
  unsigned int offset;
1844
 
1845
  /* Generation marker.  */
1846
  unsigned int iter;
1847
};
1848
 
1849
struct ppc_link_hash_entry
1850
{
1851
  struct elf_link_hash_entry elf;
1852
 
1853
  /* A pointer to the most recently used stub hash entry against this
1854
     symbol.  */
1855
  struct ppc_stub_hash_entry *stub_cache;
1856
 
1857
  /* Track dynamic relocs copied for this symbol.  */
1858
  struct ppc_dyn_relocs *dyn_relocs;
1859
 
1860
  /* Link between function code and descriptor symbols.  */
1861
  struct elf_link_hash_entry *oh;
1862
 
1863
  /* Flag function code and descriptor symbols.  */
1864
  unsigned int is_func:1;
1865
  unsigned int is_func_descriptor:1;
1866
  unsigned int is_entry:1;
1867
};
1868
 
1869
/* ppc64 ELF linker hash table.  */
1870
 
1871
struct ppc_link_hash_table
1872
{
1873
  struct elf_link_hash_table elf;
1874
 
1875
  /* The stub hash table.  */
1876
  struct bfd_hash_table stub_hash_table;
1877
 
1878
  /* Another hash table for plt_branch stubs.  */
1879
  struct bfd_hash_table branch_hash_table;
1880
 
1881
  /* Linker stub bfd.  */
1882
  bfd *stub_bfd;
1883
 
1884
  /* Linker call-backs.  */
1885
  asection * (*add_stub_section) PARAMS ((const char *, asection *));
1886
  void (*layout_sections_again) PARAMS ((void));
1887
 
1888
  /* Array to keep track of which stub sections have been created, and
1889
     information on stub grouping.  */
1890
  struct map_stub {
1891
    /* This is the section to which stubs in the group will be attached.  */
1892
    asection *link_sec;
1893
    /* The stub section.  */
1894
    asection *stub_sec;
1895
  } *stub_group;
1896
 
1897
  /* Assorted information used by ppc64_elf_size_stubs.  */
1898
  int top_index;
1899
  asection **input_list;
1900
 
1901
  /* Short-cuts to get to dynamic linker sections.  */
1902
  asection *sgot;
1903
  asection *srelgot;
1904
  asection *splt;
1905
  asection *srelplt;
1906
  asection *sdynbss;
1907
  asection *srelbss;
1908
  asection *sglink;
1909
  asection *sfpr;
1910
  asection *sbrlt;
1911
  asection *srelbrlt;
1912
 
1913
  /* Set on error.  */
1914
  unsigned int stub_error;
1915
 
1916
  /* Flag set when small branches are detected.  Used to
1917
     select suitable defaults for the stub group size.  */
1918
  unsigned int has_14bit_branch;
1919
 
1920
  /* Set if we detect a reference undefined weak symbol.  */
1921
  unsigned int have_undefweak;
1922
 
1923
  /* Incremented every time we size stubs.  */
1924
  unsigned int stub_iteration;
1925
 
1926
  /* Small local sym to section mapping cache.  */
1927
  struct sym_sec_cache sym_sec;
1928
};
1929
 
1930
static struct bfd_hash_entry *stub_hash_newfunc
1931
  PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
1932
static struct bfd_hash_entry *branch_hash_newfunc
1933
  PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
1934
static struct bfd_hash_entry *link_hash_newfunc
1935
  PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
1936
static struct bfd_link_hash_table *ppc64_elf_link_hash_table_create
1937
  PARAMS ((bfd *));
1938
static void ppc64_elf_link_hash_table_free
1939
  PARAMS ((struct bfd_link_hash_table *));
1940
static char *ppc_stub_name
1941
  PARAMS ((const asection *, const asection *,
1942
           const struct ppc_link_hash_entry *, const Elf_Internal_Rela *));
1943
static struct ppc_stub_hash_entry *ppc_get_stub_entry
1944
  PARAMS ((const asection *, const asection *, struct elf_link_hash_entry *,
1945
           const Elf_Internal_Rela *, struct ppc_link_hash_table *));
1946
static struct ppc_stub_hash_entry *ppc_add_stub
1947
  PARAMS ((const char *, asection *, struct ppc_link_hash_table *));
1948
static boolean create_linkage_sections
1949
  PARAMS ((bfd *, struct bfd_link_info *));
1950
static boolean create_got_section
1951
  PARAMS ((bfd *, struct bfd_link_info *));
1952
static boolean ppc64_elf_create_dynamic_sections
1953
  PARAMS ((bfd *, struct bfd_link_info *));
1954
static void ppc64_elf_copy_indirect_symbol
1955
  PARAMS ((struct elf_backend_data *, struct elf_link_hash_entry *,
1956
           struct elf_link_hash_entry *));
1957
static boolean ppc64_elf_check_relocs
1958
  PARAMS ((bfd *, struct bfd_link_info *, asection *,
1959
           const Elf_Internal_Rela *));
1960
static asection * ppc64_elf_gc_mark_hook
1961
  PARAMS ((asection *, struct bfd_link_info *, Elf_Internal_Rela *,
1962
           struct elf_link_hash_entry *, Elf_Internal_Sym *));
1963
static boolean ppc64_elf_gc_sweep_hook
1964
  PARAMS ((bfd *, struct bfd_link_info *, asection *,
1965
           const Elf_Internal_Rela *));
1966
static boolean func_desc_adjust
1967
  PARAMS ((struct elf_link_hash_entry *, PTR));
1968
static boolean ppc64_elf_func_desc_adjust
1969
  PARAMS ((bfd *, struct bfd_link_info *));
1970
static boolean ppc64_elf_adjust_dynamic_symbol
1971
  PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
1972
static void ppc64_elf_hide_symbol
1973
  PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *, boolean));
1974
static boolean edit_opd
1975
  PARAMS ((bfd *, struct bfd_link_info *));
1976
static boolean allocate_dynrelocs
1977
  PARAMS ((struct elf_link_hash_entry *, PTR));
1978
static boolean readonly_dynrelocs
1979
  PARAMS ((struct elf_link_hash_entry *, PTR));
1980
static enum elf_reloc_type_class ppc64_elf_reloc_type_class
1981
  PARAMS ((const Elf_Internal_Rela *));
1982
static boolean ppc64_elf_size_dynamic_sections
1983
  PARAMS ((bfd *, struct bfd_link_info *));
1984
static INLINE enum ppc_stub_type ppc_type_of_stub
1985
  PARAMS ((asection *, const Elf_Internal_Rela *,
1986
           struct ppc_link_hash_entry **, bfd_vma));
1987
static bfd_byte *build_plt_stub
1988
  PARAMS ((bfd *, bfd_byte *, int, int));
1989
static boolean ppc_build_one_stub
1990
  PARAMS ((struct bfd_hash_entry *, PTR));
1991
static boolean ppc_size_one_stub
1992
  PARAMS ((struct bfd_hash_entry *, PTR));
1993
static void group_sections
1994
  PARAMS ((struct ppc_link_hash_table *, bfd_size_type, boolean));
1995
static boolean ppc64_elf_relocate_section
1996
  PARAMS ((bfd *, struct bfd_link_info *info, bfd *, asection *, bfd_byte *,
1997
           Elf_Internal_Rela *relocs, Elf_Internal_Sym *local_syms,
1998
           asection **));
1999
static boolean ppc64_elf_finish_dynamic_symbol
2000
  PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
2001
           Elf_Internal_Sym *));
2002
static boolean ppc64_elf_finish_dynamic_sections
2003
  PARAMS ((bfd *, struct bfd_link_info *));
2004
 
2005
/* Get the ppc64 ELF linker hash table from a link_info structure.  */
2006
 
2007
#define ppc_hash_table(p) \
2008
  ((struct ppc_link_hash_table *) ((p)->hash))
2009
 
2010
#define ppc_stub_hash_lookup(table, string, create, copy) \
2011
  ((struct ppc_stub_hash_entry *) \
2012
   bfd_hash_lookup ((table), (string), (create), (copy)))
2013
 
2014
#define ppc_branch_hash_lookup(table, string, create, copy) \
2015
  ((struct ppc_branch_hash_entry *) \
2016
   bfd_hash_lookup ((table), (string), (create), (copy)))
2017
 
2018
/* Create an entry in the stub hash table.  */
2019
 
2020
static struct bfd_hash_entry *
2021
stub_hash_newfunc (entry, table, string)
2022
     struct bfd_hash_entry *entry;
2023
     struct bfd_hash_table *table;
2024
     const char *string;
2025
{
2026
  /* Allocate the structure if it has not already been allocated by a
2027
     subclass.  */
2028
  if (entry == NULL)
2029
    {
2030
      entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
2031
      if (entry == NULL)
2032
        return entry;
2033
    }
2034
 
2035
  /* Call the allocation method of the superclass.  */
2036
  entry = bfd_hash_newfunc (entry, table, string);
2037
  if (entry != NULL)
2038
    {
2039
      struct ppc_stub_hash_entry *eh;
2040
 
2041
      /* Initialize the local fields.  */
2042
      eh = (struct ppc_stub_hash_entry *) entry;
2043
      eh->stub_sec = NULL;
2044
      eh->stub_offset = 0;
2045
      eh->target_value = 0;
2046
      eh->target_section = NULL;
2047
      eh->stub_type = ppc_stub_none;
2048
      eh->h = NULL;
2049
      eh->id_sec = NULL;
2050
    }
2051
 
2052
  return entry;
2053
}
2054
 
2055
/* Create an entry in the branch hash table.  */
2056
 
2057
static struct bfd_hash_entry *
2058
branch_hash_newfunc (entry, table, string)
2059
     struct bfd_hash_entry *entry;
2060
     struct bfd_hash_table *table;
2061
     const char *string;
2062
{
2063
  /* Allocate the structure if it has not already been allocated by a
2064
     subclass.  */
2065
  if (entry == NULL)
2066
    {
2067
      entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
2068
      if (entry == NULL)
2069
        return entry;
2070
    }
2071
 
2072
  /* Call the allocation method of the superclass.  */
2073
  entry = bfd_hash_newfunc (entry, table, string);
2074
  if (entry != NULL)
2075
    {
2076
      struct ppc_branch_hash_entry *eh;
2077
 
2078
      /* Initialize the local fields.  */
2079
      eh = (struct ppc_branch_hash_entry *) entry;
2080
      eh->offset = 0;
2081
      eh->iter = 0;
2082
    }
2083
 
2084
  return entry;
2085
}
2086
 
2087
/* Create an entry in a ppc64 ELF linker hash table.  */
2088
 
2089
static struct bfd_hash_entry *
2090
link_hash_newfunc (entry, table, string)
2091
     struct bfd_hash_entry *entry;
2092
     struct bfd_hash_table *table;
2093
     const char *string;
2094
{
2095
  /* Allocate the structure if it has not already been allocated by a
2096
     subclass.  */
2097
  if (entry == NULL)
2098
    {
2099
      entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
2100
      if (entry == NULL)
2101
        return entry;
2102
    }
2103
 
2104
  /* Call the allocation method of the superclass.  */
2105
  entry = _bfd_elf_link_hash_newfunc (entry, table, string);
2106
  if (entry != NULL)
2107
    {
2108
      struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
2109
 
2110
      eh->stub_cache = NULL;
2111
      eh->dyn_relocs = NULL;
2112
      eh->oh = NULL;
2113
      eh->is_func = 0;
2114
      eh->is_func_descriptor = 0;
2115
      eh->is_entry = 0;
2116
    }
2117
 
2118
  return entry;
2119
}
2120
 
2121
/* Create a ppc64 ELF linker hash table.  */
2122
 
2123
static struct bfd_link_hash_table *
2124
ppc64_elf_link_hash_table_create (abfd)
2125
     bfd *abfd;
2126
{
2127
  struct ppc_link_hash_table *htab;
2128
  bfd_size_type amt = sizeof (struct ppc_link_hash_table);
2129
 
2130
  htab = (struct ppc_link_hash_table *) bfd_malloc (amt);
2131
  if (htab == NULL)
2132
    return NULL;
2133
 
2134
  if (! _bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc))
2135
    {
2136
      free (htab);
2137
      return NULL;
2138
    }
2139
 
2140
  /* Init the stub hash table too.  */
2141
  if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc))
2142
    return NULL;
2143
 
2144
  /* And the branch hash table.  */
2145
  if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc))
2146
    return NULL;
2147
 
2148
  htab->stub_bfd = NULL;
2149
  htab->add_stub_section = NULL;
2150
  htab->layout_sections_again = NULL;
2151
  htab->stub_group = NULL;
2152
  htab->sgot = NULL;
2153
  htab->srelgot = NULL;
2154
  htab->splt = NULL;
2155
  htab->srelplt = NULL;
2156
  htab->sdynbss = NULL;
2157
  htab->srelbss = NULL;
2158
  htab->sglink = NULL;
2159
  htab->sfpr = NULL;
2160
  htab->sbrlt = NULL;
2161
  htab->srelbrlt = NULL;
2162
  htab->stub_error = 0;
2163
  htab->has_14bit_branch = 0;
2164
  htab->have_undefweak = 0;
2165
  htab->stub_iteration = 0;
2166
  htab->sym_sec.abfd = NULL;
2167
 
2168
  return &htab->elf.root;
2169
}
2170
 
2171
/* Free the derived linker hash table.  */
2172
 
2173
static void
2174
ppc64_elf_link_hash_table_free (hash)
2175
     struct bfd_link_hash_table *hash;
2176
{
2177
  struct ppc_link_hash_table *ret = (struct ppc_link_hash_table *) hash;
2178
 
2179
  bfd_hash_table_free (&ret->stub_hash_table);
2180
  bfd_hash_table_free (&ret->branch_hash_table);
2181
  _bfd_generic_link_hash_table_free (hash);
2182
}
2183
 
2184
/* Build a name for an entry in the stub hash table.  */
2185
 
2186
static char *
2187
ppc_stub_name (input_section, sym_sec, h, rel)
2188
     const asection *input_section;
2189
     const asection *sym_sec;
2190
     const struct ppc_link_hash_entry *h;
2191
     const Elf_Internal_Rela *rel;
2192
{
2193
  char *stub_name;
2194
  bfd_size_type len;
2195
 
2196
  /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
2197
     offsets from a sym as a branch target?  In fact, we could
2198
     probably assume the addend is always zero.  */
2199
  BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
2200
 
2201
  if (h)
2202
    {
2203
      len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
2204
      stub_name = bfd_malloc (len);
2205
      if (stub_name != NULL)
2206
        {
2207
          sprintf (stub_name, "%08x_%s+%x",
2208
                   input_section->id & 0xffffffff,
2209
                   h->elf.root.root.string,
2210
                   (int) rel->r_addend & 0xffffffff);
2211
        }
2212
    }
2213
  else
2214
    {
2215
      len = 8 + 1 + 8 + 1 + 8 + 1 + 16 + 1;
2216
      stub_name = bfd_malloc (len);
2217
      if (stub_name != NULL)
2218
        {
2219
          sprintf (stub_name, "%08x_%x:%x+%x",
2220
                   input_section->id & 0xffffffff,
2221
                   sym_sec->id & 0xffffffff,
2222
                   (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
2223
                   (int) rel->r_addend & 0xffffffff);
2224
        }
2225
    }
2226
  return stub_name;
2227
}
2228
 
2229
/* Look up an entry in the stub hash.  Stub entries are cached because
2230
   creating the stub name takes a bit of time.  */
2231
 
2232
static struct ppc_stub_hash_entry *
2233
ppc_get_stub_entry (input_section, sym_sec, hash, rel, htab)
2234
     const asection *input_section;
2235
     const asection *sym_sec;
2236
     struct elf_link_hash_entry *hash;
2237
     const Elf_Internal_Rela *rel;
2238
     struct ppc_link_hash_table *htab;
2239
{
2240
  struct ppc_stub_hash_entry *stub_entry;
2241
  struct ppc_link_hash_entry *h = (struct ppc_link_hash_entry *) hash;
2242
  const asection *id_sec;
2243
 
2244
  /* If this input section is part of a group of sections sharing one
2245
     stub section, then use the id of the first section in the group.
2246
     Stub names need to include a section id, as there may well be
2247
     more than one stub used to reach say, printf, and we need to
2248
     distinguish between them.  */
2249
  id_sec = htab->stub_group[input_section->id].link_sec;
2250
 
2251
  if (h != NULL && h->stub_cache != NULL
2252
      && h->stub_cache->h == h
2253
      && h->stub_cache->id_sec == id_sec)
2254
    {
2255
      stub_entry = h->stub_cache;
2256
    }
2257
  else
2258
    {
2259
      char *stub_name;
2260
 
2261
      stub_name = ppc_stub_name (id_sec, sym_sec, h, rel);
2262
      if (stub_name == NULL)
2263
        return NULL;
2264
 
2265
      stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
2266
                                         stub_name, false, false);
2267
      if (h != NULL)
2268
        h->stub_cache = stub_entry;
2269
 
2270
      free (stub_name);
2271
    }
2272
 
2273
  return stub_entry;
2274
}
2275
 
2276
/* Add a new stub entry to the stub hash.  Not all fields of the new
2277
   stub entry are initialised.  */
2278
 
2279
static struct ppc_stub_hash_entry *
2280
ppc_add_stub (stub_name, section, htab)
2281
     const char *stub_name;
2282
     asection *section;
2283
     struct ppc_link_hash_table *htab;
2284
{
2285
  asection *link_sec;
2286
  asection *stub_sec;
2287
  struct ppc_stub_hash_entry *stub_entry;
2288
 
2289
  link_sec = htab->stub_group[section->id].link_sec;
2290
  stub_sec = htab->stub_group[section->id].stub_sec;
2291
  if (stub_sec == NULL)
2292
    {
2293
      stub_sec = htab->stub_group[link_sec->id].stub_sec;
2294
      if (stub_sec == NULL)
2295
        {
2296
          size_t namelen;
2297
          bfd_size_type len;
2298
          char *s_name;
2299
 
2300
          namelen = strlen (link_sec->name);
2301
          len = namelen + sizeof (STUB_SUFFIX);
2302
          s_name = bfd_alloc (htab->stub_bfd, len);
2303
          if (s_name == NULL)
2304
            return NULL;
2305
 
2306
          memcpy (s_name, link_sec->name, namelen);
2307
          memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
2308
          stub_sec = (*htab->add_stub_section) (s_name, link_sec);
2309
          if (stub_sec == NULL)
2310
            return NULL;
2311
          htab->stub_group[link_sec->id].stub_sec = stub_sec;
2312
        }
2313
      htab->stub_group[section->id].stub_sec = stub_sec;
2314
    }
2315
 
2316
  /* Enter this entry into the linker stub hash table.  */
2317
  stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
2318
                                     true, false);
2319
  if (stub_entry == NULL)
2320
    {
2321
      (*_bfd_error_handler) (_("%s: cannot create stub entry %s"),
2322
                             bfd_archive_filename (section->owner),
2323
                             stub_name);
2324
      return NULL;
2325
    }
2326
 
2327
  stub_entry->stub_sec = stub_sec;
2328
  stub_entry->stub_offset = 0;
2329
  stub_entry->id_sec = link_sec;
2330
  return stub_entry;
2331
}
2332
 
2333
/* Create sections for linker generated code.  */
2334
 
2335
static boolean
2336
create_linkage_sections (dynobj, info)
2337
     bfd *dynobj;
2338
     struct bfd_link_info *info;
2339
{
2340
  struct ppc_link_hash_table *htab;
2341
  flagword flags;
2342
 
2343
  htab = ppc_hash_table (info);
2344
 
2345
  /* Create .sfpr for code to save and restore fp regs.  */
2346
  flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
2347
           | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2348
  htab->sfpr = bfd_make_section_anyway (dynobj, ".sfpr");
2349
  if (htab->sfpr == NULL
2350
      || ! bfd_set_section_flags (dynobj, htab->sfpr, flags)
2351
      || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
2352
    return false;
2353
 
2354
  /* Create .glink for lazy dynamic linking support.  */
2355
  htab->sglink = bfd_make_section_anyway (dynobj, ".glink");
2356
  if (htab->sglink == NULL
2357
      || ! bfd_set_section_flags (dynobj, htab->sglink, flags)
2358
      || ! bfd_set_section_alignment (dynobj, htab->sglink, 2))
2359
    return false;
2360
 
2361
  /* Create .branch_lt for plt_branch stubs.  */
2362
  flags = (SEC_ALLOC | SEC_LOAD
2363
           | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2364
  htab->sbrlt = bfd_make_section_anyway (dynobj, ".branch_lt");
2365
  if (htab->sbrlt == NULL
2366
      || ! bfd_set_section_flags (dynobj, htab->sbrlt, flags)
2367
      || ! bfd_set_section_alignment (dynobj, htab->sbrlt, 3))
2368
    return false;
2369
 
2370
  if (info->shared)
2371
    {
2372
      flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
2373
               | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2374
      htab->srelbrlt = bfd_make_section_anyway (dynobj, ".rela.branch_lt");
2375
      if (!htab->srelbrlt
2376
          || ! bfd_set_section_flags (dynobj, htab->srelbrlt, flags)
2377
          || ! bfd_set_section_alignment (dynobj, htab->srelbrlt, 3))
2378
        return false;
2379
    }
2380
  return true;
2381
}
2382
 
2383
/* Create .got and .rela.got sections in DYNOBJ, and set up
2384
   shortcuts to them in our hash table.  */
2385
 
2386
static boolean
2387
create_got_section (dynobj, info)
2388
     bfd *dynobj;
2389
     struct bfd_link_info *info;
2390
{
2391
  struct ppc_link_hash_table *htab;
2392
 
2393
  if (! _bfd_elf_create_got_section (dynobj, info))
2394
    return false;
2395
 
2396
  htab = ppc_hash_table (info);
2397
  htab->sgot = bfd_get_section_by_name (dynobj, ".got");
2398
  if (!htab->sgot)
2399
    abort ();
2400
 
2401
  htab->srelgot = bfd_make_section (dynobj, ".rela.got");
2402
  if (!htab->srelgot
2403
      || ! bfd_set_section_flags (dynobj, htab->srelgot,
2404
                                  (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
2405
                                   | SEC_IN_MEMORY | SEC_LINKER_CREATED
2406
                                   | SEC_READONLY))
2407
      || ! bfd_set_section_alignment (dynobj, htab->srelgot, 3))
2408
    return false;
2409
  return true;
2410
}
2411
 
2412
/* Create the dynamic sections, and set up shortcuts.  */
2413
 
2414
static boolean
2415
ppc64_elf_create_dynamic_sections (dynobj, info)
2416
     bfd *dynobj;
2417
     struct bfd_link_info *info;
2418
{
2419
  struct ppc_link_hash_table *htab;
2420
 
2421
  htab = ppc_hash_table (info);
2422
  if (!htab->sgot && !create_got_section (dynobj, info))
2423
    return false;
2424
 
2425
  if (!_bfd_elf_create_dynamic_sections (dynobj, info))
2426
    return false;
2427
 
2428
  htab->splt = bfd_get_section_by_name (dynobj, ".plt");
2429
  htab->srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
2430
  htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
2431
  if (!info->shared)
2432
    htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss");
2433
 
2434
  if (!htab->splt || !htab->srelplt || !htab->sdynbss
2435
      || (!info->shared && !htab->srelbss))
2436
    abort ();
2437
 
2438
  return true;
2439
}
2440
 
2441
/* Copy the extra info we tack onto an elf_link_hash_entry.  */
2442
 
2443
static void
2444
ppc64_elf_copy_indirect_symbol (bed, dir, ind)
2445
     struct elf_backend_data *bed;
2446
     struct elf_link_hash_entry *dir, *ind;
2447
{
2448
  struct ppc_link_hash_entry *edir, *eind;
2449
 
2450
  edir = (struct ppc_link_hash_entry *) dir;
2451
  eind = (struct ppc_link_hash_entry *) ind;
2452
 
2453
  if (eind->dyn_relocs != NULL)
2454
    {
2455
      if (edir->dyn_relocs != NULL)
2456
        {
2457
          struct ppc_dyn_relocs **pp;
2458
          struct ppc_dyn_relocs *p;
2459
 
2460
          if (ind->root.type == bfd_link_hash_indirect)
2461
            abort ();
2462
 
2463
          /* Add reloc counts against the weak sym to the strong sym
2464
             list.  Merge any entries against the same section.  */
2465
          for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
2466
            {
2467
              struct ppc_dyn_relocs *q;
2468
 
2469
              for (q = edir->dyn_relocs; q != NULL; q = q->next)
2470
                if (q->sec == p->sec)
2471
                  {
2472
                    q->pc_count += p->pc_count;
2473
                    q->count += p->count;
2474
                    *pp = p->next;
2475
                    break;
2476
                  }
2477
              if (q == NULL)
2478
                pp = &p->next;
2479
            }
2480
          *pp = edir->dyn_relocs;
2481
        }
2482
 
2483
      edir->dyn_relocs = eind->dyn_relocs;
2484
      eind->dyn_relocs = NULL;
2485
    }
2486
 
2487
  edir->is_func |= eind->is_func;
2488
  edir->is_func_descriptor |= eind->is_func_descriptor;
2489
  edir->is_entry |= eind->is_entry;
2490
 
2491
  _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
2492
}
2493
 
2494
/* Set a flag, used by ppc64_elf_gc_mark_hook, on the entry symbol and
2495
   symbols undefined on the command-line.  */
2496
 
2497
boolean
2498
ppc64_elf_mark_entry_syms (info)
2499
     struct bfd_link_info *info;
2500
{
2501
  struct ppc_link_hash_table *htab;
2502
  struct bfd_sym_chain *sym;
2503
 
2504
  htab = ppc_hash_table (info);
2505
  for (sym = info->gc_sym_list; sym; sym = sym->next)
2506
    {
2507
      struct elf_link_hash_entry *h;
2508
 
2509
      h = elf_link_hash_lookup (&htab->elf, sym->name, false, false, false);
2510
      if (h != NULL)
2511
        ((struct ppc_link_hash_entry *) h)->is_entry = 1;
2512
    }
2513
  return true;
2514
}
2515
 
2516
/* Look through the relocs for a section during the first phase, and
2517
   calculate needed space in the global offset table, procedure
2518
   linkage table, and dynamic reloc sections.  */
2519
 
2520
static boolean
2521
ppc64_elf_check_relocs (abfd, info, sec, relocs)
2522
     bfd *abfd;
2523
     struct bfd_link_info *info;
2524
     asection *sec;
2525
     const Elf_Internal_Rela *relocs;
2526
{
2527
  struct ppc_link_hash_table *htab;
2528
  Elf_Internal_Shdr *symtab_hdr;
2529
  struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
2530
  const Elf_Internal_Rela *rel;
2531
  const Elf_Internal_Rela *rel_end;
2532
  asection *sreloc;
2533
  asection **opd_sym_map;
2534
 
2535
  if (info->relocateable)
2536
    return true;
2537
 
2538
  htab = ppc_hash_table (info);
2539
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2540
 
2541
  sym_hashes = elf_sym_hashes (abfd);
2542
  sym_hashes_end = (sym_hashes
2543
                    + symtab_hdr->sh_size / sizeof (Elf64_External_Sym)
2544
                    - symtab_hdr->sh_info);
2545
 
2546
  sreloc = NULL;
2547
  opd_sym_map = NULL;
2548
  if (strcmp (bfd_get_section_name (abfd, sec), ".opd") == 0)
2549
    {
2550
      /* Garbage collection needs some extra help with .opd sections.
2551
         We don't want to necessarily keep everything referenced by
2552
         relocs in .opd, as that would keep all functions.  Instead,
2553
         if we reference an .opd symbol (a function descriptor), we
2554
         want to keep the function code symbol's section.  This is
2555
         easy for global symbols, but for local syms we need to keep
2556
         information about the associated function section.  Later, if
2557
         edit_opd deletes entries, we'll use this array to adjust
2558
         local syms in .opd.  */
2559
      union opd_info {
2560
        asection *func_section;
2561
        long entry_adjust;
2562
      };
2563
      bfd_size_type amt;
2564
 
2565
      amt = sec->_raw_size * sizeof (union opd_info) / 24;
2566
      opd_sym_map = (asection **) bfd_zalloc (abfd, amt);
2567
      if (opd_sym_map == NULL)
2568
        return false;
2569
      elf_section_data (sec)->tdata = opd_sym_map;
2570
    }
2571
 
2572
  if (htab->elf.dynobj == NULL)
2573
    htab->elf.dynobj = abfd;
2574
  if (htab->sfpr == NULL
2575
      && !create_linkage_sections (htab->elf.dynobj, info))
2576
    return false;
2577
 
2578
  rel_end = relocs + sec->reloc_count;
2579
  for (rel = relocs; rel < rel_end; rel++)
2580
    {
2581
      unsigned long r_symndx;
2582
      struct elf_link_hash_entry *h;
2583
      enum elf_ppc_reloc_type r_type;
2584
 
2585
      r_symndx = ELF64_R_SYM (rel->r_info);
2586
      if (r_symndx < symtab_hdr->sh_info)
2587
        h = NULL;
2588
      else
2589
        h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2590
 
2591
      r_type = (enum elf_ppc_reloc_type) ELF64_R_TYPE (rel->r_info);
2592
      switch (r_type)
2593
        {
2594
          /* GOT16 relocations */
2595
        case R_PPC64_GOT16:
2596
        case R_PPC64_GOT16_DS:
2597
        case R_PPC64_GOT16_HA:
2598
        case R_PPC64_GOT16_HI:
2599
        case R_PPC64_GOT16_LO:
2600
        case R_PPC64_GOT16_LO_DS:
2601
 
2602
          /* This symbol requires a global offset table entry.  */
2603
          if (htab->sgot == NULL
2604
              && !create_got_section (htab->elf.dynobj, info))
2605
            return false;
2606
 
2607
          if (h != NULL)
2608
            {
2609
              h->got.refcount += 1;
2610
            }
2611
          else
2612
            {
2613
              bfd_signed_vma *local_got_refcounts;
2614
 
2615
              /* This is a global offset table entry for a local symbol.  */
2616
              local_got_refcounts = elf_local_got_refcounts (abfd);
2617
              if (local_got_refcounts == NULL)
2618
                {
2619
                  bfd_size_type size;
2620
 
2621
                  size = symtab_hdr->sh_info;
2622
                  size *= sizeof (bfd_signed_vma);
2623
                  local_got_refcounts = ((bfd_signed_vma *)
2624
                                         bfd_zalloc (abfd, size));
2625
                  if (local_got_refcounts == NULL)
2626
                    return false;
2627
                  elf_local_got_refcounts (abfd) = local_got_refcounts;
2628
                }
2629
              local_got_refcounts[r_symndx] += 1;
2630
            }
2631
          break;
2632
 
2633
        case R_PPC64_PLT16_HA:
2634
        case R_PPC64_PLT16_HI:
2635
        case R_PPC64_PLT16_LO:
2636
        case R_PPC64_PLT32:
2637
        case R_PPC64_PLT64:
2638
          /* This symbol requires a procedure linkage table entry.  We
2639
             actually build the entry in adjust_dynamic_symbol,
2640
             because this might be a case of linking PIC code without
2641
             linking in any dynamic objects, in which case we don't
2642
             need to generate a procedure linkage table after all.  */
2643
          if (h == NULL)
2644
            {
2645
              /* It does not make sense to have a procedure linkage
2646
                 table entry for a local symbol.  */
2647
              bfd_set_error (bfd_error_bad_value);
2648
              return false;
2649
            }
2650
 
2651
          h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
2652
          h->plt.refcount += 1;
2653
          ((struct ppc_link_hash_entry *) h)->is_func = 1;
2654
          break;
2655
 
2656
          /* The following relocations don't need to propagate the
2657
             relocation if linking a shared object since they are
2658
             section relative.  */
2659
        case R_PPC64_SECTOFF:
2660
        case R_PPC64_SECTOFF_LO:
2661
        case R_PPC64_SECTOFF_HI:
2662
        case R_PPC64_SECTOFF_HA:
2663
        case R_PPC64_SECTOFF_DS:
2664
        case R_PPC64_SECTOFF_LO_DS:
2665
        case R_PPC64_TOC16:
2666
        case R_PPC64_TOC16_LO:
2667
        case R_PPC64_TOC16_HI:
2668
        case R_PPC64_TOC16_HA:
2669
        case R_PPC64_TOC16_DS:
2670
        case R_PPC64_TOC16_LO_DS:
2671
          break;
2672
 
2673
          /* This relocation describes the C++ object vtable hierarchy.
2674
             Reconstruct it for later use during GC.  */
2675
        case R_PPC64_GNU_VTINHERIT:
2676
          if (!_bfd_elf64_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2677
            return false;
2678
          break;
2679
 
2680
          /* This relocation describes which C++ vtable entries are actually
2681
             used.  Record for later use during GC.  */
2682
        case R_PPC64_GNU_VTENTRY:
2683
          if (!_bfd_elf64_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2684
            return false;
2685
          break;
2686
 
2687
        case R_PPC64_REL14:
2688
        case R_PPC64_REL14_BRTAKEN:
2689
        case R_PPC64_REL14_BRNTAKEN:
2690
          htab->has_14bit_branch = 1;
2691
          /* Fall through.  */
2692
 
2693
        case R_PPC64_REL24:
2694
          if (h != NULL
2695
              && h->root.root.string[0] == '.'
2696
              && h->root.root.string[1] != 0)
2697
            {
2698
              /* We may need a .plt entry if the function this reloc
2699
                 refers to is in a shared lib.  */
2700
              h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
2701
              h->plt.refcount += 1;
2702
              ((struct ppc_link_hash_entry *) h)->is_func = 1;
2703
            }
2704
          break;
2705
 
2706
        case R_PPC64_ADDR64:
2707
          if (opd_sym_map != NULL
2708
              && h != NULL
2709
              && h->root.root.string[0] == '.'
2710
              && h->root.root.string[1] != 0)
2711
            {
2712
              struct elf_link_hash_entry *fdh;
2713
 
2714
              fdh = elf_link_hash_lookup (&htab->elf, h->root.root.string + 1,
2715
                                          false, false, false);
2716
              if (fdh != NULL)
2717
                {
2718
                  ((struct ppc_link_hash_entry *) fdh)->is_func_descriptor = 1;
2719
                  ((struct ppc_link_hash_entry *) fdh)->oh = h;
2720
                  ((struct ppc_link_hash_entry *) h)->is_func = 1;
2721
                  ((struct ppc_link_hash_entry *) h)->oh = fdh;
2722
                }
2723
            }
2724
          if (opd_sym_map != NULL
2725
              && h == NULL
2726
              && rel + 1 < rel_end
2727
              && ((enum elf_ppc_reloc_type) ELF64_R_TYPE ((rel + 1)->r_info)
2728
                  == R_PPC64_TOC))
2729
            {
2730
              asection *s;
2731
 
2732
              s = bfd_section_from_r_symndx (abfd, &htab->sym_sec, sec,
2733
                                             r_symndx);
2734
              if (s == NULL)
2735
                return false;
2736
              else if (s != sec)
2737
                opd_sym_map[rel->r_offset / 24] = s;
2738
            }
2739
          /* Fall through.  */
2740
 
2741
        case R_PPC64_REL64:
2742
        case R_PPC64_REL32:
2743
        case R_PPC64_ADDR14:
2744
        case R_PPC64_ADDR14_BRNTAKEN:
2745
        case R_PPC64_ADDR14_BRTAKEN:
2746
        case R_PPC64_ADDR16:
2747
        case R_PPC64_ADDR16_DS:
2748
        case R_PPC64_ADDR16_HA:
2749
        case R_PPC64_ADDR16_HI:
2750
        case R_PPC64_ADDR16_HIGHER:
2751
        case R_PPC64_ADDR16_HIGHERA:
2752
        case R_PPC64_ADDR16_HIGHEST:
2753
        case R_PPC64_ADDR16_HIGHESTA:
2754
        case R_PPC64_ADDR16_LO:
2755
        case R_PPC64_ADDR16_LO_DS:
2756
        case R_PPC64_ADDR24:
2757
        case R_PPC64_ADDR30:
2758
        case R_PPC64_ADDR32:
2759
        case R_PPC64_UADDR16:
2760
        case R_PPC64_UADDR32:
2761
        case R_PPC64_UADDR64:
2762
        case R_PPC64_TOC:
2763
          /* Don't propagate .opd relocs.  */
2764
          if (NO_OPD_RELOCS && opd_sym_map != NULL)
2765
            break;
2766
 
2767
          /* If we are creating a shared library, and this is a reloc
2768
             against a global symbol, or a non PC relative reloc
2769
             against a local symbol, then we need to copy the reloc
2770
             into the shared library.  However, if we are linking with
2771
             -Bsymbolic, we do not need to copy a reloc against a
2772
             global symbol which is defined in an object we are
2773
             including in the link (i.e., DEF_REGULAR is set).  At
2774
             this point we have not seen all the input files, so it is
2775
             possible that DEF_REGULAR is not set now but will be set
2776
             later (it is never cleared).  In case of a weak definition,
2777
             DEF_REGULAR may be cleared later by a strong definition in
2778
             a shared library.  We account for that possibility below by
2779
             storing information in the relocs_copied field of the hash
2780
             table entry.  A similar situation occurs when creating
2781
             shared libraries and symbol visibility changes render the
2782
             symbol local.
2783
 
2784
             If on the other hand, we are creating an executable, we
2785
             may need to keep relocations for symbols satisfied by a
2786
             dynamic library if we manage to avoid copy relocs for the
2787
             symbol.  */
2788
          if ((info->shared
2789
               && (sec->flags & SEC_ALLOC) != 0
2790
               && (IS_ABSOLUTE_RELOC (r_type)
2791
                   || (h != NULL
2792
                       && (! info->symbolic
2793
                           || h->root.type == bfd_link_hash_defweak
2794
                           || (h->elf_link_hash_flags
2795
                               & ELF_LINK_HASH_DEF_REGULAR) == 0))))
2796
              || (!info->shared
2797
                  && (sec->flags & SEC_ALLOC) != 0
2798
                  && h != NULL
2799
                  && (h->root.type == bfd_link_hash_defweak
2800
                      || (h->elf_link_hash_flags
2801
                          & ELF_LINK_HASH_DEF_REGULAR) == 0)))
2802
            {
2803
              struct ppc_dyn_relocs *p;
2804
              struct ppc_dyn_relocs **head;
2805
 
2806
              /* We must copy these reloc types into the output file.
2807
                 Create a reloc section in dynobj and make room for
2808
                 this reloc.  */
2809
              if (sreloc == NULL)
2810
                {
2811
                  const char *name;
2812
                  bfd *dynobj;
2813
 
2814
                  name = (bfd_elf_string_from_elf_section
2815
                          (abfd,
2816
                           elf_elfheader (abfd)->e_shstrndx,
2817
                           elf_section_data (sec)->rel_hdr.sh_name));
2818
                  if (name == NULL)
2819
                    return false;
2820
 
2821
                  if (strncmp (name, ".rela", 5) != 0
2822
                      || strcmp (bfd_get_section_name (abfd, sec),
2823
                                 name + 5) != 0)
2824
                    {
2825
                      (*_bfd_error_handler)
2826
                        (_("%s: bad relocation section name `%s\'"),
2827
                         bfd_archive_filename (abfd), name);
2828
                      bfd_set_error (bfd_error_bad_value);
2829
                    }
2830
 
2831
                  dynobj = htab->elf.dynobj;
2832
                  sreloc = bfd_get_section_by_name (dynobj, name);
2833
                  if (sreloc == NULL)
2834
                    {
2835
                      flagword flags;
2836
 
2837
                      sreloc = bfd_make_section (dynobj, name);
2838
                      flags = (SEC_HAS_CONTENTS | SEC_READONLY
2839
                               | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2840
                      if ((sec->flags & SEC_ALLOC) != 0)
2841
                        flags |= SEC_ALLOC | SEC_LOAD;
2842
                      if (sreloc == NULL
2843
                          || ! bfd_set_section_flags (dynobj, sreloc, flags)
2844
                          || ! bfd_set_section_alignment (dynobj, sreloc, 3))
2845
                        return false;
2846
                    }
2847
                  elf_section_data (sec)->sreloc = sreloc;
2848
                }
2849
 
2850
              /* If this is a global symbol, we count the number of
2851
                 relocations we need for this symbol.  */
2852
              if (h != NULL)
2853
                {
2854
                  head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
2855
                }
2856
              else
2857
                {
2858
                  /* Track dynamic relocs needed for local syms too.
2859
                     We really need local syms available to do this
2860
                     easily.  Oh well.  */
2861
 
2862
                  asection *s;
2863
                  s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
2864
                                                 sec, r_symndx);
2865
                  if (s == NULL)
2866
                    return false;
2867
 
2868
                  head = ((struct ppc_dyn_relocs **)
2869
                          &elf_section_data (s)->local_dynrel);
2870
                }
2871
 
2872
              p = *head;
2873
              if (p == NULL || p->sec != sec)
2874
                {
2875
                  p = ((struct ppc_dyn_relocs *)
2876
                       bfd_alloc (htab->elf.dynobj,
2877
                                  (bfd_size_type) sizeof *p));
2878
                  if (p == NULL)
2879
                    return false;
2880
                  p->next = *head;
2881
                  *head = p;
2882
                  p->sec = sec;
2883
                  p->count = 0;
2884
                  p->pc_count = 0;
2885
                }
2886
 
2887
              p->count += 1;
2888
              if (!IS_ABSOLUTE_RELOC (r_type))
2889
                p->pc_count += 1;
2890
            }
2891
          break;
2892
 
2893
        default:
2894
          break;
2895
        }
2896
    }
2897
 
2898
  return true;
2899
}
2900
 
2901
/* Return the section that should be marked against GC for a given
2902
   relocation.  */
2903
 
2904
static asection *
2905
ppc64_elf_gc_mark_hook (sec, info, rel, h, sym)
2906
     asection *sec;
2907
     struct bfd_link_info *info ATTRIBUTE_UNUSED;
2908
     Elf_Internal_Rela *rel;
2909
     struct elf_link_hash_entry *h;
2910
     Elf_Internal_Sym *sym;
2911
{
2912
  asection *rsec = NULL;
2913
 
2914
  if (h != NULL)
2915
    {
2916
      enum elf_ppc_reloc_type r_type;
2917
      struct ppc_link_hash_entry *fdh;
2918
 
2919
      r_type = (enum elf_ppc_reloc_type) ELF64_R_TYPE (rel->r_info);
2920
      switch (r_type)
2921
        {
2922
        case R_PPC64_GNU_VTINHERIT:
2923
        case R_PPC64_GNU_VTENTRY:
2924
          break;
2925
 
2926
        default:
2927
          switch (h->root.type)
2928
            {
2929
            case bfd_link_hash_defined:
2930
            case bfd_link_hash_defweak:
2931
              fdh = (struct ppc_link_hash_entry *) h;
2932
 
2933
              /* Function descriptor syms cause the associated
2934
                 function code sym section to be marked.  */
2935
              if (fdh->is_func_descriptor)
2936
                rsec = fdh->oh->root.u.def.section;
2937
 
2938
              /* Function entry syms return NULL if they are in .opd
2939
                 and are not ._start (or others undefined on the ld
2940
                 command line).  Thus we avoid marking all function
2941
                 sections, as all functions are referenced in .opd.  */
2942
              else if ((fdh->oh != NULL
2943
                        && ((struct ppc_link_hash_entry *) fdh->oh)->is_entry)
2944
                       || elf_section_data (sec)->tdata == NULL)
2945
                rsec = h->root.u.def.section;
2946
              break;
2947
 
2948
            case bfd_link_hash_common:
2949
              rsec = h->root.u.c.p->section;
2950
              break;
2951
 
2952
            default:
2953
              break;
2954
            }
2955
        }
2956
    }
2957
  else
2958
    {
2959
      asection **opd_sym_section;
2960
 
2961
      rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
2962
      opd_sym_section = (asection **) elf_section_data (rsec)->tdata;
2963
      if (opd_sym_section != NULL)
2964
        rsec = opd_sym_section[sym->st_value / 24];
2965
      else if (elf_section_data (sec)->tdata != NULL)
2966
        rsec = NULL;
2967
    }
2968
 
2969
  return rsec;
2970
}
2971
 
2972
/* Update the .got, .plt. and dynamic reloc reference counts for the
2973
   section being removed.  */
2974
 
2975
static boolean
2976
ppc64_elf_gc_sweep_hook (abfd, info, sec, relocs)
2977
     bfd *abfd;
2978
     struct bfd_link_info *info ATTRIBUTE_UNUSED;
2979
     asection *sec;
2980
     const Elf_Internal_Rela *relocs;
2981
{
2982
  Elf_Internal_Shdr *symtab_hdr;
2983
  struct elf_link_hash_entry **sym_hashes;
2984
  bfd_signed_vma *local_got_refcounts;
2985
  const Elf_Internal_Rela *rel, *relend;
2986
 
2987
  elf_section_data (sec)->local_dynrel = NULL;
2988
 
2989
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2990
  sym_hashes = elf_sym_hashes (abfd);
2991
  local_got_refcounts = elf_local_got_refcounts (abfd);
2992
 
2993
  relend = relocs + sec->reloc_count;
2994
  for (rel = relocs; rel < relend; rel++)
2995
    {
2996
      unsigned long r_symndx;
2997
      enum elf_ppc_reloc_type r_type;
2998
      struct elf_link_hash_entry *h;
2999
 
3000
      r_symndx = ELF64_R_SYM (rel->r_info);
3001
      r_type = (enum elf_ppc_reloc_type) ELF64_R_TYPE (rel->r_info);
3002
      switch (r_type)
3003
        {
3004
        case R_PPC64_GOT16:
3005
        case R_PPC64_GOT16_DS:
3006
        case R_PPC64_GOT16_HA:
3007
        case R_PPC64_GOT16_HI:
3008
        case R_PPC64_GOT16_LO:
3009
        case R_PPC64_GOT16_LO_DS:
3010
          if (r_symndx >= symtab_hdr->sh_info)
3011
            {
3012
              h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3013
              if (h->got.refcount > 0)
3014
                h->got.refcount--;
3015
            }
3016
          else
3017
            {
3018
              if (local_got_refcounts[r_symndx] > 0)
3019
                local_got_refcounts[r_symndx]--;
3020
            }
3021
          break;
3022
 
3023
        case R_PPC64_PLT16_HA:
3024
        case R_PPC64_PLT16_HI:
3025
        case R_PPC64_PLT16_LO:
3026
        case R_PPC64_PLT32:
3027
        case R_PPC64_PLT64:
3028
          if (r_symndx >= symtab_hdr->sh_info)
3029
            {
3030
              h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3031
              if (h->plt.refcount > 0)
3032
                h->plt.refcount--;
3033
            }
3034
          break;
3035
 
3036
        case R_PPC64_REL14:
3037
        case R_PPC64_REL14_BRNTAKEN:
3038
        case R_PPC64_REL14_BRTAKEN:
3039
        case R_PPC64_REL24:
3040
          if (r_symndx >= symtab_hdr->sh_info)
3041
            {
3042
              h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3043
              if (h->plt.refcount > 0)
3044
                h->plt.refcount--;
3045
            }
3046
          break;
3047
 
3048
        case R_PPC64_REL32:
3049
        case R_PPC64_REL64:
3050
          if (r_symndx >= symtab_hdr->sh_info)
3051
            {
3052
              struct ppc_link_hash_entry *eh;
3053
              struct ppc_dyn_relocs **pp;
3054
              struct ppc_dyn_relocs *p;
3055
 
3056
              h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3057
              eh = (struct ppc_link_hash_entry *) h;
3058
 
3059
              for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
3060
                if (p->sec == sec)
3061
                  {
3062
                    p->pc_count -= 1;
3063
                    p->count -= 1;
3064
                    if (p->count == 0)
3065
                      *pp = p->next;
3066
                    break;
3067
                  }
3068
            }
3069
          break;
3070
 
3071
        case R_PPC64_ADDR14:
3072
        case R_PPC64_ADDR14_BRNTAKEN:
3073
        case R_PPC64_ADDR14_BRTAKEN:
3074
        case R_PPC64_ADDR16:
3075
        case R_PPC64_ADDR16_DS:
3076
        case R_PPC64_ADDR16_HA:
3077
        case R_PPC64_ADDR16_HI:
3078
        case R_PPC64_ADDR16_HIGHER:
3079
        case R_PPC64_ADDR16_HIGHERA:
3080
        case R_PPC64_ADDR16_HIGHEST:
3081
        case R_PPC64_ADDR16_HIGHESTA:
3082
        case R_PPC64_ADDR16_LO:
3083
        case R_PPC64_ADDR16_LO_DS:
3084
        case R_PPC64_ADDR24:
3085
        case R_PPC64_ADDR30:
3086
        case R_PPC64_ADDR32:
3087
        case R_PPC64_ADDR64:
3088
        case R_PPC64_UADDR16:
3089
        case R_PPC64_UADDR32:
3090
        case R_PPC64_UADDR64:
3091
        case R_PPC64_TOC:
3092
          if (r_symndx >= symtab_hdr->sh_info)
3093
            {
3094
              struct ppc_link_hash_entry *eh;
3095
              struct ppc_dyn_relocs **pp;
3096
              struct ppc_dyn_relocs *p;
3097
 
3098
              h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3099
              eh = (struct ppc_link_hash_entry *) h;
3100
 
3101
              for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
3102
                if (p->sec == sec)
3103
                  {
3104
                    p->count -= 1;
3105
                    if (p->count == 0)
3106
                      *pp = p->next;
3107
                    break;
3108
                  }
3109
            }
3110
          break;
3111
 
3112
        default:
3113
          break;
3114
        }
3115
    }
3116
  return true;
3117
}
3118
 
3119
/* Called via elf_link_hash_traverse to transfer dynamic linking
3120
   information on function code symbol entries to their corresponding
3121
   function descriptor symbol entries.  */
3122
static boolean
3123
func_desc_adjust (h, inf)
3124
     struct elf_link_hash_entry *h;
3125
     PTR inf;
3126
{
3127
  struct bfd_link_info *info;
3128
  struct ppc_link_hash_table *htab;
3129
 
3130
  if (h->root.type == bfd_link_hash_indirect)
3131
    return true;
3132
 
3133
  if (h->root.type == bfd_link_hash_warning)
3134
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
3135
 
3136
  info = (struct bfd_link_info *) inf;
3137
  htab = ppc_hash_table (info);
3138
 
3139
  /* If this is a function code symbol, transfer dynamic linking
3140
     information to the function descriptor symbol.  */
3141
  if (!((struct ppc_link_hash_entry *) h)->is_func)
3142
    return true;
3143
 
3144
  if (h->root.type == bfd_link_hash_undefweak
3145
      && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR))
3146
    htab->have_undefweak = true;
3147
 
3148
  if (h->plt.refcount > 0
3149
      && h->root.root.string[0] == '.'
3150
      && h->root.root.string[1] != '\0')
3151
    {
3152
      struct elf_link_hash_entry *fdh = ((struct ppc_link_hash_entry *) h)->oh;
3153
      boolean force_local;
3154
 
3155
      /* Find the corresponding function descriptor symbol.  Create it
3156
         as undefined if necessary.  */
3157
 
3158
      if (fdh == NULL)
3159
        fdh = elf_link_hash_lookup (&htab->elf, h->root.root.string + 1,
3160
                                    false, false, true);
3161
 
3162
      if (fdh == NULL
3163
          && info->shared
3164
          && (h->root.type == bfd_link_hash_undefined
3165
              || h->root.type == bfd_link_hash_undefweak))
3166
        {
3167
          bfd *abfd;
3168
          asymbol *newsym;
3169
 
3170
          abfd = h->root.u.undef.abfd;
3171
          newsym = bfd_make_empty_symbol (abfd);
3172
          newsym->name = h->root.root.string + 1;
3173
          newsym->section = bfd_und_section_ptr;
3174
          newsym->value = 0;
3175
          newsym->flags = BSF_OBJECT;
3176
          if (h->root.type == bfd_link_hash_undefweak)
3177
            newsym->flags |= BSF_WEAK;
3178
 
3179
          if ( !(_bfd_generic_link_add_one_symbol
3180
                 (info, abfd, newsym->name, newsym->flags,
3181
                  newsym->section, newsym->value, NULL, false, false,
3182
                  (struct bfd_link_hash_entry **) &fdh)))
3183
            {
3184
              return false;
3185
            }
3186
          fdh->elf_link_hash_flags &= ~ELF_LINK_NON_ELF;
3187
        }
3188
 
3189
      if (fdh != NULL
3190
          && (fdh->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0
3191
          && (info->shared
3192
              || (fdh->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
3193
              || (fdh->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0))
3194
        {
3195
          if (fdh->dynindx == -1)
3196
            if (! bfd_elf64_link_record_dynamic_symbol (info, fdh))
3197
              return false;
3198
          fdh->elf_link_hash_flags |= (h->elf_link_hash_flags
3199
                                       & (ELF_LINK_HASH_REF_REGULAR
3200
                                          | ELF_LINK_HASH_REF_DYNAMIC
3201
                                          | ELF_LINK_HASH_REF_REGULAR_NONWEAK
3202
                                          | ELF_LINK_NON_GOT_REF));
3203
          if (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
3204
            {
3205
              fdh->plt.refcount = h->plt.refcount;
3206
              fdh->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
3207
            }
3208
          ((struct ppc_link_hash_entry *) fdh)->is_func_descriptor = 1;
3209
          ((struct ppc_link_hash_entry *) fdh)->oh = h;
3210
          ((struct ppc_link_hash_entry *) h)->oh = fdh;
3211
        }
3212
 
3213
      /* Now that the info is on the function descriptor, clear the
3214
         function code sym info.  Any function code syms for which we
3215
         don't have a definition in a regular file, we force local.
3216
         This prevents a shared library from exporting syms that have
3217
         been imported from another library.  Function code syms that
3218
         are really in the library we must leave global to prevent the
3219
         linker dragging in a definition from a static library.  */
3220
      force_local = (info->shared
3221
                     && ((h->elf_link_hash_flags
3222
                          & ELF_LINK_HASH_DEF_REGULAR) == 0
3223
                         || fdh == NULL
3224
                         || (fdh->elf_link_hash_flags
3225
                             & ELF_LINK_HASH_DEF_REGULAR) == 0
3226
                         || (fdh->elf_link_hash_flags
3227
                             & ELF_LINK_FORCED_LOCAL) != 0));
3228
      _bfd_elf_link_hash_hide_symbol (info, h, force_local);
3229
    }
3230
 
3231
  return true;
3232
}
3233
 
3234
#define MIN_SAVE_FPR 14
3235
#define MAX_SAVE_FPR 31
3236
 
3237
/* Called near the start of bfd_elf_size_dynamic_sections.  We use
3238
   this hook to a) provide some gcc support functions, and b) transfer
3239
   dynamic linking information gathered so far on function code symbol
3240
   entries, to their corresponding function descriptor symbol entries.  */
3241
static boolean
3242
ppc64_elf_func_desc_adjust (obfd, info)
3243
     bfd *obfd ATTRIBUTE_UNUSED;
3244
     struct bfd_link_info *info;
3245
{
3246
  struct ppc_link_hash_table *htab;
3247
  unsigned int lowest_savef = MAX_SAVE_FPR + 2;
3248
  unsigned int lowest_restf = MAX_SAVE_FPR + 2;
3249
  unsigned int i;
3250
  struct elf_link_hash_entry *h;
3251
  bfd_byte *p;
3252
  char sym[10];
3253
 
3254
  htab = ppc_hash_table (info);
3255
 
3256
  if (htab->sfpr == NULL)
3257
    /* We don't have any relocs.  */
3258
    return true;
3259
 
3260
  /* First provide any missing ._savef* and ._restf* functions.  */
3261
  memcpy (sym, "._savef14", 10);
3262
  for (i = MIN_SAVE_FPR; i <= MAX_SAVE_FPR; i++)
3263
    {
3264
      sym[7] = i / 10 + '0';
3265
      sym[8] = i % 10 + '0';
3266
      h = elf_link_hash_lookup (&htab->elf, sym, false, false, true);
3267
      if (h != NULL
3268
          && h->root.type == bfd_link_hash_undefined)
3269
        {
3270
          if (lowest_savef > i)
3271
            lowest_savef = i;
3272
          h->root.type = bfd_link_hash_defined;
3273
          h->root.u.def.section = htab->sfpr;
3274
          h->root.u.def.value = (i - lowest_savef) * 4;
3275
          h->type = STT_FUNC;
3276
          h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
3277
          _bfd_elf_link_hash_hide_symbol (info, h, info->shared);
3278
        }
3279
    }
3280
 
3281
  memcpy (sym, "._restf14", 10);
3282
  for (i = MIN_SAVE_FPR; i <= MAX_SAVE_FPR; i++)
3283
    {
3284
      sym[7] = i / 10 + '0';
3285
      sym[8] = i % 10 + '0';
3286
      h = elf_link_hash_lookup (&htab->elf, sym, false, false, true);
3287
      if (h != NULL
3288
          && h->root.type == bfd_link_hash_undefined)
3289
        {
3290
          if (lowest_restf > i)
3291
            lowest_restf = i;
3292
          h->root.type = bfd_link_hash_defined;
3293
          h->root.u.def.section = htab->sfpr;
3294
          h->root.u.def.value = ((MAX_SAVE_FPR + 2 - lowest_savef) * 4
3295
                                 + (i - lowest_restf) * 4);
3296
          h->type = STT_FUNC;
3297
          h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
3298
          _bfd_elf_link_hash_hide_symbol (info, h, info->shared);
3299
        }
3300
    }
3301
 
3302
  elf_link_hash_traverse (&htab->elf, func_desc_adjust, (PTR) info);
3303
 
3304
  htab->sfpr->_raw_size = ((MAX_SAVE_FPR + 2 - lowest_savef) * 4
3305
                           + (MAX_SAVE_FPR + 2 - lowest_restf) * 4);
3306
 
3307
  if (htab->sfpr->_raw_size == 0)
3308
    {
3309
      if (!htab->have_undefweak)
3310
        {
3311
          _bfd_strip_section_from_output (info, htab->sfpr);
3312
          return true;
3313
        }
3314
 
3315
      htab->sfpr->_raw_size = 4;
3316
    }
3317
 
3318
  p = (bfd_byte *) bfd_alloc (htab->elf.dynobj, htab->sfpr->_raw_size);
3319
  if (p == NULL)
3320
    return false;
3321
  htab->sfpr->contents = p;
3322
 
3323
  for (i = lowest_savef; i <= MAX_SAVE_FPR; i++)
3324
    {
3325
      unsigned int fpr = i << 21;
3326
      unsigned int stackoff = (1 << 16) - (MAX_SAVE_FPR + 1 - i) * 8;
3327
      bfd_put_32 (htab->elf.dynobj, STFD_FR0_0R1 + fpr + stackoff, p);
3328
      p += 4;
3329
    }
3330
  if (lowest_savef <= MAX_SAVE_FPR)
3331
    {
3332
      bfd_put_32 (htab->elf.dynobj, BLR, p);
3333
      p += 4;
3334
    }
3335
 
3336
  for (i = lowest_restf; i <= MAX_SAVE_FPR; i++)
3337
    {
3338
      unsigned int fpr = i << 21;
3339
      unsigned int stackoff = (1 << 16) - (MAX_SAVE_FPR + 1 - i) * 8;
3340
      bfd_put_32 (htab->elf.dynobj, LFD_FR0_0R1 + fpr + stackoff, p);
3341
      p += 4;
3342
    }
3343
  if (lowest_restf <= MAX_SAVE_FPR
3344
      || htab->sfpr->_raw_size == 4)
3345
    {
3346
      bfd_put_32 (htab->elf.dynobj, BLR, p);
3347
    }
3348
 
3349
  return true;
3350
}
3351
 
3352
/* Adjust a symbol defined by a dynamic object and referenced by a
3353
   regular object.  The current definition is in some section of the
3354
   dynamic object, but we're not including those sections.  We have to
3355
   change the definition to something the rest of the link can
3356
   understand.  */
3357
 
3358
static boolean
3359
ppc64_elf_adjust_dynamic_symbol (info, h)
3360
     struct bfd_link_info *info;
3361
     struct elf_link_hash_entry *h;
3362
{
3363
  struct ppc_link_hash_table *htab;
3364
  struct ppc_link_hash_entry * eh;
3365
  struct ppc_dyn_relocs *p;
3366
  asection *s;
3367
  unsigned int power_of_two;
3368
 
3369
  htab = ppc_hash_table (info);
3370
 
3371
  /* Deal with function syms.  */
3372
  if (h->type == STT_FUNC
3373
      || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
3374
    {
3375
      /* Clear procedure linkage table information for any symbol that
3376
         won't need a .plt entry.  */
3377
      if (!((struct ppc_link_hash_entry *) h)->is_func_descriptor
3378
          || h->plt.refcount <= 0
3379
          || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
3380
          || (! info->shared
3381
              && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
3382
              && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0))
3383
        {
3384
          h->plt.offset = (bfd_vma) -1;
3385
          h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
3386
        }
3387
      return true;
3388
    }
3389
  else
3390
    h->plt.offset = (bfd_vma) -1;
3391
 
3392
  /* If this is a weak symbol, and there is a real definition, the
3393
     processor independent code will have arranged for us to see the
3394
     real definition first, and we can just use the same value.  */
3395
  if (h->weakdef != NULL)
3396
    {
3397
      BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
3398
                  || h->weakdef->root.type == bfd_link_hash_defweak);
3399
      h->root.u.def.section = h->weakdef->root.u.def.section;
3400
      h->root.u.def.value = h->weakdef->root.u.def.value;
3401
      return true;
3402
    }
3403
 
3404
  /* This is a reference to a symbol defined by a dynamic object which
3405
     is not a function.  */
3406
 
3407
  /* If we are creating a shared library, we must presume that the
3408
     only references to the symbol are via the global offset table.
3409
     For such cases we need not do anything here; the relocations will
3410
     be handled correctly by relocate_section.  */
3411
  if (info->shared)
3412
    return true;
3413
 
3414
  /* If there are no references to this symbol that do not use the
3415
     GOT, we don't need to generate a copy reloc.  */
3416
  if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
3417
    return true;
3418
 
3419
  eh = (struct ppc_link_hash_entry *) h;
3420
  for (p = eh->dyn_relocs; p != NULL; p = p->next)
3421
    {
3422
      s = p->sec->output_section;
3423
      if (s != NULL && (s->flags & SEC_READONLY) != 0)
3424
        break;
3425
    }
3426
 
3427
  /* If we didn't find any dynamic relocs in read-only sections, then
3428
     we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
3429
  if (p == NULL)
3430
    {
3431
      h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
3432
      return true;
3433
    }
3434
 
3435
  /* We must allocate the symbol in our .dynbss section, which will
3436
     become part of the .bss section of the executable.  There will be
3437
     an entry for this symbol in the .dynsym section.  The dynamic
3438
     object will contain position independent code, so all references
3439
     from the dynamic object to this symbol will go through the global
3440
     offset table.  The dynamic linker will use the .dynsym entry to
3441
     determine the address it must put in the global offset table, so
3442
     both the dynamic object and the regular object will refer to the
3443
     same memory location for the variable.  */
3444
 
3445
  /* We must generate a R_PPC_COPY reloc to tell the dynamic linker to
3446
     copy the initial value out of the dynamic object and into the
3447
     runtime process image.  We need to remember the offset into the
3448
     .rela.bss section we are going to use.  */
3449
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
3450
    {
3451
      htab->srelbss->_raw_size += sizeof (Elf64_External_Rela);
3452
      h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
3453
    }
3454
 
3455
  /* We need to figure out the alignment required for this symbol.  I
3456
     have no idea how ELF linkers handle this.  */
3457
  power_of_two = bfd_log2 (h->size);
3458
  if (power_of_two > 4)
3459
    power_of_two = 4;
3460
 
3461
  /* Apply the required alignment.  */
3462
  s = htab->sdynbss;
3463
  s->_raw_size = BFD_ALIGN (s->_raw_size, (bfd_size_type) (1 << power_of_two));
3464
  if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
3465
    {
3466
      if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
3467
        return false;
3468
    }
3469
 
3470
  /* Define the symbol as being at this point in the section.  */
3471
  h->root.u.def.section = s;
3472
  h->root.u.def.value = s->_raw_size;
3473
 
3474
  /* Increment the section size to make room for the symbol.  */
3475
  s->_raw_size += h->size;
3476
 
3477
  return true;
3478
}
3479
 
3480
/* If given a function descriptor symbol, hide both the function code
3481
   sym and the descriptor.  */
3482
static void
3483
ppc64_elf_hide_symbol (info, h, force_local)
3484
     struct bfd_link_info *info;
3485
     struct elf_link_hash_entry *h;
3486
     boolean force_local;
3487
{
3488
  _bfd_elf_link_hash_hide_symbol (info, h, force_local);
3489
 
3490
  if (((struct ppc_link_hash_entry *) h)->is_func_descriptor)
3491
    {
3492
      struct elf_link_hash_entry *fh = ((struct ppc_link_hash_entry *) h)->oh;
3493
 
3494
      if (fh == NULL)
3495
        {
3496
          const char *p, *q;
3497
          struct ppc_link_hash_table *htab;
3498
          char save;
3499
 
3500
          /* We aren't supposed to use alloca in BFD because on
3501
             systems which do not have alloca the version in libiberty
3502
             calls xmalloc, which might cause the program to crash
3503
             when it runs out of memory.  This function doesn't have a
3504
             return status, so there's no way to gracefully return an
3505
             error.  So cheat.  We know that string[-1] can be safely
3506
             dereferenced;  It's either a string in an ELF string
3507
             table, or allocated in an objalloc structure.  */
3508
 
3509
          p = h->root.root.string - 1;
3510
          save = *p;
3511
          *(char *) p = '.';
3512
          htab = ppc_hash_table (info);
3513
          fh = elf_link_hash_lookup (&htab->elf, p, false, false, false);
3514
          *(char *) p = save;
3515
 
3516
          /* Unfortunately, if it so happens that the string we were
3517
             looking for was allocated immediately before this string,
3518
             then we overwrote the string terminator.  That's the only
3519
             reason the lookup should fail.  */
3520
          if (fh == NULL)
3521
            {
3522
              q = h->root.root.string + strlen (h->root.root.string);
3523
              while (q >= h->root.root.string && *q == *p)
3524
                --q, --p;
3525
              if (q < h->root.root.string && *p == '.')
3526
                fh = elf_link_hash_lookup (&htab->elf, p, false, false, false);
3527
            }
3528
          if (fh != NULL)
3529
            {
3530
              ((struct ppc_link_hash_entry *) h)->oh = fh;
3531
              ((struct ppc_link_hash_entry *) fh)->oh = h;
3532
            }
3533
        }
3534
      if (fh != NULL)
3535
        _bfd_elf_link_hash_hide_symbol (info, fh, force_local);
3536
    }
3537
}
3538
 
3539
static boolean
3540
edit_opd (obfd, info)
3541
     bfd *obfd;
3542
     struct bfd_link_info *info;
3543
{
3544
  bfd *ibfd;
3545
  unsigned int bfd_indx;
3546
 
3547
  for (bfd_indx = 0, ibfd = info->input_bfds;
3548
       ibfd != NULL;
3549
       ibfd = ibfd->link_next, bfd_indx++)
3550
    {
3551
      asection *sec;
3552
      Elf_Internal_Rela *relstart, *rel, *relend;
3553
      Elf_Internal_Shdr *symtab_hdr;
3554
      Elf_Internal_Sym *local_syms;
3555
      struct elf_link_hash_entry **sym_hashes;
3556
      bfd_vma offset;
3557
      long *adjust;
3558
      boolean need_edit;
3559
 
3560
      sec = bfd_get_section_by_name (ibfd, ".opd");
3561
      if (sec == NULL)
3562
        continue;
3563
 
3564
      adjust = (long *) elf_section_data (sec)->tdata;
3565
      BFD_ASSERT (adjust != NULL);
3566
      memset (adjust, 0, (size_t) sec->_raw_size * sizeof (long) / 24);
3567
 
3568
      if (sec->output_section == bfd_abs_section_ptr)
3569
        continue;
3570
 
3571
      /* Look through the section relocs.  */
3572
      if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
3573
        continue;
3574
 
3575
      local_syms = NULL;
3576
      symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
3577
      sym_hashes = elf_sym_hashes (ibfd);
3578
 
3579
      /* Read the relocations.  */
3580
      relstart = _bfd_elf64_link_read_relocs (obfd, sec, (PTR) NULL,
3581
                                              (Elf_Internal_Rela *) NULL,
3582
                                              info->keep_memory);
3583
      if (relstart == NULL)
3584
        return false;
3585
 
3586
      /* First run through the relocs to check they are sane, and to
3587
         determine whether we need to edit this opd section.  */
3588
      need_edit = false;
3589
      offset = 0;
3590
      relend = relstart + sec->reloc_count;
3591
      for (rel = relstart; rel < relend; rel++)
3592
        {
3593
          enum elf_ppc_reloc_type r_type;
3594
          unsigned long r_symndx;
3595
          asection *sym_sec;
3596
          struct elf_link_hash_entry *h;
3597
          Elf_Internal_Sym *sym;
3598
 
3599
          /* .opd contains a regular array of 24 byte entries.  We're
3600
             only interested in the reloc pointing to a function entry
3601
             point.  */
3602
          r_type = (enum elf_ppc_reloc_type) ELF64_R_TYPE (rel->r_info);
3603
          if (r_type == R_PPC64_TOC)
3604
            continue;
3605
 
3606
          if (r_type != R_PPC64_ADDR64)
3607
            {
3608
              (*_bfd_error_handler)
3609
                (_("%s: unexpected reloc type %u in .opd section"),
3610
                 bfd_archive_filename (ibfd), r_type);
3611
              need_edit = false;
3612
              break;
3613
            }
3614
 
3615
          if (rel + 1 >= relend)
3616
            continue;
3617
          r_type = (enum elf_ppc_reloc_type) ELF64_R_TYPE ((rel + 1)->r_info);
3618
          if (r_type != R_PPC64_TOC)
3619
            continue;
3620
 
3621
          if (rel->r_offset != offset)
3622
            {
3623
              /* If someone messes with .opd alignment then after a
3624
                 "ld -r" we might have padding in the middle of .opd.
3625
                 Also, there's nothing to prevent someone putting
3626
                 something silly in .opd with the assembler.  No .opd
3627
                 optimization for them!  */
3628
              (*_bfd_error_handler)
3629
                (_("%s: .opd is not a regular array of opd entries"),
3630
                 bfd_archive_filename (ibfd));
3631
              need_edit = false;
3632
              break;
3633
            }
3634
 
3635
          r_symndx = ELF64_R_SYM (rel->r_info);
3636
          sym_sec = NULL;
3637
          h = NULL;
3638
          sym = NULL;
3639
          if (r_symndx >= symtab_hdr->sh_info)
3640
            {
3641
              h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3642
              while (h->root.type == bfd_link_hash_indirect
3643
                     || h->root.type == bfd_link_hash_warning)
3644
                h = (struct elf_link_hash_entry *) h->root.u.i.link;
3645
              if (h->root.type == bfd_link_hash_defined
3646
                  || h->root.type == bfd_link_hash_defweak)
3647
                sym_sec = h->root.u.def.section;
3648
            }
3649
          else
3650
            {
3651
              if (local_syms == NULL)
3652
                {
3653
                  local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
3654
                  if (local_syms == NULL)
3655
                    local_syms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
3656
                                                       symtab_hdr->sh_info, 0,
3657
                                                       NULL, NULL, NULL);
3658
                  if (local_syms == NULL)
3659
                    goto error_free_rel;
3660
                }
3661
              sym = local_syms + r_symndx;
3662
              if ((sym->st_shndx != SHN_UNDEF
3663
                   && sym->st_shndx < SHN_LORESERVE)
3664
                  || sym->st_shndx > SHN_HIRESERVE)
3665
                sym_sec = bfd_section_from_elf_index (ibfd, sym->st_shndx);
3666
            }
3667
 
3668
          if (sym_sec == NULL || sym_sec->owner == NULL)
3669
            {
3670
              (*_bfd_error_handler)
3671
                (_("%s: undefined sym `%s' in .opd section"),
3672
                 bfd_archive_filename (ibfd),
3673
                 h != NULL ? h->root.root.string : "<local symbol>");
3674
              need_edit = false;
3675
              break;
3676
            }
3677
 
3678
          if (sym_sec->output_section == bfd_abs_section_ptr)
3679
            {
3680
              /* OK, we've found a function that's excluded from the
3681
                 link.  */
3682
              need_edit = true;
3683
            }
3684
 
3685
          offset += 24;
3686
        }
3687
 
3688
      if (need_edit)
3689
        {
3690
          Elf_Internal_Rela *write_rel;
3691
          bfd_byte *rptr, *wptr;
3692
          boolean skip;
3693
 
3694
          /* This seems a waste of time as input .opd sections are all
3695
             zeros as generated by gcc, but I suppose there's no reason
3696
             this will always be so.  We might start putting something in
3697
             the third word of .opd entries.  */
3698
          if ((sec->flags & SEC_IN_MEMORY) == 0)
3699
            {
3700
              bfd_byte *loc = bfd_alloc (ibfd, sec->_raw_size);
3701
              if (loc == NULL
3702
                  || !bfd_get_section_contents (ibfd, sec, loc, (bfd_vma) 0,
3703
                                                sec->_raw_size))
3704
                {
3705
                  if (local_syms != NULL
3706
                      && symtab_hdr->contents != (unsigned char *) local_syms)
3707
                    free (local_syms);
3708
                error_free_rel:
3709
                  if (elf_section_data (sec)->relocs != relstart)
3710
                    free (relstart);
3711
                  return false;
3712
                }
3713
              sec->contents = loc;
3714
              sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
3715
            }
3716
 
3717
          elf_section_data (sec)->relocs = relstart;
3718
 
3719
          wptr = sec->contents;
3720
          rptr = sec->contents;
3721
          write_rel = relstart;
3722
          skip = false;
3723
          offset = 0;
3724
          for (rel = relstart; rel < relend; rel++)
3725
            {
3726
              if (rel->r_offset == offset)
3727
                {
3728
                  unsigned long r_symndx;
3729
                  asection *sym_sec;
3730
                  struct elf_link_hash_entry *h;
3731
                  Elf_Internal_Sym *sym;
3732
 
3733
                  r_symndx = ELF64_R_SYM (rel->r_info);
3734
                  sym_sec = NULL;
3735
                  h = NULL;
3736
                  sym = NULL;
3737
                  if (r_symndx >= symtab_hdr->sh_info)
3738
                    {
3739
                      h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3740
                      while (h->root.type == bfd_link_hash_indirect
3741
                             || h->root.type == bfd_link_hash_warning)
3742
                        h = (struct elf_link_hash_entry *) h->root.u.i.link;
3743
                      if (h->root.type == bfd_link_hash_defined
3744
                          || h->root.type == bfd_link_hash_defweak)
3745
                        sym_sec = h->root.u.def.section;
3746
                    }
3747
                  else
3748
                    {
3749
                      sym = local_syms + r_symndx;
3750
                      if ((sym->st_shndx != SHN_UNDEF
3751
                           && sym->st_shndx < SHN_LORESERVE)
3752
                          || sym->st_shndx > SHN_HIRESERVE)
3753
                        sym_sec = bfd_section_from_elf_index (ibfd,
3754
                                                              sym->st_shndx);
3755
                    }
3756
 
3757
                  skip = sym_sec->output_section == bfd_abs_section_ptr;
3758
                  if (skip)
3759
                    {
3760
                      if (h != NULL)
3761
                        {
3762
                          /* Arrange for the function descriptor sym
3763
                             to be dropped.  */
3764
                          struct elf_link_hash_entry *fdh;
3765
                          struct ppc_link_hash_entry *fh;
3766
 
3767
                          fh = (struct ppc_link_hash_entry *) h;
3768
                          BFD_ASSERT (fh->is_func);
3769
                          fdh = fh->oh;
3770
                          fdh->root.u.def.value = 0;
3771
                          fdh->root.u.def.section = sym_sec;
3772
                        }
3773
                    }
3774
                  else
3775
                    {
3776
                      /* We'll be keeping this opd entry.  */
3777
 
3778
                      if (h != NULL)
3779
                        {
3780
                          /* Redefine the function descriptor symbol
3781
                             to this location in the opd section.
3782
                             We've checked above that opd relocs are
3783
                             ordered.  */
3784
                          struct elf_link_hash_entry *fdh;
3785
                          struct ppc_link_hash_entry *fh;
3786
 
3787
                          fh = (struct ppc_link_hash_entry *) h;
3788
                          BFD_ASSERT (fh->is_func);
3789
                          fdh = fh->oh;
3790
                          fdh->root.u.def.value = wptr - sec->contents;
3791
                        }
3792
                      else
3793
                        {
3794
                          /* Local syms are a bit tricky.  We could
3795
                             tweak them as they can be cached, but
3796
                             we'd need to look through the local syms
3797
                             for the function descriptor sym which we
3798
                             don't have at the moment.  So keep an
3799
                             array of adjustments.  */
3800
                          adjust[(rel->r_offset + wptr - rptr) / 24]
3801
                            = wptr - rptr;
3802
                        }
3803
 
3804
                      if (wptr != rptr)
3805
                        memcpy (wptr, rptr, 24);
3806
                      wptr += 24;
3807
                    }
3808
                  rptr += 24;
3809
                  offset += 24;
3810
                }
3811
 
3812
              /* We need to adjust any reloc offsets to point to the
3813
                 new opd entries.  While we're at it, we may as well
3814
                 remove redundant relocs.  */
3815
              if (!skip)
3816
                {
3817
                  rel->r_offset += wptr - rptr;
3818
                  if (write_rel != rel)
3819
                    memcpy (write_rel, rel, sizeof (*rel));
3820
                  ++write_rel;
3821
                }
3822
            }
3823
 
3824
          sec->_cooked_size = wptr - sec->contents;
3825
          sec->reloc_count = write_rel - relstart;
3826
        }
3827
      else if (elf_section_data (sec)->relocs != relstart)
3828
        free (relstart);
3829
 
3830
      if (local_syms != NULL
3831
          && symtab_hdr->contents != (unsigned char *) local_syms)
3832
        {
3833
          if (!info->keep_memory)
3834
            free (local_syms);
3835
          else
3836
            symtab_hdr->contents = (unsigned char *) local_syms;
3837
        }
3838
    }
3839
 
3840
  return true;
3841
}
3842
 
3843
/* This is the condition under which ppc64_elf_finish_dynamic_symbol
3844
   will be called from elflink.h.  If elflink.h doesn't call our
3845
   finish_dynamic_symbol routine, we'll need to do something about
3846
   initializing any .plt and .got entries in ppc64_elf_relocate_section.  */
3847
#define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, INFO, H) \
3848
  ((DYN)                                                                \
3849
   && ((INFO)->shared                                                   \
3850
       || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)       \
3851
   && ((H)->dynindx != -1                                               \
3852
       || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0))
3853
 
3854
/* Allocate space in .plt, .got and associated reloc sections for
3855
   dynamic relocs.  */
3856
 
3857
static boolean
3858
allocate_dynrelocs (h, inf)
3859
     struct elf_link_hash_entry *h;
3860
     PTR inf;
3861
{
3862
  struct bfd_link_info *info;
3863
  struct ppc_link_hash_table *htab;
3864
  asection *s;
3865
  struct ppc_link_hash_entry *eh;
3866
  struct ppc_dyn_relocs *p;
3867
 
3868
  if (h->root.type == bfd_link_hash_indirect)
3869
    return true;
3870
 
3871
  if (h->root.type == bfd_link_hash_warning)
3872
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
3873
 
3874
  info = (struct bfd_link_info *) inf;
3875
  htab = ppc_hash_table (info);
3876
 
3877
  if (htab->elf.dynamic_sections_created
3878
      && h->plt.refcount > 0
3879
      && h->dynindx != -1)
3880
    {
3881
      BFD_ASSERT (((struct ppc_link_hash_entry *) h)->is_func_descriptor);
3882
 
3883
      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h))
3884
        {
3885
          /* If this is the first .plt entry, make room for the special
3886
             first entry.  */
3887
          s = htab->splt;
3888
          if (s->_raw_size == 0)
3889
            s->_raw_size += PLT_INITIAL_ENTRY_SIZE;
3890
 
3891
          h->plt.offset = s->_raw_size;
3892
 
3893
          /* Make room for this entry.  */
3894
          s->_raw_size += PLT_ENTRY_SIZE;
3895
 
3896
          /* Make room for the .glink code.  */
3897
          s = htab->sglink;
3898
          if (s->_raw_size == 0)
3899
            s->_raw_size += GLINK_CALL_STUB_SIZE;
3900
          /* We need bigger stubs past index 32767.  */
3901
          if (s->_raw_size >= GLINK_CALL_STUB_SIZE + 32768*2*4)
3902
            s->_raw_size += 4;
3903
          s->_raw_size += 2*4;
3904
 
3905
          /* We also need to make an entry in the .rela.plt section.  */
3906
          s = htab->srelplt;
3907
          s->_raw_size += sizeof (Elf64_External_Rela);
3908
        }
3909
      else
3910
        {
3911
          h->plt.offset = (bfd_vma) -1;
3912
          h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
3913
        }
3914
    }
3915
  else
3916
    {
3917
      h->plt.offset = (bfd_vma) -1;
3918
      h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
3919
    }
3920
 
3921
  if (h->got.refcount > 0)
3922
    {
3923
      boolean dyn;
3924
 
3925
      /* Make sure this symbol is output as a dynamic symbol.
3926
         Undefined weak syms won't yet be marked as dynamic.  */
3927
      if (h->dynindx == -1
3928
          && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
3929
        {
3930
          if (! bfd_elf64_link_record_dynamic_symbol (info, h))
3931
            return false;
3932
        }
3933
 
3934
      s = htab->sgot;
3935
      h->got.offset = s->_raw_size;
3936
      s->_raw_size += 8;
3937
      dyn = htab->elf.dynamic_sections_created;
3938
      if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h))
3939
        htab->srelgot->_raw_size += sizeof (Elf64_External_Rela);
3940
    }
3941
  else
3942
    h->got.offset = (bfd_vma) -1;
3943
 
3944
  eh = (struct ppc_link_hash_entry *) h;
3945
  if (eh->dyn_relocs == NULL)
3946
    return true;
3947
 
3948
  /* In the shared -Bsymbolic case, discard space allocated for
3949
     dynamic pc-relative relocs against symbols which turn out to be
3950
     defined in regular objects.  For the normal shared case, discard
3951
     space for relocs that have become local due to symbol visibility
3952
     changes.  */
3953
 
3954
  if (info->shared)
3955
    {
3956
      if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
3957
          && ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
3958
              || info->symbolic))
3959
        {
3960
          struct ppc_dyn_relocs **pp;
3961
 
3962
          for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
3963
            {
3964
              p->count -= p->pc_count;
3965
              p->pc_count = 0;
3966
              if (p->count == 0)
3967
                *pp = p->next;
3968
              else
3969
                pp = &p->next;
3970
            }
3971
        }
3972
    }
3973
  else
3974
    {
3975
      /* For the non-shared case, discard space for relocs against
3976
         symbols which turn out to need copy relocs or are not
3977
         dynamic.  */
3978
 
3979
      if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
3980
          && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
3981
               && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
3982
              || (htab->elf.dynamic_sections_created
3983
                  && (h->root.type == bfd_link_hash_undefweak
3984
                      || h->root.type == bfd_link_hash_undefined))))
3985
        {
3986
          /* Make sure this symbol is output as a dynamic symbol.
3987
             Undefined weak syms won't yet be marked as dynamic.  */
3988
          if (h->dynindx == -1
3989
              && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
3990
            {
3991
              if (! bfd_elf64_link_record_dynamic_symbol (info, h))
3992
                return false;
3993
            }
3994
 
3995
          /* If that succeeded, we know we'll be keeping all the
3996
             relocs.  */
3997
          if (h->dynindx != -1)
3998
            goto keep;
3999
        }
4000
 
4001
      eh->dyn_relocs = NULL;
4002
 
4003
    keep: ;
4004
    }
4005
 
4006
  /* Finally, allocate space.  */
4007
  for (p = eh->dyn_relocs; p != NULL; p = p->next)
4008
    {
4009
      asection *sreloc = elf_section_data (p->sec)->sreloc;
4010
      sreloc->_raw_size += p->count * sizeof (Elf64_External_Rela);
4011
    }
4012
 
4013
  return true;
4014
}
4015
 
4016
/* Find any dynamic relocs that apply to read-only sections.  */
4017
 
4018
static boolean
4019
readonly_dynrelocs (h, inf)
4020
     struct elf_link_hash_entry *h;
4021
     PTR inf;
4022
{
4023
  struct ppc_link_hash_entry *eh;
4024
  struct ppc_dyn_relocs *p;
4025
 
4026
  if (h->root.type == bfd_link_hash_warning)
4027
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
4028
 
4029
  eh = (struct ppc_link_hash_entry *) h;
4030
  for (p = eh->dyn_relocs; p != NULL; p = p->next)
4031
    {
4032
      asection *s = p->sec->output_section;
4033
 
4034
      if (s != NULL && (s->flags & SEC_READONLY) != 0)
4035
        {
4036
          struct bfd_link_info *info = (struct bfd_link_info *) inf;
4037
 
4038
          info->flags |= DF_TEXTREL;
4039
 
4040
          /* Not an error, just cut short the traversal.  */
4041
          return false;
4042
        }
4043
    }
4044
  return true;
4045
}
4046
 
4047
/* Set the sizes of the dynamic sections.  */
4048
 
4049
static boolean
4050
ppc64_elf_size_dynamic_sections (output_bfd, info)
4051
     bfd *output_bfd ATTRIBUTE_UNUSED;
4052
     struct bfd_link_info *info;
4053
{
4054
  struct ppc_link_hash_table *htab;
4055
  bfd *dynobj;
4056
  asection *s;
4057
  boolean relocs;
4058
  bfd *ibfd;
4059
 
4060
  htab = ppc_hash_table (info);
4061
  dynobj = htab->elf.dynobj;
4062
  if (dynobj == NULL)
4063
    abort ();
4064
 
4065
  if (htab->elf.dynamic_sections_created)
4066
    {
4067
      /* Set the contents of the .interp section to the interpreter.  */
4068
      if (! info->shared)
4069
        {
4070
          s = bfd_get_section_by_name (dynobj, ".interp");
4071
          if (s == NULL)
4072
            abort ();
4073
          s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
4074
          s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
4075
        }
4076
    }
4077
 
4078
  /* Set up .got offsets for local syms, and space for local dynamic
4079
     relocs.  */
4080
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
4081
    {
4082
      bfd_signed_vma *local_got;
4083
      bfd_signed_vma *end_local_got;
4084
      bfd_size_type locsymcount;
4085
      Elf_Internal_Shdr *symtab_hdr;
4086
      asection *srel;
4087
 
4088
      if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
4089
        continue;
4090
 
4091
      for (s = ibfd->sections; s != NULL; s = s->next)
4092
        {
4093
          struct ppc_dyn_relocs *p;
4094
 
4095
          for (p = *((struct ppc_dyn_relocs **)
4096
                     &elf_section_data (s)->local_dynrel);
4097
               p != NULL;
4098
               p = p->next)
4099
            {
4100
              if (!bfd_is_abs_section (p->sec)
4101
                  && bfd_is_abs_section (p->sec->output_section))
4102
                {
4103
                  /* Input section has been discarded, either because
4104
                     it is a copy of a linkonce section or due to
4105
                     linker script /DISCARD/, so we'll be discarding
4106
                     the relocs too.  */
4107
                }
4108
              else if (p->count != 0)
4109
                {
4110
                  srel = elf_section_data (p->sec)->sreloc;
4111
                  srel->_raw_size += p->count * sizeof (Elf64_External_Rela);
4112
                  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
4113
                    info->flags |= DF_TEXTREL;
4114
                }
4115
            }
4116
        }
4117
 
4118
      local_got = elf_local_got_refcounts (ibfd);
4119
      if (!local_got)
4120
        continue;
4121
 
4122
      symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
4123
      locsymcount = symtab_hdr->sh_info;
4124
      end_local_got = local_got + locsymcount;
4125
      s = htab->sgot;
4126
      srel = htab->srelgot;
4127
      for (; local_got < end_local_got; ++local_got)
4128
        {
4129
          if (*local_got > 0)
4130
            {
4131
              *local_got = s->_raw_size;
4132
              s->_raw_size += 8;
4133
              if (info->shared)
4134
                srel->_raw_size += sizeof (Elf64_External_Rela);
4135
            }
4136
          else
4137
            *local_got = (bfd_vma) -1;
4138
        }
4139
    }
4140
 
4141
  if (!edit_opd (output_bfd, info))
4142
    return false;
4143
 
4144
  /* Allocate global sym .plt and .got entries, and space for global
4145
     sym dynamic relocs.  */
4146
  elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
4147
 
4148
  /* We now have determined the sizes of the various dynamic sections.
4149
     Allocate memory for them.  */
4150
  relocs = false;
4151
  for (s = dynobj->sections; s != NULL; s = s->next)
4152
    {
4153
      if ((s->flags & SEC_LINKER_CREATED) == 0)
4154
        continue;
4155
 
4156
      if (s == htab->sbrlt || s == htab->srelbrlt)
4157
        /* These haven't been allocated yet;  don't strip.  */
4158
        continue;
4159
      else if (s == htab->splt
4160
               || s == htab->sgot
4161
               || s == htab->sglink)
4162
        {
4163
          /* Strip this section if we don't need it; see the
4164
             comment below.  */
4165
        }
4166
      else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
4167
        {
4168
          if (s->_raw_size == 0)
4169
            {
4170
              /* If we don't need this section, strip it from the
4171
                 output file.  This is mostly to handle .rela.bss and
4172
                 .rela.plt.  We must create both sections in
4173
                 create_dynamic_sections, because they must be created
4174
                 before the linker maps input sections to output
4175
                 sections.  The linker does that before
4176
                 adjust_dynamic_symbol is called, and it is that
4177
                 function which decides whether anything needs to go
4178
                 into these sections.  */
4179
            }
4180
          else
4181
            {
4182
              if (s != htab->srelplt)
4183
                relocs = true;
4184
 
4185
              /* We use the reloc_count field as a counter if we need
4186
                 to copy relocs into the output file.  */
4187
              s->reloc_count = 0;
4188
            }
4189
        }
4190
      else
4191
        {
4192
          /* It's not one of our sections, so don't allocate space.  */
4193
          continue;
4194
        }
4195
 
4196
      if (s->_raw_size == 0)
4197
        {
4198
          _bfd_strip_section_from_output (info, s);
4199
          continue;
4200
        }
4201
 
4202
      /* .plt is in the bss section.  We don't initialise it.  */
4203
      if ((s->flags & SEC_LOAD) == 0)
4204
        continue;
4205
 
4206
      /* Allocate memory for the section contents.  We use bfd_zalloc
4207
         here in case unused entries are not reclaimed before the
4208
         section's contents are written out.  This should not happen,
4209
         but this way if it does, we get a R_PPC64_NONE reloc instead
4210
         of garbage.  */
4211
      s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
4212
      if (s->contents == NULL)
4213
        return false;
4214
    }
4215
 
4216
  if (htab->elf.dynamic_sections_created)
4217
    {
4218
      /* Add some entries to the .dynamic section.  We fill in the
4219
         values later, in ppc64_elf_finish_dynamic_sections, but we
4220
         must add the entries now so that we get the correct size for
4221
         the .dynamic section.  The DT_DEBUG entry is filled in by the
4222
         dynamic linker and used by the debugger.  */
4223
#define add_dynamic_entry(TAG, VAL) \
4224
  bfd_elf64_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
4225
 
4226
      if (!info->shared)
4227
        {
4228
          if (!add_dynamic_entry (DT_DEBUG, 0))
4229
            return false;
4230
        }
4231
 
4232
      if (htab->splt != NULL && htab->splt->_raw_size != 0)
4233
        {
4234
          if (!add_dynamic_entry (DT_PLTGOT, 0)
4235
              || !add_dynamic_entry (DT_PLTRELSZ, 0)
4236
              || !add_dynamic_entry (DT_PLTREL, DT_RELA)
4237
              || !add_dynamic_entry (DT_JMPREL, 0)
4238
              || !add_dynamic_entry (DT_PPC64_GLINK, 0))
4239
            return false;
4240
        }
4241
 
4242
      if (NO_OPD_RELOCS)
4243
        {
4244
          if (!add_dynamic_entry (DT_PPC64_OPD, 0)
4245
              || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
4246
            return false;
4247
        }
4248
 
4249
      if (relocs)
4250
        {
4251
          if (!add_dynamic_entry (DT_RELA, 0)
4252
              || !add_dynamic_entry (DT_RELASZ, 0)
4253
              || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
4254
            return false;
4255
 
4256
          /* If any dynamic relocs apply to a read-only section,
4257
             then we need a DT_TEXTREL entry.  */
4258
          if ((info->flags & DF_TEXTREL) == 0)
4259
            elf_link_hash_traverse (&htab->elf, readonly_dynrelocs,
4260
                                    (PTR) info);
4261
 
4262
          if ((info->flags & DF_TEXTREL) != 0)
4263
            {
4264
              if (!add_dynamic_entry (DT_TEXTREL, 0))
4265
                return false;
4266
            }
4267
        }
4268
    }
4269
#undef add_dynamic_entry
4270
 
4271
  return true;
4272
}
4273
 
4274
/* Determine the type of stub needed, if any, for a call.  */
4275
 
4276
static INLINE enum ppc_stub_type
4277
ppc_type_of_stub (input_sec, rel, hash, destination)
4278
     asection *input_sec;
4279
     const Elf_Internal_Rela *rel;
4280
     struct ppc_link_hash_entry **hash;
4281
     bfd_vma destination;
4282
{
4283
  struct ppc_link_hash_entry *h = *hash;
4284
  bfd_vma location;
4285
  bfd_vma branch_offset;
4286
  bfd_vma max_branch_offset;
4287
  unsigned int r_type;
4288
 
4289
  if (h != NULL)
4290
    {
4291
      if (h->oh != NULL
4292
          && h->oh->plt.offset != (bfd_vma) -1
4293
          && h->oh->dynindx != -1)
4294
        {
4295
          *hash = (struct ppc_link_hash_entry *) h->oh;
4296
          return ppc_stub_plt_call;
4297
        }
4298
 
4299
      if (h->elf.root.type == bfd_link_hash_undefweak
4300
          || h->elf.root.type == bfd_link_hash_undefined)
4301
        return ppc_stub_none;
4302
    }
4303
 
4304
  /* Determine where the call point is.  */
4305
  location = (input_sec->output_offset
4306
              + input_sec->output_section->vma
4307
              + rel->r_offset);
4308
 
4309
  branch_offset = destination - location;
4310
  r_type = ELF64_R_TYPE (rel->r_info);
4311
 
4312
  /* Determine if a long branch stub is needed.  */
4313
  max_branch_offset = 1 << 25;
4314
  if (r_type != (unsigned int) R_PPC64_REL24)
4315
    max_branch_offset = 1 << 15;
4316
 
4317
  if (branch_offset + max_branch_offset >= 2 * max_branch_offset)
4318
    /* We need a stub.  Figure out whether a long_branch or plt_branch
4319
       is needed later.  */
4320
    return ppc_stub_long_branch;
4321
 
4322
  return ppc_stub_none;
4323
}
4324
 
4325
/* Build a .plt call stub.  */
4326
 
4327
static bfd_byte *
4328
build_plt_stub (obfd, p, offset, glink)
4329
     bfd *obfd;
4330
     bfd_byte *p;
4331
     int offset;
4332
     int glink;
4333
{
4334
#define PPC_LO(v) ((v) & 0xffff)
4335
#define PPC_HI(v) (((v) >> 16) & 0xffff)
4336
#define PPC_HA(v) PPC_HI ((v) + 0x8000)
4337
 
4338
  if (glink)
4339
    bfd_put_32 (obfd, LD_R2_40R1, p),                   p += 4;
4340
  bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4;
4341
  if (!glink)
4342
    bfd_put_32 (obfd, STD_R2_40R1, p),                  p += 4;
4343
  bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset), p),  p += 4;
4344
  if (PPC_HA (offset + 8) != PPC_HA (offset))
4345
    bfd_put_32 (obfd, ADDIS_R12_R12_1, p),              p += 4;
4346
  offset += 8;
4347
  bfd_put_32 (obfd, LD_R2_0R12 | PPC_LO (offset), p),   p += 4;
4348
  if (PPC_HA (offset + 8) != PPC_HA (offset))
4349
    bfd_put_32 (obfd, ADDIS_R12_R12_1, p),              p += 4;
4350
  offset += 8;
4351
  bfd_put_32 (obfd, MTCTR_R11, p),                      p += 4;
4352
  bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset), p),  p += 4;
4353
  bfd_put_32 (obfd, BCTR, p),                           p += 4;
4354
  return p;
4355
}
4356
 
4357
static boolean
4358
ppc_build_one_stub (gen_entry, in_arg)
4359
     struct bfd_hash_entry *gen_entry;
4360
     PTR in_arg;
4361
{
4362
  struct ppc_stub_hash_entry *stub_entry;
4363
  struct ppc_branch_hash_entry *br_entry;
4364
  struct bfd_link_info *info;
4365
  struct ppc_link_hash_table *htab;
4366
  asection *stub_sec;
4367
  bfd *stub_bfd;
4368
  bfd_byte *loc;
4369
  bfd_byte *p;
4370
  unsigned int indx;
4371
  bfd_vma off;
4372
  int size;
4373
 
4374
  /* Massage our args to the form they really have.  */
4375
  stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
4376
  info = (struct bfd_link_info *) in_arg;
4377
 
4378
  htab = ppc_hash_table (info);
4379
  stub_sec = stub_entry->stub_sec;
4380
 
4381
  /* Make a note of the offset within the stubs for this entry.  */
4382
  stub_entry->stub_offset = stub_sec->_cooked_size;
4383
  loc = stub_sec->contents + stub_entry->stub_offset;
4384
 
4385
  stub_bfd = stub_sec->owner;
4386
 
4387
  switch (stub_entry->stub_type)
4388
    {
4389
    case ppc_stub_long_branch:
4390
      /* Branches are relative.  This is where we are going to.  */
4391
      off = (stub_entry->target_value
4392
             + stub_entry->target_section->output_offset
4393
             + stub_entry->target_section->output_section->vma);
4394
 
4395
      /* And this is where we are coming from.  */
4396
      off -= (stub_entry->stub_offset
4397
              + stub_sec->output_offset
4398
              + stub_sec->output_section->vma);
4399
 
4400
      BFD_ASSERT (off + (1 << 25) < (bfd_vma) (1 << 26));
4401
 
4402
      bfd_put_32 (stub_bfd, (bfd_vma) B_DOT | (off & 0x3fffffc), loc);
4403
      size = 4;
4404
      break;
4405
 
4406
    case ppc_stub_plt_branch:
4407
      br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
4408
                                         stub_entry->root.string + 9,
4409
                                         false, false);
4410
      if (br_entry == NULL)
4411
        {
4412
          (*_bfd_error_handler) (_("can't find branch stub `%s'"),
4413
                                 stub_entry->root.string + 9);
4414
          htab->stub_error = true;
4415
          return false;
4416
        }
4417
 
4418
      off = (stub_entry->target_value
4419
             + stub_entry->target_section->output_offset
4420
             + stub_entry->target_section->output_section->vma);
4421
 
4422
      bfd_put_64 (htab->sbrlt->owner, off,
4423
                  htab->sbrlt->contents + br_entry->offset);
4424
 
4425
      if (info->shared)
4426
        {
4427
          /* Create a reloc for the branch lookup table entry.  */
4428
          Elf_Internal_Rela rela;
4429
          Elf64_External_Rela *r;
4430
 
4431
          rela.r_offset = (br_entry->offset
4432
                           + htab->sbrlt->output_offset
4433
                           + htab->sbrlt->output_section->vma);
4434
          rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
4435
          rela.r_addend = off;
4436
 
4437
          r = (Elf64_External_Rela *) htab->srelbrlt->contents;
4438
          r += htab->srelbrlt->reloc_count++;
4439
          bfd_elf64_swap_reloca_out (htab->srelbrlt->owner, &rela, r);
4440
        }
4441
 
4442
      off = (br_entry->offset
4443
             + htab->sbrlt->output_offset
4444
             + htab->sbrlt->output_section->vma
4445
             - elf_gp (htab->sbrlt->output_section->owner)
4446
             - TOC_BASE_OFF);
4447
 
4448
      if (off + 0x80000000 > 0xffffffff || (off & 7) != 0)
4449
        {
4450
          (*_bfd_error_handler)
4451
            (_("linkage table error against `%s'"),
4452
             stub_entry->root.string);
4453
          bfd_set_error (bfd_error_bad_value);
4454
          htab->stub_error = true;
4455
          return false;
4456
        }
4457
 
4458
      indx = off;
4459
      bfd_put_32 (stub_bfd, (bfd_vma) ADDIS_R12_R2 | PPC_HA (indx), loc);
4460
      bfd_put_32 (stub_bfd, (bfd_vma) LD_R11_0R12 | PPC_LO (indx), loc + 4);
4461
      bfd_put_32 (stub_bfd, (bfd_vma) MTCTR_R11, loc + 8);
4462
      bfd_put_32 (stub_bfd, (bfd_vma) BCTR, loc + 12);
4463
      size = 16;
4464
      break;
4465
 
4466
    case ppc_stub_plt_call:
4467
      /* Build the .glink lazy link call stub.  */
4468
      p = htab->sglink->contents + htab->sglink->_cooked_size;
4469
      indx = htab->sglink->reloc_count;
4470
      if (indx < 0x8000)
4471
        {
4472
          bfd_put_32 (htab->sglink->owner, LI_R0_0 | indx, p);
4473
          p += 4;
4474
        }
4475
      else
4476
        {
4477
          bfd_put_32 (htab->sglink->owner, LIS_R0_0 | PPC_HI (indx), p);
4478
          p += 4;
4479
          bfd_put_32 (htab->sglink->owner, ORI_R0_R0_0 | PPC_LO (indx), p);
4480
          p += 4;
4481
        }
4482
      bfd_put_32 (htab->sglink->owner,
4483
                  B_DOT | ((htab->sglink->contents - p) & 0x3fffffc), p);
4484
      p += 4;
4485
      htab->sglink->_cooked_size = p - htab->sglink->contents;
4486
      htab->sglink->reloc_count += 1;
4487
 
4488
      /* Do the best we can for shared libraries built without
4489
         exporting ".foo" for each "foo".  This can happen when symbol
4490
         versioning scripts strip all bar a subset of symbols.  */
4491
      if (stub_entry->h->oh->root.type != bfd_link_hash_defined
4492
          && stub_entry->h->oh->root.type != bfd_link_hash_defweak)
4493
        {
4494
          /* Point the symbol at the stub.  There may be multiple stubs,
4495
             we don't really care;  The main thing is to make this sym
4496
             defined somewhere.  */
4497
          stub_entry->h->oh->root.type = bfd_link_hash_defined;
4498
          stub_entry->h->oh->root.u.def.section = stub_entry->stub_sec;
4499
          stub_entry->h->oh->root.u.def.value = stub_entry->stub_offset;
4500
        }
4501
 
4502
      /* Now build the stub.  */
4503
      off = stub_entry->h->elf.plt.offset;
4504
      if (off >= (bfd_vma) -2)
4505
        abort ();
4506
 
4507
      off &= ~ (bfd_vma) 1;
4508
      off += (htab->splt->output_offset
4509
              + htab->splt->output_section->vma
4510
              - elf_gp (htab->splt->output_section->owner)
4511
              - TOC_BASE_OFF);
4512
 
4513
      if (off + 0x80000000 > 0xffffffff || (off & 7) != 0)
4514
        {
4515
          (*_bfd_error_handler)
4516
            (_("linkage table error against `%s'"),
4517
             stub_entry->h->elf.root.root.string);
4518
          bfd_set_error (bfd_error_bad_value);
4519
          htab->stub_error = true;
4520
          return false;
4521
        }
4522
 
4523
      p = build_plt_stub (stub_bfd, loc, (int) off, 0);
4524
      size = p - loc;
4525
      break;
4526
 
4527
    default:
4528
      BFD_FAIL ();
4529
      return false;
4530
    }
4531
 
4532
  stub_sec->_cooked_size += size;
4533
  return true;
4534
}
4535
 
4536
/* As above, but don't actually build the stub.  Just bump offset so
4537
   we know stub section sizes, and select plt_branch stubs where
4538
   long_branch stubs won't do.  */
4539
 
4540
static boolean
4541
ppc_size_one_stub (gen_entry, in_arg)
4542
     struct bfd_hash_entry *gen_entry;
4543
     PTR in_arg;
4544
{
4545
  struct ppc_stub_hash_entry *stub_entry;
4546
  struct ppc_link_hash_table *htab;
4547
  bfd_vma off;
4548
  int size;
4549
 
4550
  /* Massage our args to the form they really have.  */
4551
  stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
4552
  htab = (struct ppc_link_hash_table *) in_arg;
4553
 
4554
  if (stub_entry->stub_type == ppc_stub_plt_call)
4555
    {
4556
      off = stub_entry->h->elf.plt.offset & ~(bfd_vma) 1;
4557
      off += (htab->splt->output_offset
4558
              + htab->splt->output_section->vma
4559
              - elf_gp (htab->splt->output_section->owner)
4560
              - TOC_BASE_OFF);
4561
 
4562
      size = 28;
4563
      if (PPC_HA ((int) off + 16) != PPC_HA ((int) off))
4564
        size += 4;
4565
    }
4566
  else
4567
    {
4568
      /* ppc_stub_long_branch or ppc_stub_plt_branch.  */
4569
      stub_entry->stub_type = ppc_stub_long_branch;
4570
      size = 4;
4571
 
4572
      off = (stub_entry->target_value
4573
             + stub_entry->target_section->output_offset
4574
             + stub_entry->target_section->output_section->vma);
4575
      off -= (stub_entry->stub_sec->_raw_size
4576
              + stub_entry->stub_sec->output_offset
4577
              + stub_entry->stub_sec->output_section->vma);
4578
 
4579
      if (off + (1 << 25) >= (bfd_vma) (1 << 26))
4580
        {
4581
          struct ppc_branch_hash_entry *br_entry;
4582
 
4583
          br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
4584
                                             stub_entry->root.string + 9,
4585
                                             true, false);
4586
          if (br_entry == NULL)
4587
            {
4588
              (*_bfd_error_handler) (_("can't build branch stub `%s'"),
4589
                                     stub_entry->root.string + 9);
4590
              htab->stub_error = true;
4591
              return false;
4592
            }
4593
 
4594
          if (br_entry->iter != htab->stub_iteration)
4595
            {
4596
              br_entry->iter = htab->stub_iteration;
4597
              br_entry->offset = htab->sbrlt->_raw_size;
4598
              htab->sbrlt->_raw_size += 8;
4599
            }
4600
          stub_entry->stub_type = ppc_stub_plt_branch;
4601
          size = 16;
4602
        }
4603
    }
4604
 
4605
  stub_entry->stub_sec->_raw_size += size;
4606
  return true;
4607
}
4608
 
4609
/* Set up various things so that we can make a list of input sections
4610
   for each output section included in the link.  Returns -1 on error,
4611
 
4612
 
4613
int
4614
ppc64_elf_setup_section_lists (output_bfd, info)
4615
     bfd *output_bfd;
4616
     struct bfd_link_info *info;
4617
{
4618
  bfd *input_bfd;
4619
  int top_id, top_index;
4620
  asection *section;
4621
  asection **input_list, **list;
4622
  bfd_size_type amt;
4623
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
4624
 
4625
  if (htab->elf.root.creator->flavour != bfd_target_elf_flavour
4626
      || htab->sbrlt == NULL)
4627
    return 0;
4628
 
4629
  /* Find the top input section id.  */
4630
  for (input_bfd = info->input_bfds, top_id = 0;
4631
       input_bfd != NULL;
4632
       input_bfd = input_bfd->link_next)
4633
    {
4634
      for (section = input_bfd->sections;
4635
           section != NULL;
4636
           section = section->next)
4637
        {
4638
          if (top_id < section->id)
4639
            top_id = section->id;
4640
        }
4641
    }
4642
 
4643
  amt = sizeof (struct map_stub) * (top_id + 1);
4644
  htab->stub_group = (struct map_stub *) bfd_zmalloc (amt);
4645
  if (htab->stub_group == NULL)
4646
    return -1;
4647
 
4648
  /* We can't use output_bfd->section_count here to find the top output
4649
     section index as some sections may have been removed, and
4650
     _bfd_strip_section_from_output doesn't renumber the indices.  */
4651
  for (section = output_bfd->sections, top_index = 0;
4652
       section != NULL;
4653
       section = section->next)
4654
    {
4655
      if (top_index < section->index)
4656
        top_index = section->index;
4657
    }
4658
 
4659
  htab->top_index = top_index;
4660
  amt = sizeof (asection *) * (top_index + 1);
4661
  input_list = (asection **) bfd_malloc (amt);
4662
  htab->input_list = input_list;
4663
  if (input_list == NULL)
4664
    return -1;
4665
 
4666
  /* For sections we aren't interested in, mark their entries with a
4667
     value we can check later.  */
4668
  list = input_list + top_index;
4669
  do
4670
    *list = bfd_abs_section_ptr;
4671
  while (list-- != input_list);
4672
 
4673
  for (section = output_bfd->sections;
4674
       section != NULL;
4675
       section = section->next)
4676
    {
4677
      if ((section->flags & SEC_CODE) != 0)
4678
        input_list[section->index] = NULL;
4679
    }
4680
 
4681
  return 1;
4682
}
4683
 
4684
/* The linker repeatedly calls this function for each input section,
4685
   in the order that input sections are linked into output sections.
4686
   Build lists of input sections to determine groupings between which
4687
   we may insert linker stubs.  */
4688
 
4689
void
4690
ppc64_elf_next_input_section (info, isec)
4691
     struct bfd_link_info *info;
4692
     asection *isec;
4693
{
4694
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
4695
 
4696
  if (isec->output_section->index <= htab->top_index)
4697
    {
4698
      asection **list = htab->input_list + isec->output_section->index;
4699
      if (*list != bfd_abs_section_ptr)
4700
        {
4701
          /* Steal the link_sec pointer for our list.  */
4702
#define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
4703
          /* This happens to make the list in reverse order,
4704
             which is what we want.  */
4705
          PREV_SEC (isec) = *list;
4706
          *list = isec;
4707
        }
4708
    }
4709
}
4710
 
4711
/* See whether we can group stub sections together.  Grouping stub
4712
   sections may result in fewer stubs.  More importantly, we need to
4713
   put all .init* and .fini* stubs at the beginning of the .init or
4714
   .fini output sections respectively, because glibc splits the
4715
   _init and _fini functions into multiple parts.  Putting a stub in
4716
   the middle of a function is not a good idea.  */
4717
 
4718
static void
4719
group_sections (htab, stub_group_size, stubs_always_before_branch)
4720
     struct ppc_link_hash_table *htab;
4721
     bfd_size_type stub_group_size;
4722
     boolean stubs_always_before_branch;
4723
{
4724
  asection **list = htab->input_list + htab->top_index;
4725
  do
4726
    {
4727
      asection *tail = *list;
4728
      if (tail == bfd_abs_section_ptr)
4729
        continue;
4730
      while (tail != NULL)
4731
        {
4732
          asection *curr;
4733
          asection *prev;
4734
          bfd_size_type total;
4735
 
4736
          curr = tail;
4737
          if (tail->_cooked_size)
4738
            total = tail->_cooked_size;
4739
          else
4740
            total = tail->_raw_size;
4741
          while ((prev = PREV_SEC (curr)) != NULL
4742
                 && ((total += curr->output_offset - prev->output_offset)
4743
                     < stub_group_size))
4744
            curr = prev;
4745
 
4746
          /* OK, the size from the start of CURR to the end is less
4747
             than stub_group_size and thus can be handled by one stub
4748
             section.  (or the tail section is itself larger than
4749
             stub_group_size, in which case we may be toast.)  We
4750
             should really be keeping track of the total size of stubs
4751
             added here, as stubs contribute to the final output
4752
             section size.  That's a little tricky, and this way will
4753
             only break if stubs added make the total size more than
4754
             2^25, ie. for the default stub_group_size, if stubs total
4755
             more than 2834432 bytes, or over 100000 plt call stubs.  */
4756
          do
4757
            {
4758
              prev = PREV_SEC (tail);
4759
              /* Set up this stub group.  */
4760
              htab->stub_group[tail->id].link_sec = curr;
4761
            }
4762
          while (tail != curr && (tail = prev) != NULL);
4763
 
4764
          /* But wait, there's more!  Input sections up to stub_group_size
4765
             bytes before the stub section can be handled by it too.  */
4766
          if (!stubs_always_before_branch)
4767
            {
4768
              total = 0;
4769
              while (prev != NULL
4770
                     && ((total += tail->output_offset - prev->output_offset)
4771
                         < stub_group_size))
4772
                {
4773
                  tail = prev;
4774
                  prev = PREV_SEC (tail);
4775
                  htab->stub_group[tail->id].link_sec = curr;
4776
                }
4777
            }
4778
          tail = prev;
4779
        }
4780
    }
4781
  while (list-- != htab->input_list);
4782
  free (htab->input_list);
4783
#undef PREV_SEC
4784
}
4785
 
4786
/* Determine and set the size of the stub section for a final link.
4787
 
4788
   The basic idea here is to examine all the relocations looking for
4789
   PC-relative calls to a target that is unreachable with a "bl"
4790
   instruction.  */
4791
 
4792
boolean
4793
ppc64_elf_size_stubs (output_bfd, stub_bfd, info, group_size,
4794
                      add_stub_section, layout_sections_again)
4795
     bfd *output_bfd;
4796
     bfd *stub_bfd;
4797
     struct bfd_link_info *info;
4798
     bfd_signed_vma group_size;
4799
     asection * (*add_stub_section) PARAMS ((const char *, asection *));
4800
     void (*layout_sections_again) PARAMS ((void));
4801
{
4802
  bfd_size_type stub_group_size;
4803
  boolean stubs_always_before_branch;
4804
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
4805
 
4806
  /* Stash our params away.  */
4807
  htab->stub_bfd = stub_bfd;
4808
  htab->add_stub_section = add_stub_section;
4809
  htab->layout_sections_again = layout_sections_again;
4810
  stubs_always_before_branch = group_size < 0;
4811
  if (group_size < 0)
4812
    stub_group_size = -group_size;
4813
  else
4814
    stub_group_size = group_size;
4815
  if (stub_group_size == 1)
4816
    {
4817
      /* Default values.  */
4818
      stub_group_size = 30720000;
4819
      if (htab->has_14bit_branch)
4820
        stub_group_size = 30000;
4821
    }
4822
 
4823
  group_sections (htab, stub_group_size, stubs_always_before_branch);
4824
 
4825
  while (1)
4826
    {
4827
      bfd *input_bfd;
4828
      unsigned int bfd_indx;
4829
      asection *stub_sec;
4830
      boolean stub_changed;
4831
 
4832
      htab->stub_iteration += 1;
4833
      stub_changed = false;
4834
 
4835
      for (input_bfd = info->input_bfds, bfd_indx = 0;
4836
           input_bfd != NULL;
4837
           input_bfd = input_bfd->link_next, bfd_indx++)
4838
        {
4839
          Elf_Internal_Shdr *symtab_hdr;
4840
          asection *section;
4841
          Elf_Internal_Sym *local_syms = NULL;
4842
 
4843
          /* We'll need the symbol table in a second.  */
4844
          symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4845
          if (symtab_hdr->sh_info == 0)
4846
            continue;
4847
 
4848
          /* Walk over each section attached to the input bfd.  */
4849
          for (section = input_bfd->sections;
4850
               section != NULL;
4851
               section = section->next)
4852
            {
4853
              Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
4854
 
4855
              /* If there aren't any relocs, then there's nothing more
4856
                 to do.  */
4857
              if ((section->flags & SEC_RELOC) == 0
4858
                  || section->reloc_count == 0)
4859
                continue;
4860
 
4861
              /* If this section is a link-once section that will be
4862
                 discarded, then don't create any stubs.  */
4863
              if (section->output_section == NULL
4864
                  || section->output_section->owner != output_bfd)
4865
                continue;
4866
 
4867
              /* Get the relocs.  */
4868
              internal_relocs
4869
                = _bfd_elf64_link_read_relocs (input_bfd, section, NULL,
4870
                                               (Elf_Internal_Rela *) NULL,
4871
                                               info->keep_memory);
4872
              if (internal_relocs == NULL)
4873
                goto error_ret_free_local;
4874
 
4875
              /* Now examine each relocation.  */
4876
              irela = internal_relocs;
4877
              irelaend = irela + section->reloc_count;
4878
              for (; irela < irelaend; irela++)
4879
                {
4880
                  unsigned int r_type, r_indx;
4881
                  enum ppc_stub_type stub_type;
4882
                  struct ppc_stub_hash_entry *stub_entry;
4883
                  asection *sym_sec;
4884
                  bfd_vma sym_value;
4885
                  bfd_vma destination;
4886
                  struct ppc_link_hash_entry *hash;
4887
                  char *stub_name;
4888
                  const asection *id_sec;
4889
 
4890
                  r_type = ELF64_R_TYPE (irela->r_info);
4891
                  r_indx = ELF64_R_SYM (irela->r_info);
4892
 
4893
                  if (r_type >= (unsigned int) R_PPC_max)
4894
                    {
4895
                      bfd_set_error (bfd_error_bad_value);
4896
                      goto error_ret_free_internal;
4897
                    }
4898
 
4899
                  /* Only look for stubs on branch instructions.  */
4900
                  if (r_type != (unsigned int) R_PPC64_REL24
4901
                      && r_type != (unsigned int) R_PPC64_REL14
4902
                      && r_type != (unsigned int) R_PPC64_REL14_BRTAKEN
4903
                      && r_type != (unsigned int) R_PPC64_REL14_BRNTAKEN)
4904
                    continue;
4905
 
4906
                  /* Now determine the call target, its name, value,
4907
                     section.  */
4908
                  sym_sec = NULL;
4909
                  sym_value = 0;
4910
                  destination = 0;
4911
                  hash = NULL;
4912
                  if (r_indx < symtab_hdr->sh_info)
4913
                    {
4914
                      /* It's a local symbol.  */
4915
                      Elf_Internal_Sym *sym;
4916
                      Elf_Internal_Shdr *hdr;
4917
 
4918
                      if (local_syms == NULL)
4919
                        {
4920
                          local_syms
4921
                            = (Elf_Internal_Sym *) symtab_hdr->contents;
4922
                          if (local_syms == NULL)
4923
                            local_syms
4924
                              = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
4925
                                                      symtab_hdr->sh_info, 0,
4926
                                                      NULL, NULL, NULL);
4927
                          if (local_syms == NULL)
4928
                            goto error_ret_free_internal;
4929
                        }
4930
                      sym = local_syms + r_indx;
4931
                      hdr = elf_elfsections (input_bfd)[sym->st_shndx];
4932
                      sym_sec = hdr->bfd_section;
4933
                      if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
4934
                        sym_value = sym->st_value;
4935
                      destination = (sym_value + irela->r_addend
4936
                                     + sym_sec->output_offset
4937
                                     + sym_sec->output_section->vma);
4938
                    }
4939
                  else
4940
                    {
4941
                      /* It's an external symbol.  */
4942
                      int e_indx;
4943
 
4944
                      e_indx = r_indx - symtab_hdr->sh_info;
4945
                      hash = ((struct ppc_link_hash_entry *)
4946
                              elf_sym_hashes (input_bfd)[e_indx]);
4947
 
4948
                      while (hash->elf.root.type == bfd_link_hash_indirect
4949
                             || hash->elf.root.type == bfd_link_hash_warning)
4950
                        hash = ((struct ppc_link_hash_entry *)
4951
                                hash->elf.root.u.i.link);
4952
 
4953
                      if (hash->elf.root.type == bfd_link_hash_defined
4954
                          || hash->elf.root.type == bfd_link_hash_defweak)
4955
                        {
4956
                          sym_sec = hash->elf.root.u.def.section;
4957
                          sym_value = hash->elf.root.u.def.value;
4958
                          if (sym_sec->output_section != NULL)
4959
                            destination = (sym_value + irela->r_addend
4960
                                           + sym_sec->output_offset
4961
                                           + sym_sec->output_section->vma);
4962
                        }
4963
                      else if (hash->elf.root.type == bfd_link_hash_undefweak)
4964
                        ;
4965
                      else if (hash->elf.root.type == bfd_link_hash_undefined)
4966
                        ;
4967
                      else
4968
                        {
4969
                          bfd_set_error (bfd_error_bad_value);
4970
                          goto error_ret_free_internal;
4971
                        }
4972
                    }
4973
 
4974
                  /* Determine what (if any) linker stub is needed.  */
4975
                  stub_type = ppc_type_of_stub (section, irela, &hash,
4976
                                                destination);
4977
                  if (stub_type == ppc_stub_none)
4978
                    continue;
4979
 
4980
                  /* Support for grouping stub sections.  */
4981
                  id_sec = htab->stub_group[section->id].link_sec;
4982
 
4983
                  /* Get the name of this stub.  */
4984
                  stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
4985
                  if (!stub_name)
4986
                    goto error_ret_free_internal;
4987
 
4988
                  stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
4989
                                                     stub_name, false, false);
4990
                  if (stub_entry != NULL)
4991
                    {
4992
                      /* The proper stub has already been created.  */
4993
                      free (stub_name);
4994
                      continue;
4995
                    }
4996
 
4997
                  stub_entry = ppc_add_stub (stub_name, section, htab);
4998
                  if (stub_entry == NULL)
4999
                    {
5000
                      free (stub_name);
5001
                    error_ret_free_internal:
5002
                      if (elf_section_data (section)->relocs == NULL)
5003
                        free (internal_relocs);
5004
                    error_ret_free_local:
5005
                      if (local_syms != NULL
5006
                          && (symtab_hdr->contents
5007
                              != (unsigned char *) local_syms))
5008
                        free (local_syms);
5009
                      return false;
5010
                    }
5011
 
5012
                  stub_entry->target_value = sym_value;
5013
                  stub_entry->target_section = sym_sec;
5014
                  stub_entry->stub_type = stub_type;
5015
                  stub_entry->h = hash;
5016
                  stub_changed = true;
5017
                }
5018
 
5019
              /* We're done with the internal relocs, free them.  */
5020
              if (elf_section_data (section)->relocs != internal_relocs)
5021
                free (internal_relocs);
5022
            }
5023
 
5024
          if (local_syms != NULL
5025
              && symtab_hdr->contents != (unsigned char *) local_syms)
5026
            {
5027
              if (!info->keep_memory)
5028
                free (local_syms);
5029
              else
5030
                symtab_hdr->contents = (unsigned char *) local_syms;
5031
            }
5032
        }
5033
 
5034
      if (!stub_changed)
5035
        break;
5036
 
5037
      /* OK, we've added some stubs.  Find out the new size of the
5038
         stub sections.  */
5039
      for (stub_sec = htab->stub_bfd->sections;
5040
           stub_sec != NULL;
5041
           stub_sec = stub_sec->next)
5042
        {
5043
          stub_sec->_raw_size = 0;
5044
          stub_sec->_cooked_size = 0;
5045
        }
5046
      htab->sbrlt->_raw_size = 0;
5047
      htab->sbrlt->_cooked_size = 0;
5048
 
5049
      bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, htab);
5050
 
5051
      /* Ask the linker to do its stuff.  */
5052
      (*htab->layout_sections_again) ();
5053
    }
5054
 
5055
  /* It would be nice to strip .branch_lt from the output if the
5056
     section is empty, but it's too late.  If we strip sections here,
5057
     the dynamic symbol table is corrupted since the section symbol
5058
     for the stripped section isn't written.  */
5059
 
5060
  return true;
5061
}
5062
 
5063
/* Called after we have determined section placement.  If sections
5064
   move, we'll be called again.  Provide a value for TOCstart.  */
5065
 
5066
bfd_vma
5067
ppc64_elf_toc (obfd)
5068
     bfd *obfd;
5069
{
5070
  asection *s;
5071
  bfd_vma TOCstart;
5072
 
5073
  /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
5074
     order.  The TOC starts where the first of these sections starts.  */
5075
  s = bfd_get_section_by_name (obfd, ".got");
5076
  if (s == NULL)
5077
    s = bfd_get_section_by_name (obfd, ".toc");
5078
  if (s == NULL)
5079
    s = bfd_get_section_by_name (obfd, ".tocbss");
5080
  if (s == NULL)
5081
    s = bfd_get_section_by_name (obfd, ".plt");
5082
  if (s == NULL)
5083
    {
5084
      /* This may happen for
5085
         o  references to TOC base (SYM@toc / TOC[tc0]) without a
5086
         .toc directive
5087
         o  bad linker script
5088
         o --gc-sections and empty TOC sections
5089
 
5090
         FIXME: Warn user?  */
5091
 
5092
      /* Look for a likely section.  We probably won't even be
5093
         using TOCstart.  */
5094
      for (s = obfd->sections; s != NULL; s = s->next)
5095
        if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY))
5096
            == (SEC_ALLOC | SEC_SMALL_DATA))
5097
          break;
5098
      if (s == NULL)
5099
        for (s = obfd->sections; s != NULL; s = s->next)
5100
          if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA))
5101
              == (SEC_ALLOC | SEC_SMALL_DATA))
5102
            break;
5103
      if (s == NULL)
5104
        for (s = obfd->sections; s != NULL; s = s->next)
5105
          if ((s->flags & (SEC_ALLOC | SEC_READONLY)) == SEC_ALLOC)
5106
            break;
5107
      if (s == NULL)
5108
        for (s = obfd->sections; s != NULL; s = s->next)
5109
          if ((s->flags & SEC_ALLOC) == SEC_ALLOC)
5110
            break;
5111
    }
5112
 
5113
  TOCstart = 0;
5114
  if (s != NULL)
5115
    TOCstart = s->output_section->vma + s->output_offset;
5116
 
5117
  return TOCstart;
5118
}
5119
 
5120
/* Build all the stubs associated with the current output file.
5121
   The stubs are kept in a hash table attached to the main linker
5122
   hash table.  This function is called via gldelf64ppc_finish.  */
5123
 
5124
boolean
5125
ppc64_elf_build_stubs (info)
5126
     struct bfd_link_info *info;
5127
{
5128
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
5129
  asection *stub_sec;
5130
  bfd_vma plt_r2;
5131
  bfd_byte *p;
5132
 
5133
  for (stub_sec = htab->stub_bfd->sections;
5134
       stub_sec != NULL;
5135
       stub_sec = stub_sec->next)
5136
    {
5137
      bfd_size_type size;
5138
 
5139
      /* Allocate memory to hold the linker stubs.  */
5140
      size = stub_sec->_raw_size;
5141
      if (size != 0)
5142
        {
5143
          stub_sec->contents = (bfd_byte *) bfd_zalloc (htab->stub_bfd, size);
5144
          if (stub_sec->contents == NULL)
5145
            return false;
5146
        }
5147
      stub_sec->_cooked_size = 0;
5148
    }
5149
 
5150
  if (htab->splt != NULL)
5151
    {
5152
      /* Build the .glink plt call stub.  */
5153
      plt_r2 = (htab->splt->output_offset
5154
                + htab->splt->output_section->vma
5155
                - elf_gp (htab->splt->output_section->owner)
5156
                - TOC_BASE_OFF);
5157
      p = htab->sglink->contents;
5158
      p = build_plt_stub (htab->sglink->owner, p, (int) plt_r2, 1);
5159
      while (p - htab->sglink->contents < GLINK_CALL_STUB_SIZE)
5160
        {
5161
          bfd_put_32 (htab->sglink->owner, NOP, p);
5162
          p += 4;
5163
        }
5164
      htab->sglink->_cooked_size = p - htab->sglink->contents;
5165
 
5166
      /* Use reloc_count to count entries.  */
5167
      htab->sglink->reloc_count = 0;
5168
    }
5169
 
5170
  if (htab->sbrlt->_raw_size != 0)
5171
    {
5172
      htab->sbrlt->contents = (bfd_byte *) bfd_zalloc (htab->sbrlt->owner,
5173
                                                       htab->sbrlt->_raw_size);
5174
      if (htab->sbrlt->contents == NULL)
5175
        return false;
5176
    }
5177
 
5178
  /* Build the stubs as directed by the stub hash table.  */
5179
  bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
5180
  htab->sglink->reloc_count = 0;
5181
 
5182
  for (stub_sec = htab->stub_bfd->sections;
5183
       stub_sec != NULL;
5184
       stub_sec = stub_sec->next)
5185
    {
5186
      if (stub_sec->_raw_size != stub_sec->_cooked_size)
5187
        break;
5188
    }
5189
 
5190
  if (stub_sec != NULL
5191
      || htab->sglink->_raw_size != htab->sglink->_cooked_size)
5192
    {
5193
      htab->stub_error = true;
5194
      (*_bfd_error_handler) (_("stubs don't match calculated size"));
5195
    }
5196
 
5197
  return !htab->stub_error;
5198
}
5199
 
5200
/* The RELOCATE_SECTION function is called by the ELF backend linker
5201
   to handle the relocations for a section.
5202
 
5203
   The relocs are always passed as Rela structures; if the section
5204
   actually uses Rel structures, the r_addend field will always be
5205
   zero.
5206
 
5207
   This function is responsible for adjust the section contents as
5208
   necessary, and (if using Rela relocs and generating a
5209
   relocateable output file) adjusting the reloc addend as
5210
   necessary.
5211
 
5212
   This function does not have to worry about setting the reloc
5213
   address or the reloc symbol index.
5214
 
5215
   LOCAL_SYMS is a pointer to the swapped in local symbols.
5216
 
5217
   LOCAL_SECTIONS is an array giving the section in the input file
5218
   corresponding to the st_shndx field of each local symbol.
5219
 
5220
   The global hash table entry for the global symbols can be found
5221
   via elf_sym_hashes (input_bfd).
5222
 
5223
   When generating relocateable output, this function must handle
5224
   STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
5225
   going to be the section symbol corresponding to the output
5226
   section, which means that the addend must be adjusted
5227
   accordingly.  */
5228
 
5229
static boolean
5230
ppc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
5231
                            contents, relocs, local_syms, local_sections)
5232
     bfd *output_bfd;
5233
     struct bfd_link_info *info;
5234
     bfd *input_bfd;
5235
     asection *input_section;
5236
     bfd_byte *contents;
5237
     Elf_Internal_Rela *relocs;
5238
     Elf_Internal_Sym *local_syms;
5239
     asection **local_sections;
5240
{
5241
  struct ppc_link_hash_table *htab;
5242
  Elf_Internal_Shdr *symtab_hdr;
5243
  struct elf_link_hash_entry **sym_hashes;
5244
  Elf_Internal_Rela *rel;
5245
  Elf_Internal_Rela *relend;
5246
  bfd_vma *local_got_offsets;
5247
  bfd_vma TOCstart;
5248
  boolean ret = true;
5249
  boolean is_opd;
5250
  /* Disabled until we sort out how ld should choose 'y' vs 'at'.  */
5251
  boolean is_power4 = false;
5252
 
5253
  if (info->relocateable)
5254
    return true;
5255
 
5256
  /* Initialize howto table if needed.  */
5257
  if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5258
    ppc_howto_init ();
5259
 
5260
  htab = ppc_hash_table (info);
5261
  local_got_offsets = elf_local_got_offsets (input_bfd);
5262
  TOCstart = elf_gp (output_bfd);
5263
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5264
  sym_hashes = elf_sym_hashes (input_bfd);
5265
  is_opd = elf_section_data (input_section)->tdata != NULL;
5266
 
5267
  rel = relocs;
5268
  relend = relocs + input_section->reloc_count;
5269
  for (; rel < relend; rel++)
5270
    {
5271
      enum elf_ppc_reloc_type r_type;
5272
      bfd_vma offset;
5273
      bfd_vma addend;
5274
      bfd_reloc_status_type r;
5275
      Elf_Internal_Sym *sym;
5276
      asection *sec;
5277
      struct elf_link_hash_entry *h;
5278
      struct elf_link_hash_entry *fdh;
5279
      const char *sym_name;
5280
      unsigned long r_symndx;
5281
      bfd_vma relocation;
5282
      boolean unresolved_reloc;
5283
      boolean warned;
5284
      long insn;
5285
      struct ppc_stub_hash_entry *stub_entry;
5286
      bfd_vma max_br_offset;
5287
      bfd_vma from;
5288
 
5289
      r_type = (enum elf_ppc_reloc_type) ELF64_R_TYPE (rel->r_info);
5290
      r_symndx = ELF64_R_SYM (rel->r_info);
5291
      offset = rel->r_offset;
5292
      addend = rel->r_addend;
5293
      r = bfd_reloc_other;
5294
      sym = (Elf_Internal_Sym *) 0;
5295
      sec = (asection *) 0;
5296
      h = (struct elf_link_hash_entry *) 0;
5297
      sym_name = (const char *) 0;
5298
      unresolved_reloc = false;
5299
      warned = false;
5300
 
5301
      if (r_type == R_PPC64_TOC)
5302
        {
5303
          /* Relocation value is TOC base.  Symbol is ignored.  */
5304
          relocation = TOCstart + TOC_BASE_OFF;
5305
        }
5306
      else if (r_symndx < symtab_hdr->sh_info)
5307
        {
5308
          /* It's a local symbol.  */
5309
          sym = local_syms + r_symndx;
5310
          sec = local_sections[r_symndx];
5311
          sym_name = "<local symbol>";
5312
 
5313
          relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
5314
          /* rel may have changed, update our copy of addend.  */
5315
          addend = rel->r_addend;
5316
 
5317
          if (elf_section_data (sec) != NULL)
5318
            {
5319
              long *opd_sym_adjust;
5320
 
5321
              opd_sym_adjust = (long *) elf_section_data (sec)->tdata;
5322
              if (opd_sym_adjust != NULL && sym->st_value % 24 == 0)
5323
                relocation += opd_sym_adjust[sym->st_value / 24];
5324
            }
5325
        }
5326
      else
5327
        {
5328
          /* It's a global symbol.  */
5329
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5330
          while (h->root.type == bfd_link_hash_indirect
5331
                 || h->root.type == bfd_link_hash_warning)
5332
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
5333
          sym_name = h->root.root.string;
5334
          relocation = 0;
5335
          if (h->root.type == bfd_link_hash_defined
5336
              || h->root.type == bfd_link_hash_defweak)
5337
            {
5338
              sec = h->root.u.def.section;
5339
              if (sec->output_section == NULL)
5340
                /* Set a flag that will be cleared later if we find a
5341
                   relocation value for this symbol.  output_section
5342
                   is typically NULL for symbols satisfied by a shared
5343
                   library.  */
5344
                unresolved_reloc = true;
5345
              else
5346
                relocation = (h->root.u.def.value
5347
                              + sec->output_section->vma
5348
                              + sec->output_offset);
5349
            }
5350
          else if (h->root.type == bfd_link_hash_undefweak)
5351
            ;
5352
          else if (info->shared
5353
                   && (!info->symbolic || info->allow_shlib_undefined)
5354
                   && !info->no_undefined
5355
                   && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
5356
            ;
5357
          else
5358
            {
5359
              if (! ((*info->callbacks->undefined_symbol)
5360
                     (info, h->root.root.string, input_bfd, input_section,
5361
                      offset, (!info->shared
5362
                               || info->no_undefined
5363
                               || ELF_ST_VISIBILITY (h->other)))))
5364
                return false;
5365
              warned = true;
5366
            }
5367
        }
5368
 
5369
      /* First handle relocations that tweak non-addend part of insn.  */
5370
      insn = 0;
5371
      switch (r_type)
5372
        {
5373
        default:
5374
          break;
5375
 
5376
          /* Branch taken prediction relocations.  */
5377
        case R_PPC64_ADDR14_BRTAKEN:
5378
        case R_PPC64_REL14_BRTAKEN:
5379
          insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field.  */
5380
          /* Fall thru.  */
5381
 
5382
          /* Branch not taken prediction relocations.  */
5383
        case R_PPC64_ADDR14_BRNTAKEN:
5384
        case R_PPC64_REL14_BRNTAKEN:
5385
          insn |= bfd_get_32 (output_bfd, contents + offset) & ~(0x01 << 21);
5386
          if (is_power4)
5387
            {
5388
              /* Set 'a' bit.  This is 0b00010 in BO field for branch
5389
                 on CR(BI) insns (BO == 001at or 011at), and 0b01000
5390
                 for branch on CTR insns (BO == 1a00t or 1a01t).  */
5391
              if ((insn & (0x14 << 21)) == (0x04 << 21))
5392
                insn |= 0x02 << 21;
5393
              else if ((insn & (0x14 << 21)) == (0x10 << 21))
5394
                insn |= 0x08 << 21;
5395
              else
5396
                break;
5397
            }
5398
          else
5399
            {
5400
              from = (offset
5401
                      + input_section->output_offset
5402
                      + input_section->output_section->vma);
5403
 
5404
              /* Invert 'y' bit if not the default.  */
5405
              if ((bfd_signed_vma) (relocation + addend - from) < 0)
5406
                insn ^= 0x01 << 21;
5407
            }
5408
 
5409
          bfd_put_32 (output_bfd, (bfd_vma) insn, contents + offset);
5410
          break;
5411
 
5412
        case R_PPC64_REL24:
5413
          /* A REL24 branching to a linkage function is followed by a
5414
             nop.  We replace the nop with a ld in order to restore
5415
             the TOC base pointer.  Only calls to shared objects need
5416
             to alter the TOC base.  These are recognized by their
5417
             need for a PLT entry.  */
5418
          if (h != NULL
5419
              && (fdh = ((struct ppc_link_hash_entry *) h)->oh) != NULL
5420
              && fdh->plt.offset != (bfd_vma) -1
5421
              && (stub_entry = ppc_get_stub_entry (input_section, sec, fdh,
5422
                                                   rel, htab)) != NULL)
5423
            {
5424
              boolean can_plt_call = 0;
5425
 
5426
              if (offset + 8 <= input_section->_cooked_size)
5427
                {
5428
                  insn = bfd_get_32 (input_bfd, contents + offset + 4);
5429
                  if (insn == NOP
5430
                      || insn == CROR_151515 || insn == CROR_313131)
5431
                    {
5432
                      bfd_put_32 (input_bfd, (bfd_vma) LD_R2_40R1,
5433
                                  contents + offset + 4);
5434
                      can_plt_call = 1;
5435
                    }
5436
                }
5437
 
5438
              if (!can_plt_call)
5439
                {
5440
                  /* If this is a plain branch rather than a branch
5441
                     and link, don't require a nop.  */
5442
                  insn = bfd_get_32 (input_bfd, contents + offset);
5443
                  if ((insn & 1) == 0)
5444
                    can_plt_call = 1;
5445
                }
5446
 
5447
              if (can_plt_call)
5448
                {
5449
                  relocation = (stub_entry->stub_offset
5450
                                + stub_entry->stub_sec->output_offset
5451
                                + stub_entry->stub_sec->output_section->vma);
5452
                  addend = 0;
5453
                  unresolved_reloc = false;
5454
                }
5455
            }
5456
 
5457
          if (h != NULL
5458
              && h->root.type == bfd_link_hash_undefweak
5459
              && relocation == 0
5460
              && addend == 0)
5461
            {
5462
              /* Tweak calls to undefined weak functions to point at a
5463
                 blr.  We can thus call a weak function without first
5464
                 checking whether the function is defined.  We have a
5465
                 blr at the end of .sfpr.  */
5466
              BFD_ASSERT (htab->sfpr->_raw_size != 0);
5467
              relocation = (htab->sfpr->_raw_size - 4
5468
                            + htab->sfpr->output_offset
5469
                            + htab->sfpr->output_section->vma);
5470
              from = (offset
5471
                      + input_section->output_offset
5472
                      + input_section->output_section->vma);
5473
 
5474
              /* But let's not be silly about it.  If the blr isn't in
5475
                 reach, just go to the next instruction.  */
5476
              if (relocation - from + (1 << 25) >= (1 << 26)
5477
                  || htab->sfpr->_raw_size == 0)
5478
                relocation = from + 4;
5479
            }
5480
          break;
5481
        }
5482
 
5483
      /* Set `addend'.  */
5484
      switch (r_type)
5485
        {
5486
        default:
5487
          (*_bfd_error_handler)
5488
            (_("%s: unknown relocation type %d for symbol %s"),
5489
             bfd_archive_filename (input_bfd), (int) r_type, sym_name);
5490
 
5491
          bfd_set_error (bfd_error_bad_value);
5492
          ret = false;
5493
          continue;
5494
 
5495
        case R_PPC64_NONE:
5496
        case R_PPC_GNU_VTINHERIT:
5497
        case R_PPC_GNU_VTENTRY:
5498
          continue;
5499
 
5500
          /* GOT16 relocations.  Like an ADDR16 using the symbol's
5501
             address in the GOT as relocation value instead of the
5502
             symbols value itself.  Also, create a GOT entry for the
5503
             symbol and put the symbol value there.  */
5504
        case R_PPC64_GOT16:
5505
        case R_PPC64_GOT16_LO:
5506
        case R_PPC64_GOT16_HI:
5507
        case R_PPC64_GOT16_HA:
5508
        case R_PPC64_GOT16_DS:
5509
        case R_PPC64_GOT16_LO_DS:
5510
          {
5511
            /* Relocation is to the entry for this symbol in the global
5512
               offset table.  */
5513
            bfd_vma off;
5514
 
5515
            if (htab->sgot == NULL)
5516
              abort ();
5517
 
5518
            if (h != NULL)
5519
              {
5520
                boolean dyn;
5521
 
5522
                off = h->got.offset;
5523
                dyn = htab->elf.dynamic_sections_created;
5524
                if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h)
5525
                    || (info->shared
5526
                        && (info->symbolic
5527
                            || h->dynindx == -1
5528
                            || (h->elf_link_hash_flags
5529
                                & ELF_LINK_FORCED_LOCAL))
5530
                        && (h->elf_link_hash_flags
5531
                            & ELF_LINK_HASH_DEF_REGULAR)))
5532
                  {
5533
                    /* This is actually a static link, or it is a
5534
                       -Bsymbolic link and the symbol is defined
5535
                       locally, or the symbol was forced to be local
5536
                       because of a version file.  We must initialize
5537
                       this entry in the global offset table.  Since the
5538
                       offset must always be a multiple of 8, we use the
5539
                       least significant bit to record whether we have
5540
                       initialized it already.
5541
 
5542
                       When doing a dynamic link, we create a .rel.got
5543
                       relocation entry to initialize the value.  This
5544
                       is done in the finish_dynamic_symbol routine.  */
5545
                    if ((off & 1) != 0)
5546
                      off &= ~1;
5547
                    else
5548
                      {
5549
                        bfd_put_64 (output_bfd, relocation,
5550
                                    htab->sgot->contents + off);
5551
                        h->got.offset |= 1;
5552
                      }
5553
                  }
5554
                else
5555
                  unresolved_reloc = false;
5556
              }
5557
            else
5558
              {
5559
                if (local_got_offsets == NULL)
5560
                  abort ();
5561
 
5562
                off = local_got_offsets[r_symndx];
5563
 
5564
                /* The offset must always be a multiple of 8.  We use
5565
                   the least significant bit to record whether we have
5566
                   already processed this entry.  */
5567
                if ((off & 1) != 0)
5568
                  off &= ~1;
5569
                else
5570
                  {
5571
                    bfd_put_64 (output_bfd, relocation,
5572
                                htab->sgot->contents + off);
5573
 
5574
                    if (info->shared)
5575
                      {
5576
                        Elf_Internal_Rela outrel;
5577
                        Elf64_External_Rela *loc;
5578
 
5579
                        /* We need to generate a R_PPC64_RELATIVE reloc
5580
                           for the dynamic linker.  */
5581
                        outrel.r_offset = (htab->sgot->output_section->vma
5582
                                           + htab->sgot->output_offset
5583
                                           + off);
5584
                        outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
5585
                        outrel.r_addend = relocation;
5586
                        loc = (Elf64_External_Rela *) htab->srelgot->contents;
5587
                        loc += htab->srelgot->reloc_count++;
5588
                        bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
5589
                      }
5590
 
5591
                    local_got_offsets[r_symndx] |= 1;
5592
                  }
5593
              }
5594
 
5595
            if (off >= (bfd_vma) -2)
5596
              abort ();
5597
 
5598
            relocation = htab->sgot->output_offset + off;
5599
 
5600
            /* TOC base (r2) is TOC start plus 0x8000.  */
5601
            addend -= TOC_BASE_OFF;
5602
          }
5603
          break;
5604
 
5605
        case R_PPC64_PLT16_HA:
5606
        case R_PPC64_PLT16_HI:
5607
        case R_PPC64_PLT16_LO:
5608
        case R_PPC64_PLT32:
5609
        case R_PPC64_PLT64:
5610
          /* Relocation is to the entry for this symbol in the
5611
             procedure linkage table.  */
5612
 
5613
          /* Resolve a PLT reloc against a local symbol directly,
5614
             without using the procedure linkage table.  */
5615
          if (h == NULL)
5616
            break;
5617
 
5618
          if (h->plt.offset == (bfd_vma) -1
5619
              || htab->splt == NULL)
5620
            {
5621
              /* We didn't make a PLT entry for this symbol.  This
5622
                 happens when statically linking PIC code, or when
5623
                 using -Bsymbolic.  */
5624
              break;
5625
            }
5626
 
5627
          relocation = (htab->splt->output_section->vma
5628
                        + htab->splt->output_offset
5629
                        + h->plt.offset);
5630
          unresolved_reloc = false;
5631
          break;
5632
 
5633
          /* TOC16 relocs.  We want the offset relative to the TOC base,
5634
             which is the address of the start of the TOC plus 0x8000.
5635
             The TOC consists of sections .got, .toc, .tocbss, and .plt,
5636
             in this order.  */
5637
        case R_PPC64_TOC16:
5638
        case R_PPC64_TOC16_LO:
5639
        case R_PPC64_TOC16_HI:
5640
        case R_PPC64_TOC16_DS:
5641
        case R_PPC64_TOC16_LO_DS:
5642
        case R_PPC64_TOC16_HA:
5643
          addend -= TOCstart + TOC_BASE_OFF;
5644
          break;
5645
 
5646
          /* Relocate against the beginning of the section.  */
5647
        case R_PPC64_SECTOFF:
5648
        case R_PPC64_SECTOFF_LO:
5649
        case R_PPC64_SECTOFF_HI:
5650
        case R_PPC64_SECTOFF_DS:
5651
        case R_PPC64_SECTOFF_LO_DS:
5652
        case R_PPC64_SECTOFF_HA:
5653
          if (sec != (asection *) 0)
5654
            addend -= sec->output_section->vma;
5655
          break;
5656
 
5657
        case R_PPC64_REL14:
5658
        case R_PPC64_REL14_BRNTAKEN:
5659
        case R_PPC64_REL14_BRTAKEN:
5660
        case R_PPC64_REL24:
5661
          break;
5662
 
5663
          /* Relocations that may need to be propagated if this is a
5664
             dynamic object.  */
5665
        case R_PPC64_REL32:
5666
        case R_PPC64_REL64:
5667
        case R_PPC64_ADDR14:
5668
        case R_PPC64_ADDR14_BRNTAKEN:
5669
        case R_PPC64_ADDR14_BRTAKEN:
5670
        case R_PPC64_ADDR16:
5671
        case R_PPC64_ADDR16_DS:
5672
        case R_PPC64_ADDR16_HA:
5673
        case R_PPC64_ADDR16_HI:
5674
        case R_PPC64_ADDR16_HIGHER:
5675
        case R_PPC64_ADDR16_HIGHERA:
5676
        case R_PPC64_ADDR16_HIGHEST:
5677
        case R_PPC64_ADDR16_HIGHESTA:
5678
        case R_PPC64_ADDR16_LO:
5679
        case R_PPC64_ADDR16_LO_DS:
5680
        case R_PPC64_ADDR24:
5681
        case R_PPC64_ADDR30:
5682
        case R_PPC64_ADDR32:
5683
        case R_PPC64_ADDR64:
5684
        case R_PPC64_UADDR16:
5685
        case R_PPC64_UADDR32:
5686
        case R_PPC64_UADDR64:
5687
          /* r_symndx will be zero only for relocs against symbols
5688
             from removed linkonce sections, or sections discarded by
5689
             a linker script.  */
5690
          if (r_symndx == 0)
5691
            break;
5692
          /* Fall thru.  */
5693
 
5694
        case R_PPC64_TOC:
5695
          if ((input_section->flags & SEC_ALLOC) == 0)
5696
            break;
5697
 
5698
          if (NO_OPD_RELOCS && is_opd)
5699
            break;
5700
 
5701
          if ((info->shared
5702
               && (IS_ABSOLUTE_RELOC (r_type)
5703
                   || (h != NULL
5704
                       && h->dynindx != -1
5705
                       && (! info->symbolic
5706
                           || (h->elf_link_hash_flags
5707
                               & ELF_LINK_HASH_DEF_REGULAR) == 0))))
5708
              || (!info->shared
5709
                  && h != NULL
5710
                  && h->dynindx != -1
5711
                  && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
5712
                  && (((h->elf_link_hash_flags
5713
                        & ELF_LINK_HASH_DEF_DYNAMIC) != 0
5714
                       && (h->elf_link_hash_flags
5715
                           & ELF_LINK_HASH_DEF_REGULAR) == 0)
5716
                      || h->root.type == bfd_link_hash_undefweak
5717
                      || h->root.type == bfd_link_hash_undefined)))
5718
            {
5719
              Elf_Internal_Rela outrel;
5720
              boolean skip, relocate;
5721
              asection *sreloc;
5722
              Elf64_External_Rela *loc;
5723
 
5724
              /* When generating a dynamic object, these relocations
5725
                 are copied into the output file to be resolved at run
5726
                 time.  */
5727
 
5728
              skip = false;
5729
              relocate = false;
5730
 
5731
              outrel.r_offset =
5732
                _bfd_elf_section_offset (output_bfd, info, input_section,
5733
                                         rel->r_offset);
5734
              if (outrel.r_offset == (bfd_vma) -1)
5735
                skip = true;
5736
              else if (outrel.r_offset == (bfd_vma) -2)
5737
                skip = true, relocate = true;
5738
              outrel.r_offset += (input_section->output_section->vma
5739
                                  + input_section->output_offset);
5740
              outrel.r_addend = addend;
5741
 
5742
              if (skip)
5743
                memset (&outrel, 0, sizeof outrel);
5744
              else if (h != NULL
5745
                       && h->dynindx != -1
5746
                       && !is_opd
5747
                       && (!IS_ABSOLUTE_RELOC (r_type)
5748
                           || !info->shared
5749
                           || !info->symbolic
5750
                           || (h->elf_link_hash_flags
5751
                               & ELF_LINK_HASH_DEF_REGULAR) == 0))
5752
                outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
5753
              else
5754
                {
5755
                  /* This symbol is local, or marked to become local,
5756
                     or this is an opd section reloc which must point
5757
                     at a local function.  */
5758
                  outrel.r_addend += relocation;
5759
                  relocate = true;
5760
                  if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
5761
                    {
5762
                      if (is_opd && h != NULL)
5763
                        {
5764
                          /* Lie about opd entries.  This case occurs
5765
                             when building shared libraries and we
5766
                             reference a function in another shared
5767
                             lib.  The same thing happens for a weak
5768
                             definition in an application that's
5769
                             overridden by a strong definition in a
5770
                             shared lib.  (I believe this is a generic
5771
                             bug in binutils handling of weak syms.)
5772
                             In these cases we won't use the opd
5773
                             entry in this lib.  */
5774
                          unresolved_reloc = false;
5775
                        }
5776
                      outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
5777
                    }
5778
                  else
5779
                    {
5780
                      long indx = 0;
5781
 
5782
                      if (bfd_is_abs_section (sec))
5783
                        ;
5784
                      else if (sec == NULL || sec->owner == NULL)
5785
                        {
5786
                          bfd_set_error (bfd_error_bad_value);
5787
                          return false;
5788
                        }
5789
                      else
5790
                        {
5791
                          asection *osec;
5792
 
5793
                          osec = sec->output_section;
5794
                          indx = elf_section_data (osec)->dynindx;
5795
 
5796
                          /* We are turning this relocation into one
5797
                             against a section symbol, so subtract out
5798
                             the output section's address but not the
5799
                             offset of the input section in the output
5800
                             section.  */
5801
                          outrel.r_addend -= osec->vma;
5802
                        }
5803
 
5804
                      outrel.r_info = ELF64_R_INFO (indx, r_type);
5805
                    }
5806
                }
5807
 
5808
              sreloc = elf_section_data (input_section)->sreloc;
5809
              if (sreloc == NULL)
5810
                abort ();
5811
 
5812
              loc = (Elf64_External_Rela *) sreloc->contents;
5813
              loc += sreloc->reloc_count++;
5814
              bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
5815
 
5816
              /* If this reloc is against an external symbol, it will
5817
                 be computed at runtime, so there's no need to do
5818
                 anything now.  */
5819
              if (! relocate)
5820
                continue;
5821
            }
5822
          break;
5823
 
5824
        case R_PPC64_COPY:
5825
        case R_PPC64_GLOB_DAT:
5826
        case R_PPC64_JMP_SLOT:
5827
        case R_PPC64_RELATIVE:
5828
          /* We shouldn't ever see these dynamic relocs in relocatable
5829
             files.  */
5830
          /* Fall thru */
5831
 
5832
        case R_PPC64_PLTGOT16:
5833
        case R_PPC64_PLTGOT16_DS:
5834
        case R_PPC64_PLTGOT16_HA:
5835
        case R_PPC64_PLTGOT16_HI:
5836
        case R_PPC64_PLTGOT16_LO:
5837
        case R_PPC64_PLTGOT16_LO_DS:
5838
        case R_PPC64_PLTREL32:
5839
        case R_PPC64_PLTREL64:
5840
          /* These ones haven't been implemented yet.  */
5841
 
5842
          (*_bfd_error_handler)
5843
            (_("%s: Relocation %s is not supported for symbol %s."),
5844
             bfd_archive_filename (input_bfd),
5845
             ppc64_elf_howto_table[(int) r_type]->name, sym_name);
5846
 
5847
          bfd_set_error (bfd_error_invalid_operation);
5848
          ret = false;
5849
          continue;
5850
        }
5851
 
5852
      /* Do any further special processing.  */
5853
      switch (r_type)
5854
        {
5855
        default:
5856
          break;
5857
 
5858
        case R_PPC64_ADDR16_HA:
5859
        case R_PPC64_ADDR16_HIGHERA:
5860
        case R_PPC64_ADDR16_HIGHESTA:
5861
        case R_PPC64_PLT16_HA:
5862
        case R_PPC64_TOC16_HA:
5863
        case R_PPC64_SECTOFF_HA:
5864
          /* It's just possible that this symbol is a weak symbol
5865
             that's not actually defined anywhere. In that case,
5866
             'sec' would be NULL, and we should leave the symbol
5867
             alone (it will be set to zero elsewhere in the link).  */
5868
          if (sec != NULL)
5869
            /* Add 0x10000 if sign bit in 0:15 is set.  */
5870
            addend += ((relocation + addend) & 0x8000) << 1;
5871
          break;
5872
 
5873
        case R_PPC64_ADDR16_DS:
5874
        case R_PPC64_ADDR16_LO_DS:
5875
        case R_PPC64_GOT16_DS:
5876
        case R_PPC64_GOT16_LO_DS:
5877
        case R_PPC64_PLT16_LO_DS:
5878
        case R_PPC64_SECTOFF_DS:
5879
        case R_PPC64_SECTOFF_LO_DS:
5880
        case R_PPC64_TOC16_DS:
5881
        case R_PPC64_TOC16_LO_DS:
5882
        case R_PPC64_PLTGOT16_DS:
5883
        case R_PPC64_PLTGOT16_LO_DS:
5884
          if (((relocation + addend) & 3) != 0)
5885
            {
5886
              (*_bfd_error_handler)
5887
                (_("%s: error: relocation %s not a multiple of 4"),
5888
                 bfd_archive_filename (input_bfd),
5889
                 ppc64_elf_howto_table[(int) r_type]->name);
5890
              bfd_set_error (bfd_error_bad_value);
5891
              ret = false;
5892
              continue;
5893
            }
5894
          break;
5895
 
5896
        case R_PPC64_REL14:
5897
        case R_PPC64_REL14_BRNTAKEN:
5898
        case R_PPC64_REL14_BRTAKEN:
5899
          max_br_offset = 1 << 15;
5900
          goto branch_check;
5901
 
5902
        case R_PPC64_REL24:
5903
          max_br_offset = 1 << 25;
5904
 
5905
        branch_check:
5906
          /* If the branch is out of reach, then redirect the
5907
             call to the local stub for this function.  */
5908
          from = (offset
5909
                  + input_section->output_offset
5910
                  + input_section->output_section->vma);
5911
          if (relocation + addend - from + max_br_offset >= 2 * max_br_offset
5912
              && (stub_entry = ppc_get_stub_entry (input_section, sec, h,
5913
                                                   rel, htab)) != NULL)
5914
            {
5915
              /* Munge up the value and addend so that we call the stub
5916
                 rather than the procedure directly.  */
5917
              relocation = (stub_entry->stub_offset
5918
                            + stub_entry->stub_sec->output_offset
5919
                            + stub_entry->stub_sec->output_section->vma);
5920
              addend = 0;
5921
            }
5922
          break;
5923
        }
5924
 
5925
      /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
5926
         because such sections are not SEC_ALLOC and thus ld.so will
5927
         not process them.  */
5928
      if (unresolved_reloc
5929
          && !((input_section->flags & SEC_DEBUGGING) != 0
5930
               && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
5931
        {
5932
          (*_bfd_error_handler)
5933
            (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
5934
             bfd_archive_filename (input_bfd),
5935
             bfd_get_section_name (input_bfd, input_section),
5936
             (long) rel->r_offset,
5937
             h->root.root.string);
5938
          ret = false;
5939
        }
5940
 
5941
      r = _bfd_final_link_relocate (ppc64_elf_howto_table[(int) r_type],
5942
                                    input_bfd,
5943
                                    input_section,
5944
                                    contents,
5945
                                    offset,
5946
                                    relocation,
5947
                                    addend);
5948
 
5949
      if (r != bfd_reloc_ok)
5950
        {
5951
          const char *name;
5952
 
5953
          if (h != NULL)
5954
            {
5955
              if (h->root.type == bfd_link_hash_undefweak
5956
                  && ppc64_elf_howto_table[(int) r_type]->pc_relative)
5957
                {
5958
                  /* Assume this is a call protected by other code that
5959
                     detects the symbol is undefined.  If this is the case,
5960
                     we can safely ignore the overflow.  If not, the
5961
                     program is hosed anyway, and a little warning isn't
5962
                     going to help.  */
5963
 
5964
                  continue;
5965
                }
5966
 
5967
              name = h->root.root.string;
5968
            }
5969
          else
5970
            {
5971
              name = bfd_elf_string_from_elf_section (input_bfd,
5972
                                                      symtab_hdr->sh_link,
5973
                                                      sym->st_name);
5974
              if (name == NULL)
5975
                continue;
5976
              if (*name == '\0')
5977
                name = bfd_section_name (input_bfd, sec);
5978
            }
5979
 
5980
          if (r == bfd_reloc_overflow)
5981
            {
5982
              if (warned)
5983
                continue;
5984
              if (!((*info->callbacks->reloc_overflow)
5985
                    (info, name, ppc64_elf_howto_table[(int) r_type]->name,
5986
                     rel->r_addend, input_bfd, input_section, offset)))
5987
                return false;
5988
            }
5989
          else
5990
            {
5991
              (*_bfd_error_handler)
5992
                (_("%s(%s+0x%lx): reloc against `%s': error %d"),
5993
                 bfd_archive_filename (input_bfd),
5994
                 bfd_get_section_name (input_bfd, input_section),
5995
                 (long) rel->r_offset, name, (int) r);
5996
              ret = false;
5997
            }
5998
        }
5999
    }
6000
 
6001
  return ret;
6002
}
6003
 
6004
/* Finish up dynamic symbol handling.  We set the contents of various
6005
   dynamic sections here.  */
6006
 
6007
static boolean
6008
ppc64_elf_finish_dynamic_symbol (output_bfd, info, h, sym)
6009
     bfd *output_bfd;
6010
     struct bfd_link_info *info;
6011
     struct elf_link_hash_entry *h;
6012
     Elf_Internal_Sym *sym;
6013
{
6014
  struct ppc_link_hash_table *htab;
6015
  bfd *dynobj;
6016
 
6017
  htab = ppc_hash_table (info);
6018
  dynobj = htab->elf.dynobj;
6019
 
6020
  if (h->plt.offset != (bfd_vma) -1
6021
      && ((struct ppc_link_hash_entry *) h)->is_func_descriptor)
6022
    {
6023
      Elf_Internal_Rela rela;
6024
      Elf64_External_Rela *loc;
6025
 
6026
      /* This symbol has an entry in the procedure linkage table.  Set
6027
         it up.  */
6028
 
6029
      if (htab->splt == NULL
6030
          || htab->srelplt == NULL
6031
          || htab->sglink == NULL)
6032
        abort ();
6033
 
6034
      /* Create a JMP_SLOT reloc to inform the dynamic linker to
6035
         fill in the PLT entry.  */
6036
 
6037
      rela.r_offset = (htab->splt->output_section->vma
6038
                       + htab->splt->output_offset
6039
                       + h->plt.offset);
6040
      rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
6041
      rela.r_addend = 0;
6042
 
6043
      loc = (Elf64_External_Rela *) htab->srelplt->contents;
6044
      loc += (h->plt.offset - PLT_INITIAL_ENTRY_SIZE) / PLT_ENTRY_SIZE;
6045
      bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
6046
    }
6047
 
6048
  if (h->got.offset != (bfd_vma) -1)
6049
    {
6050
      Elf_Internal_Rela rela;
6051
      Elf64_External_Rela *loc;
6052
 
6053
      /* This symbol has an entry in the global offset table.  Set it
6054
         up.  */
6055
 
6056
      if (htab->sgot == NULL || htab->srelgot == NULL)
6057
        abort ();
6058
 
6059
      rela.r_offset = (htab->sgot->output_section->vma
6060
                       + htab->sgot->output_offset
6061
                       + (h->got.offset &~ (bfd_vma) 1));
6062
 
6063
      /* If this is a static link, or it is a -Bsymbolic link and the
6064
         symbol is defined locally or was forced to be local because
6065
         of a version file, we just want to emit a RELATIVE reloc.
6066
         The entry in the global offset table will already have been
6067
         initialized in the relocate_section function.  */
6068
      if (info->shared
6069
          && (info->symbolic
6070
              || h->dynindx == -1
6071
              || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
6072
          && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
6073
        {
6074
          BFD_ASSERT((h->got.offset & 1) != 0);
6075
          rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
6076
          rela.r_addend = (h->root.u.def.value
6077
                           + h->root.u.def.section->output_section->vma
6078
                           + h->root.u.def.section->output_offset);
6079
        }
6080
      else
6081
        {
6082
          BFD_ASSERT ((h->got.offset & 1) == 0);
6083
          bfd_put_64 (output_bfd, (bfd_vma) 0,
6084
                      htab->sgot->contents + h->got.offset);
6085
          rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_GLOB_DAT);
6086
          rela.r_addend = 0;
6087
        }
6088
 
6089
      loc = (Elf64_External_Rela *) htab->srelgot->contents;
6090
      loc += htab->srelgot->reloc_count++;
6091
      bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
6092
    }
6093
 
6094
  if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
6095
    {
6096
      Elf_Internal_Rela rela;
6097
      Elf64_External_Rela *loc;
6098
 
6099
      /* This symbol needs a copy reloc.  Set it up.  */
6100
 
6101
      if (h->dynindx == -1
6102
          || (h->root.type != bfd_link_hash_defined
6103
              && h->root.type != bfd_link_hash_defweak)
6104
          || htab->srelbss == NULL)
6105
        abort ();
6106
 
6107
      rela.r_offset = (h->root.u.def.value
6108
                       + h->root.u.def.section->output_section->vma
6109
                       + h->root.u.def.section->output_offset);
6110
      rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
6111
      rela.r_addend = 0;
6112
      loc = (Elf64_External_Rela *) htab->srelbss->contents;
6113
      loc += htab->srelbss->reloc_count++;
6114
      bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
6115
    }
6116
 
6117
  /* Mark some specially defined symbols as absolute.  */
6118
  if (strcmp (h->root.root.string, "_DYNAMIC") == 0)
6119
    sym->st_shndx = SHN_ABS;
6120
 
6121
  return true;
6122
}
6123
 
6124
/* Used to decide how to sort relocs in an optimal manner for the
6125
   dynamic linker, before writing them out.  */
6126
 
6127
static enum elf_reloc_type_class
6128
ppc64_elf_reloc_type_class (rela)
6129
     const Elf_Internal_Rela *rela;
6130
{
6131
  enum elf_ppc_reloc_type r_type;
6132
 
6133
  r_type = (enum elf_ppc_reloc_type) ELF64_R_TYPE (rela->r_info);
6134
  switch (r_type)
6135
    {
6136
    case R_PPC64_RELATIVE:
6137
      return reloc_class_relative;
6138
    case R_PPC64_JMP_SLOT:
6139
      return reloc_class_plt;
6140
    case R_PPC64_COPY:
6141
      return reloc_class_copy;
6142
    default:
6143
      return reloc_class_normal;
6144
    }
6145
}
6146
 
6147
/* Finish up the dynamic sections.  */
6148
 
6149
static boolean
6150
ppc64_elf_finish_dynamic_sections (output_bfd, info)
6151
     bfd *output_bfd;
6152
     struct bfd_link_info *info;
6153
{
6154
  struct ppc_link_hash_table *htab;
6155
  bfd *dynobj;
6156
  asection *sdyn;
6157
 
6158
  htab = ppc_hash_table (info);
6159
  dynobj = htab->elf.dynobj;
6160
  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
6161
 
6162
  if (htab->elf.dynamic_sections_created)
6163
    {
6164
      Elf64_External_Dyn *dyncon, *dynconend;
6165
 
6166
      if (sdyn == NULL || htab->sgot == NULL)
6167
        abort ();
6168
 
6169
      dyncon = (Elf64_External_Dyn *) sdyn->contents;
6170
      dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
6171
      for (; dyncon < dynconend; dyncon++)
6172
        {
6173
          Elf_Internal_Dyn dyn;
6174
          asection *s;
6175
 
6176
          bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
6177
 
6178
          switch (dyn.d_tag)
6179
            {
6180
            default:
6181
              continue;
6182
 
6183
            case DT_PPC64_GLINK:
6184
              dyn.d_un.d_ptr = (htab->sglink->output_section->vma
6185
                                + htab->sglink->output_offset);
6186
              break;
6187
 
6188
            case DT_PPC64_OPD:
6189
              s = bfd_get_section_by_name (output_bfd, ".opd");
6190
              if (s != NULL)
6191
                dyn.d_un.d_ptr = s->vma;
6192
              break;
6193
 
6194
            case DT_PPC64_OPDSZ:
6195
              s = bfd_get_section_by_name (output_bfd, ".opd");
6196
              if (s != NULL)
6197
                dyn.d_un.d_val = s->_raw_size;
6198
              break;
6199
 
6200
            case DT_PLTGOT:
6201
              dyn.d_un.d_ptr = (htab->splt->output_section->vma
6202
                                + htab->splt->output_offset);
6203
              break;
6204
 
6205
            case DT_JMPREL:
6206
              dyn.d_un.d_ptr = (htab->srelplt->output_section->vma
6207
                                + htab->srelplt->output_offset);
6208
              break;
6209
 
6210
            case DT_PLTRELSZ:
6211
              dyn.d_un.d_val = htab->srelplt->_raw_size;
6212
              break;
6213
 
6214
            case DT_RELASZ:
6215
              /* Don't count procedure linkage table relocs in the
6216
                 overall reloc count.  */
6217
              if (htab->srelplt != NULL)
6218
                dyn.d_un.d_val -= htab->srelplt->_raw_size;
6219
              break;
6220
            }
6221
 
6222
          bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
6223
        }
6224
    }
6225
 
6226
  if (htab->sgot != NULL && htab->sgot->_raw_size != 0)
6227
    {
6228
      /* Fill in the first entry in the global offset table.
6229
         We use it to hold the link-time TOCbase.  */
6230
      bfd_put_64 (output_bfd,
6231
                  elf_gp (output_bfd) + TOC_BASE_OFF,
6232
                  htab->sgot->contents);
6233
 
6234
      /* Set .got entry size.  */
6235
      elf_section_data (htab->sgot->output_section)->this_hdr.sh_entsize = 8;
6236
    }
6237
 
6238
  if (htab->splt != NULL && htab->splt->_raw_size != 0)
6239
    {
6240
      /* Set .plt entry size.  */
6241
      elf_section_data (htab->splt->output_section)->this_hdr.sh_entsize
6242
        = PLT_ENTRY_SIZE;
6243
    }
6244
 
6245
  return true;
6246
}
6247
 
6248
#define TARGET_LITTLE_SYM       bfd_elf64_powerpcle_vec
6249
#define TARGET_LITTLE_NAME      "elf64-powerpcle"
6250
#define TARGET_BIG_SYM          bfd_elf64_powerpc_vec
6251
#define TARGET_BIG_NAME         "elf64-powerpc"
6252
#define ELF_ARCH                bfd_arch_powerpc
6253
#define ELF_MACHINE_CODE        EM_PPC64
6254
#define ELF_MAXPAGESIZE         0x10000
6255
#define elf_info_to_howto       ppc64_elf_info_to_howto
6256
 
6257
#ifdef  EM_CYGNUS_POWERPC
6258
#define ELF_MACHINE_ALT1        EM_CYGNUS_POWERPC
6259
#endif
6260
 
6261
#ifdef EM_PPC_OLD
6262
#define ELF_MACHINE_ALT2        EM_PPC_OLD
6263
#endif
6264
 
6265
#define elf_backend_want_got_sym 0
6266
#define elf_backend_want_plt_sym 0
6267
#define elf_backend_plt_alignment 3
6268
#define elf_backend_plt_not_loaded 1
6269
#define elf_backend_got_symbol_offset 0
6270
#define elf_backend_got_header_size 8
6271
#define elf_backend_plt_header_size PLT_INITIAL_ENTRY_SIZE
6272
#define elf_backend_can_gc_sections 1
6273
#define elf_backend_can_refcount 1
6274
#define elf_backend_rela_normal 1
6275
 
6276
#define bfd_elf64_bfd_reloc_type_lookup       ppc64_elf_reloc_type_lookup
6277
#define bfd_elf64_bfd_merge_private_bfd_data  ppc64_elf_merge_private_bfd_data
6278
#define bfd_elf64_bfd_link_hash_table_create  ppc64_elf_link_hash_table_create
6279
#define bfd_elf64_bfd_link_hash_table_free    ppc64_elf_link_hash_table_free
6280
 
6281
#define elf_backend_object_p                  ppc64_elf_object_p
6282
#define elf_backend_create_dynamic_sections   ppc64_elf_create_dynamic_sections
6283
#define elf_backend_copy_indirect_symbol      ppc64_elf_copy_indirect_symbol
6284
#define elf_backend_check_relocs              ppc64_elf_check_relocs
6285
#define elf_backend_gc_mark_hook              ppc64_elf_gc_mark_hook
6286
#define elf_backend_gc_sweep_hook             ppc64_elf_gc_sweep_hook
6287
#define elf_backend_adjust_dynamic_symbol     ppc64_elf_adjust_dynamic_symbol
6288
#define elf_backend_hide_symbol               ppc64_elf_hide_symbol
6289
#define elf_backend_always_size_sections      ppc64_elf_func_desc_adjust
6290
#define elf_backend_size_dynamic_sections     ppc64_elf_size_dynamic_sections
6291
#define elf_backend_relocate_section          ppc64_elf_relocate_section
6292
#define elf_backend_finish_dynamic_symbol     ppc64_elf_finish_dynamic_symbol
6293
#define elf_backend_reloc_type_class          ppc64_elf_reloc_type_class
6294
#define elf_backend_finish_dynamic_sections   ppc64_elf_finish_dynamic_sections
6295
 
6296
#include "elf64-target.h"

powered by: WebSVN 2.1.0

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