~ubuntu-branches/ubuntu/quantal/gclcvs/quantal

« back to all changes in this revision

Viewing changes to binutils/bfd/elf64-ppc.c

  • Committer: Bazaar Package Importer
  • Author(s): Camm Maguire
  • Date: 2004-06-24 15:13:46 UTC
  • Revision ID: james.westby@ubuntu.com-20040624151346-xh0xaaktyyp7aorc
Tags: 2.7.0-26
C_GC_OFFSET is 2 on m68k-linux

Show diffs side-by-side

added added

removed removed

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