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

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-6.8/] [bfd/] [elf64-ppc.c] - Blame information for rev 178

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

Line No. Rev Author Line
1 24 jeremybenn
/* PowerPC64-specific support for 64-bit ELF.
2
   Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
3
   Free Software Foundation, Inc.
4
   Written by Linus Nordberg, Swox AB <info@swox.com>,
5
   based on elf32-ppc.c by Ian Lance Taylor.
6
   Largely rewritten by Alan Modra <amodra@bigpond.net.au>
7
 
8
   This file is part of BFD, the Binary File Descriptor library.
9
 
10
   This program is free software; you can redistribute it and/or modify
11
   it under the terms of the GNU General Public License as published by
12
   the Free Software Foundation; either version 3 of the License, or
13
   (at your option) any later version.
14
 
15
   This program is distributed in the hope that it will be useful,
16
   but WITHOUT ANY WARRANTY; without even the implied warranty of
17
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
   GNU General Public License for more details.
19
 
20
   You should have received a copy of the GNU General Public License along
21
   with this program; if not, write to the Free Software Foundation, Inc.,
22
   51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
23
 
24
 
25
/* The 64-bit PowerPC ELF ABI may be found at
26
   http://www.linuxbase.org/spec/ELF/ppc64/PPC-elf64abi.txt, and
27
   http://www.linuxbase.org/spec/ELF/ppc64/spec/book1.html  */
28
 
29
#include "sysdep.h"
30
#include <stdarg.h>
31
#include "bfd.h"
32
#include "bfdlink.h"
33
#include "libbfd.h"
34
#include "elf-bfd.h"
35
#include "elf/ppc64.h"
36
#include "elf64-ppc.h"
37
 
38
static bfd_reloc_status_type ppc64_elf_ha_reloc
39
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
40
static bfd_reloc_status_type ppc64_elf_branch_reloc
41
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
42
static bfd_reloc_status_type ppc64_elf_brtaken_reloc
43
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
44
static bfd_reloc_status_type ppc64_elf_sectoff_reloc
45
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
46
static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc
47
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
48
static bfd_reloc_status_type ppc64_elf_toc_reloc
49
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
50
static bfd_reloc_status_type ppc64_elf_toc_ha_reloc
51
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
52
static bfd_reloc_status_type ppc64_elf_toc64_reloc
53
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
54
static bfd_reloc_status_type ppc64_elf_unhandled_reloc
55
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
56
static bfd_vma opd_entry_value
57
  (asection *, bfd_vma, asection **, bfd_vma *);
58
 
59
#define TARGET_LITTLE_SYM       bfd_elf64_powerpcle_vec
60
#define TARGET_LITTLE_NAME      "elf64-powerpcle"
61
#define TARGET_BIG_SYM          bfd_elf64_powerpc_vec
62
#define TARGET_BIG_NAME         "elf64-powerpc"
63
#define ELF_ARCH                bfd_arch_powerpc
64
#define ELF_MACHINE_CODE        EM_PPC64
65
#define ELF_MAXPAGESIZE         0x10000
66
#define ELF_COMMONPAGESIZE      0x1000
67
#define elf_info_to_howto       ppc64_elf_info_to_howto
68
 
69
#define elf_backend_want_got_sym 0
70
#define elf_backend_want_plt_sym 0
71
#define elf_backend_plt_alignment 3
72
#define elf_backend_plt_not_loaded 1
73
#define elf_backend_got_header_size 8
74
#define elf_backend_can_gc_sections 1
75
#define elf_backend_can_refcount 1
76
#define elf_backend_rela_normal 1
77
#define elf_backend_default_execstack 0
78
 
79
#define bfd_elf64_mkobject                    ppc64_elf_mkobject
80
#define bfd_elf64_bfd_reloc_type_lookup       ppc64_elf_reloc_type_lookup
81
#define bfd_elf64_bfd_reloc_name_lookup ppc64_elf_reloc_name_lookup
82
#define bfd_elf64_bfd_merge_private_bfd_data  ppc64_elf_merge_private_bfd_data
83
#define bfd_elf64_new_section_hook            ppc64_elf_new_section_hook
84
#define bfd_elf64_bfd_link_hash_table_create  ppc64_elf_link_hash_table_create
85
#define bfd_elf64_bfd_link_hash_table_free    ppc64_elf_link_hash_table_free
86
#define bfd_elf64_get_synthetic_symtab        ppc64_elf_get_synthetic_symtab
87
 
88
#define elf_backend_object_p                  ppc64_elf_object_p
89
#define elf_backend_grok_prstatus             ppc64_elf_grok_prstatus
90
#define elf_backend_grok_psinfo               ppc64_elf_grok_psinfo
91
#define elf_backend_write_core_note           ppc64_elf_write_core_note
92
#define elf_backend_create_dynamic_sections   ppc64_elf_create_dynamic_sections
93
#define elf_backend_copy_indirect_symbol      ppc64_elf_copy_indirect_symbol
94
#define elf_backend_add_symbol_hook           ppc64_elf_add_symbol_hook
95
#define elf_backend_check_directives          ppc64_elf_check_directives
96
#define elf_backend_as_needed_cleanup         ppc64_elf_as_needed_cleanup
97
#define elf_backend_archive_symbol_lookup     ppc64_elf_archive_symbol_lookup
98
#define elf_backend_check_relocs              ppc64_elf_check_relocs
99
#define elf_backend_gc_keep                   ppc64_elf_gc_keep
100
#define elf_backend_gc_mark_dynamic_ref       ppc64_elf_gc_mark_dynamic_ref
101
#define elf_backend_gc_mark_hook              ppc64_elf_gc_mark_hook
102
#define elf_backend_gc_sweep_hook             ppc64_elf_gc_sweep_hook
103
#define elf_backend_adjust_dynamic_symbol     ppc64_elf_adjust_dynamic_symbol
104
#define elf_backend_hide_symbol               ppc64_elf_hide_symbol
105
#define elf_backend_always_size_sections      ppc64_elf_func_desc_adjust
106
#define elf_backend_size_dynamic_sections     ppc64_elf_size_dynamic_sections
107
#define elf_backend_init_index_section        _bfd_elf_init_2_index_sections
108
#define elf_backend_action_discarded          ppc64_elf_action_discarded
109
#define elf_backend_relocate_section          ppc64_elf_relocate_section
110
#define elf_backend_finish_dynamic_symbol     ppc64_elf_finish_dynamic_symbol
111
#define elf_backend_reloc_type_class          ppc64_elf_reloc_type_class
112
#define elf_backend_finish_dynamic_sections   ppc64_elf_finish_dynamic_sections
113
#define elf_backend_link_output_symbol_hook   ppc64_elf_output_symbol_hook
114
#define elf_backend_special_sections          ppc64_elf_special_sections
115
 
116
/* The name of the dynamic interpreter.  This is put in the .interp
117
   section.  */
118
#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
119
 
120
/* The size in bytes of an entry in the procedure linkage table.  */
121
#define PLT_ENTRY_SIZE 24
122
 
123
/* The initial size of the plt reserved for the dynamic linker.  */
124
#define PLT_INITIAL_ENTRY_SIZE PLT_ENTRY_SIZE
125
 
126
/* TOC base pointers offset from start of TOC.  */
127
#define TOC_BASE_OFF    0x8000
128
 
129
/* Offset of tp and dtp pointers from start of TLS block.  */
130
#define TP_OFFSET       0x7000
131
#define DTP_OFFSET      0x8000
132
 
133
/* .plt call stub instructions.  The normal stub is like this, but
134
   sometimes the .plt entry crosses a 64k boundary and we need to
135
   insert an addi to adjust r12.  */
136
#define PLT_CALL_STUB_SIZE (7*4)
137
#define ADDIS_R12_R2    0x3d820000      /* addis %r12,%r2,xxx@ha     */
138
#define STD_R2_40R1     0xf8410028      /* std   %r2,40(%r1)         */
139
#define LD_R11_0R12     0xe96c0000      /* ld    %r11,xxx+0@l(%r12)  */
140
#define MTCTR_R11       0x7d6903a6      /* mtctr %r11                */
141
#define LD_R2_0R12      0xe84c0000      /* ld    %r2,xxx+8@l(%r12)   */
142
                                        /* ld    %r11,xxx+16@l(%r12) */
143
#define BCTR            0x4e800420      /* bctr                      */
144
 
145
 
146
#define ADDIS_R12_R12   0x3d8c0000      /* addis %r12,%r12,off@ha  */
147
#define ADDI_R12_R12    0x398c0000      /* addi %r12,%r12,off@l  */
148
#define ADDIS_R2_R2     0x3c420000      /* addis %r2,%r2,off@ha  */
149
#define ADDI_R2_R2      0x38420000      /* addi  %r2,%r2,off@l   */
150
 
151
#define LD_R11_0R2      0xe9620000      /* ld    %r11,xxx+0(%r2) */
152
#define LD_R2_0R2       0xe8420000      /* ld    %r2,xxx+0(%r2)  */
153
 
154
#define LD_R2_40R1      0xe8410028      /* ld    %r2,40(%r1)     */
155
 
156
/* glink call stub instructions.  We enter with the index in R0.  */
157
#define GLINK_CALL_STUB_SIZE (16*4)
158
                                        /* 0:                           */
159
                                        /*  .quad plt0-1f               */
160
                                        /* __glink:                     */
161
#define MFLR_R12        0x7d8802a6      /*  mflr %12                    */
162
#define BCL_20_31       0x429f0005      /*  bcl 20,31,1f                */
163
                                        /* 1:                           */
164
#define MFLR_R11        0x7d6802a6      /*  mflr %11                    */
165
#define LD_R2_M16R11    0xe84bfff0      /*  ld %2,(0b-1b)(%11)          */
166
#define MTLR_R12        0x7d8803a6      /*  mtlr %12                    */
167
#define ADD_R12_R2_R11  0x7d825a14      /*  add %12,%2,%11              */
168
                                        /*  ld %11,0(%12)               */
169
                                        /*  ld %2,8(%12)                */
170
                                        /*  mtctr %11                   */
171
                                        /*  ld %11,16(%12)              */
172
                                        /*  bctr                        */
173
 
174
/* Pad with this.  */
175
#define NOP             0x60000000
176
 
177
/* Some other nops.  */
178
#define CROR_151515     0x4def7b82
179
#define CROR_313131     0x4ffffb82
180
 
181
/* .glink entries for the first 32k functions are two instructions.  */
182
#define LI_R0_0         0x38000000      /* li    %r0,0          */
183
#define B_DOT           0x48000000      /* b     .              */
184
 
185
/* After that, we need two instructions to load the index, followed by
186
   a branch.  */
187
#define LIS_R0_0        0x3c000000      /* lis   %r0,0          */
188
#define ORI_R0_R0_0     0x60000000      /* ori   %r0,%r0,0      */
189
 
190
/* Instructions used by the save and restore reg functions.  */
191
#define STD_R0_0R1      0xf8010000      /* std   %r0,0(%r1)     */
192
#define STD_R0_0R12     0xf80c0000      /* std   %r0,0(%r12)    */
193
#define LD_R0_0R1       0xe8010000      /* ld    %r0,0(%r1)     */
194
#define LD_R0_0R12      0xe80c0000      /* ld    %r0,0(%r12)    */
195
#define STFD_FR0_0R1    0xd8010000      /* stfd  %fr0,0(%r1)    */
196
#define LFD_FR0_0R1     0xc8010000      /* lfd   %fr0,0(%r1)    */
197
#define LI_R12_0        0x39800000      /* li    %r12,0         */
198
#define STVX_VR0_R12_R0 0x7c0c01ce      /* stvx  %v0,%r12,%r0   */
199
#define LVX_VR0_R12_R0  0x7c0c00ce      /* lvx   %v0,%r12,%r0   */
200
#define MTLR_R0         0x7c0803a6      /* mtlr  %r0            */
201
#define BLR             0x4e800020      /* blr                  */
202
 
203
/* Since .opd is an array of descriptors and each entry will end up
204
   with identical R_PPC64_RELATIVE relocs, there is really no need to
205
   propagate .opd relocs;  The dynamic linker should be taught to
206
   relocate .opd without reloc entries.  */
207
#ifndef NO_OPD_RELOCS
208
#define NO_OPD_RELOCS 0
209
#endif
210
 
211
#define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
212
 
213
/* Relocation HOWTO's.  */
214
static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
215
 
216
static reloc_howto_type ppc64_elf_howto_raw[] = {
217
  /* This reloc does nothing.  */
218
  HOWTO (R_PPC64_NONE,          /* type */
219
         0,                      /* rightshift */
220
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
221
         32,                    /* bitsize */
222
         FALSE,                 /* pc_relative */
223
         0,                      /* bitpos */
224
         complain_overflow_dont, /* complain_on_overflow */
225
         bfd_elf_generic_reloc, /* special_function */
226
         "R_PPC64_NONE",        /* name */
227
         FALSE,                 /* partial_inplace */
228
         0,                      /* src_mask */
229
         0,                      /* dst_mask */
230
         FALSE),                /* pcrel_offset */
231
 
232
  /* A standard 32 bit relocation.  */
233
  HOWTO (R_PPC64_ADDR32,        /* type */
234
         0,                      /* rightshift */
235
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
236
         32,                    /* bitsize */
237
         FALSE,                 /* pc_relative */
238
         0,                      /* bitpos */
239
         complain_overflow_bitfield, /* complain_on_overflow */
240
         bfd_elf_generic_reloc, /* special_function */
241
         "R_PPC64_ADDR32",      /* name */
242
         FALSE,                 /* partial_inplace */
243
         0,                      /* src_mask */
244
         0xffffffff,            /* dst_mask */
245
         FALSE),                /* pcrel_offset */
246
 
247
  /* An absolute 26 bit branch; the lower two bits must be zero.
248
     FIXME: we don't check that, we just clear them.  */
249
  HOWTO (R_PPC64_ADDR24,        /* type */
250
         0,                      /* rightshift */
251
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
252
         26,                    /* bitsize */
253
         FALSE,                 /* pc_relative */
254
         0,                      /* bitpos */
255
         complain_overflow_bitfield, /* complain_on_overflow */
256
         bfd_elf_generic_reloc, /* special_function */
257
         "R_PPC64_ADDR24",      /* name */
258
         FALSE,                 /* partial_inplace */
259
         0,                      /* src_mask */
260
         0x03fffffc,            /* dst_mask */
261
         FALSE),                /* pcrel_offset */
262
 
263
  /* A standard 16 bit relocation.  */
264
  HOWTO (R_PPC64_ADDR16,        /* type */
265
         0,                      /* rightshift */
266
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
267
         16,                    /* bitsize */
268
         FALSE,                 /* pc_relative */
269
         0,                      /* bitpos */
270
         complain_overflow_bitfield, /* complain_on_overflow */
271
         bfd_elf_generic_reloc, /* special_function */
272
         "R_PPC64_ADDR16",      /* name */
273
         FALSE,                 /* partial_inplace */
274
         0,                      /* src_mask */
275
         0xffff,                /* dst_mask */
276
         FALSE),                /* pcrel_offset */
277
 
278
  /* A 16 bit relocation without overflow.  */
279
  HOWTO (R_PPC64_ADDR16_LO,     /* type */
280
         0,                      /* rightshift */
281
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
282
         16,                    /* bitsize */
283
         FALSE,                 /* pc_relative */
284
         0,                      /* bitpos */
285
         complain_overflow_dont,/* complain_on_overflow */
286
         bfd_elf_generic_reloc, /* special_function */
287
         "R_PPC64_ADDR16_LO",   /* name */
288
         FALSE,                 /* partial_inplace */
289
         0,                      /* src_mask */
290
         0xffff,                /* dst_mask */
291
         FALSE),                /* pcrel_offset */
292
 
293
  /* Bits 16-31 of an address.  */
294
  HOWTO (R_PPC64_ADDR16_HI,     /* type */
295
         16,                    /* rightshift */
296
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
297
         16,                    /* bitsize */
298
         FALSE,                 /* pc_relative */
299
         0,                      /* bitpos */
300
         complain_overflow_dont, /* complain_on_overflow */
301
         bfd_elf_generic_reloc, /* special_function */
302
         "R_PPC64_ADDR16_HI",   /* name */
303
         FALSE,                 /* partial_inplace */
304
         0,                      /* src_mask */
305
         0xffff,                /* dst_mask */
306
         FALSE),                /* pcrel_offset */
307
 
308
  /* Bits 16-31 of an address, plus 1 if the contents of the low 16
309
     bits, treated as a signed number, is negative.  */
310
  HOWTO (R_PPC64_ADDR16_HA,     /* type */
311
         16,                    /* rightshift */
312
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
313
         16,                    /* bitsize */
314
         FALSE,                 /* pc_relative */
315
         0,                      /* bitpos */
316
         complain_overflow_dont, /* complain_on_overflow */
317
         ppc64_elf_ha_reloc,    /* special_function */
318
         "R_PPC64_ADDR16_HA",   /* name */
319
         FALSE,                 /* partial_inplace */
320
         0,                      /* src_mask */
321
         0xffff,                /* dst_mask */
322
         FALSE),                /* pcrel_offset */
323
 
324
  /* An absolute 16 bit branch; the lower two bits must be zero.
325
     FIXME: we don't check that, we just clear them.  */
326
  HOWTO (R_PPC64_ADDR14,        /* type */
327
         0,                      /* rightshift */
328
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
329
         16,                    /* bitsize */
330
         FALSE,                 /* pc_relative */
331
         0,                      /* bitpos */
332
         complain_overflow_bitfield, /* complain_on_overflow */
333
         ppc64_elf_branch_reloc, /* special_function */
334
         "R_PPC64_ADDR14",      /* name */
335
         FALSE,                 /* partial_inplace */
336
         0,                      /* src_mask */
337
         0x0000fffc,            /* dst_mask */
338
         FALSE),                /* pcrel_offset */
339
 
340
  /* An absolute 16 bit branch, for which bit 10 should be set to
341
     indicate that the branch is expected to be taken.  The lower two
342
     bits must be zero.  */
343
  HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */
344
         0,                      /* rightshift */
345
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
346
         16,                    /* bitsize */
347
         FALSE,                 /* pc_relative */
348
         0,                      /* bitpos */
349
         complain_overflow_bitfield, /* complain_on_overflow */
350
         ppc64_elf_brtaken_reloc, /* special_function */
351
         "R_PPC64_ADDR14_BRTAKEN",/* name */
352
         FALSE,                 /* partial_inplace */
353
         0,                      /* src_mask */
354
         0x0000fffc,            /* dst_mask */
355
         FALSE),                /* pcrel_offset */
356
 
357
  /* An absolute 16 bit branch, for which bit 10 should be set to
358
     indicate that the branch is not expected to be taken.  The lower
359
     two bits must be zero.  */
360
  HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */
361
         0,                      /* rightshift */
362
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
363
         16,                    /* bitsize */
364
         FALSE,                 /* pc_relative */
365
         0,                      /* bitpos */
366
         complain_overflow_bitfield, /* complain_on_overflow */
367
         ppc64_elf_brtaken_reloc, /* special_function */
368
         "R_PPC64_ADDR14_BRNTAKEN",/* name */
369
         FALSE,                 /* partial_inplace */
370
         0,                      /* src_mask */
371
         0x0000fffc,            /* dst_mask */
372
         FALSE),                /* pcrel_offset */
373
 
374
  /* A relative 26 bit branch; the lower two bits must be zero.  */
375
  HOWTO (R_PPC64_REL24,         /* type */
376
         0,                      /* rightshift */
377
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
378
         26,                    /* bitsize */
379
         TRUE,                  /* pc_relative */
380
         0,                      /* bitpos */
381
         complain_overflow_signed, /* complain_on_overflow */
382
         ppc64_elf_branch_reloc, /* special_function */
383
         "R_PPC64_REL24",       /* name */
384
         FALSE,                 /* partial_inplace */
385
         0,                      /* src_mask */
386
         0x03fffffc,            /* dst_mask */
387
         TRUE),                 /* pcrel_offset */
388
 
389
  /* A relative 16 bit branch; the lower two bits must be zero.  */
390
  HOWTO (R_PPC64_REL14,         /* type */
391
         0,                      /* rightshift */
392
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
393
         16,                    /* bitsize */
394
         TRUE,                  /* pc_relative */
395
         0,                      /* bitpos */
396
         complain_overflow_signed, /* complain_on_overflow */
397
         ppc64_elf_branch_reloc, /* special_function */
398
         "R_PPC64_REL14",       /* name */
399
         FALSE,                 /* partial_inplace */
400
         0,                      /* src_mask */
401
         0x0000fffc,            /* dst_mask */
402
         TRUE),                 /* pcrel_offset */
403
 
404
  /* A relative 16 bit branch.  Bit 10 should be set to indicate that
405
     the branch is expected to be taken.  The lower two bits must be
406
     zero.  */
407
  HOWTO (R_PPC64_REL14_BRTAKEN, /* type */
408
         0,                      /* rightshift */
409
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
410
         16,                    /* bitsize */
411
         TRUE,                  /* pc_relative */
412
         0,                      /* bitpos */
413
         complain_overflow_signed, /* complain_on_overflow */
414
         ppc64_elf_brtaken_reloc, /* special_function */
415
         "R_PPC64_REL14_BRTAKEN", /* name */
416
         FALSE,                 /* partial_inplace */
417
         0,                      /* src_mask */
418
         0x0000fffc,            /* dst_mask */
419
         TRUE),                 /* pcrel_offset */
420
 
421
  /* A relative 16 bit branch.  Bit 10 should be set to indicate that
422
     the branch is not expected to be taken.  The lower two bits must
423
     be zero.  */
424
  HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */
425
         0,                      /* rightshift */
426
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
427
         16,                    /* bitsize */
428
         TRUE,                  /* pc_relative */
429
         0,                      /* bitpos */
430
         complain_overflow_signed, /* complain_on_overflow */
431
         ppc64_elf_brtaken_reloc, /* special_function */
432
         "R_PPC64_REL14_BRNTAKEN",/* name */
433
         FALSE,                 /* partial_inplace */
434
         0,                      /* src_mask */
435
         0x0000fffc,            /* dst_mask */
436
         TRUE),                 /* pcrel_offset */
437
 
438
  /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
439
     symbol.  */
440
  HOWTO (R_PPC64_GOT16,         /* type */
441
         0,                      /* rightshift */
442
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
443
         16,                    /* bitsize */
444
         FALSE,                 /* pc_relative */
445
         0,                      /* bitpos */
446
         complain_overflow_signed, /* complain_on_overflow */
447
         ppc64_elf_unhandled_reloc, /* special_function */
448
         "R_PPC64_GOT16",       /* name */
449
         FALSE,                 /* partial_inplace */
450
         0,                      /* src_mask */
451
         0xffff,                /* dst_mask */
452
         FALSE),                /* pcrel_offset */
453
 
454
  /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
455
     the symbol.  */
456
  HOWTO (R_PPC64_GOT16_LO,      /* type */
457
         0,                      /* rightshift */
458
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
459
         16,                    /* bitsize */
460
         FALSE,                 /* pc_relative */
461
         0,                      /* bitpos */
462
         complain_overflow_dont, /* complain_on_overflow */
463
         ppc64_elf_unhandled_reloc, /* special_function */
464
         "R_PPC64_GOT16_LO",    /* name */
465
         FALSE,                 /* partial_inplace */
466
         0,                      /* src_mask */
467
         0xffff,                /* dst_mask */
468
         FALSE),                /* pcrel_offset */
469
 
470
  /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
471
     the symbol.  */
472
  HOWTO (R_PPC64_GOT16_HI,      /* type */
473
         16,                    /* rightshift */
474
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
475
         16,                    /* bitsize */
476
         FALSE,                 /* pc_relative */
477
         0,                      /* bitpos */
478
         complain_overflow_dont,/* complain_on_overflow */
479
         ppc64_elf_unhandled_reloc, /* special_function */
480
         "R_PPC64_GOT16_HI",    /* name */
481
         FALSE,                 /* partial_inplace */
482
         0,                      /* src_mask */
483
         0xffff,                /* dst_mask */
484
         FALSE),                /* pcrel_offset */
485
 
486
  /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
487
     the symbol.  */
488
  HOWTO (R_PPC64_GOT16_HA,      /* type */
489
         16,                    /* rightshift */
490
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
491
         16,                    /* bitsize */
492
         FALSE,                 /* pc_relative */
493
         0,                      /* bitpos */
494
         complain_overflow_dont,/* complain_on_overflow */
495
         ppc64_elf_unhandled_reloc, /* special_function */
496
         "R_PPC64_GOT16_HA",    /* name */
497
         FALSE,                 /* partial_inplace */
498
         0,                      /* src_mask */
499
         0xffff,                /* dst_mask */
500
         FALSE),                /* pcrel_offset */
501
 
502
  /* This is used only by the dynamic linker.  The symbol should exist
503
     both in the object being run and in some shared library.  The
504
     dynamic linker copies the data addressed by the symbol from the
505
     shared library into the object, because the object being
506
     run has to have the data at some particular address.  */
507
  HOWTO (R_PPC64_COPY,          /* type */
508
         0,                      /* rightshift */
509
         0,                      /* this one is variable size */
510
         0,                      /* bitsize */
511
         FALSE,                 /* pc_relative */
512
         0,                      /* bitpos */
513
         complain_overflow_dont, /* complain_on_overflow */
514
         ppc64_elf_unhandled_reloc, /* special_function */
515
         "R_PPC64_COPY",        /* name */
516
         FALSE,                 /* partial_inplace */
517
         0,                      /* src_mask */
518
         0,                      /* dst_mask */
519
         FALSE),                /* pcrel_offset */
520
 
521
  /* Like R_PPC64_ADDR64, but used when setting global offset table
522
     entries.  */
523
  HOWTO (R_PPC64_GLOB_DAT,      /* type */
524
         0,                      /* rightshift */
525
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
526
         64,                    /* bitsize */
527
         FALSE,                 /* pc_relative */
528
         0,                      /* bitpos */
529
         complain_overflow_dont, /* complain_on_overflow */
530
         ppc64_elf_unhandled_reloc,  /* special_function */
531
         "R_PPC64_GLOB_DAT",    /* name */
532
         FALSE,                 /* partial_inplace */
533
         0,                      /* src_mask */
534
         ONES (64),             /* dst_mask */
535
         FALSE),                /* pcrel_offset */
536
 
537
  /* Created by the link editor.  Marks a procedure linkage table
538
     entry for a symbol.  */
539
  HOWTO (R_PPC64_JMP_SLOT,      /* type */
540
         0,                      /* rightshift */
541
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
542
         0,                      /* bitsize */
543
         FALSE,                 /* pc_relative */
544
         0,                      /* bitpos */
545
         complain_overflow_dont, /* complain_on_overflow */
546
         ppc64_elf_unhandled_reloc, /* special_function */
547
         "R_PPC64_JMP_SLOT",    /* name */
548
         FALSE,                 /* partial_inplace */
549
         0,                      /* src_mask */
550
         0,                      /* dst_mask */
551
         FALSE),                /* pcrel_offset */
552
 
553
  /* Used only by the dynamic linker.  When the object is run, this
554
     doubleword64 is set to the load address of the object, plus the
555
     addend.  */
556
  HOWTO (R_PPC64_RELATIVE,      /* type */
557
         0,                      /* rightshift */
558
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
559
         64,                    /* bitsize */
560
         FALSE,                 /* pc_relative */
561
         0,                      /* bitpos */
562
         complain_overflow_dont, /* complain_on_overflow */
563
         bfd_elf_generic_reloc, /* special_function */
564
         "R_PPC64_RELATIVE",    /* name */
565
         FALSE,                 /* partial_inplace */
566
         0,                      /* src_mask */
567
         ONES (64),             /* dst_mask */
568
         FALSE),                /* pcrel_offset */
569
 
570
  /* Like R_PPC64_ADDR32, but may be unaligned.  */
571
  HOWTO (R_PPC64_UADDR32,       /* type */
572
         0,                      /* rightshift */
573
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
574
         32,                    /* bitsize */
575
         FALSE,                 /* pc_relative */
576
         0,                      /* bitpos */
577
         complain_overflow_bitfield, /* complain_on_overflow */
578
         bfd_elf_generic_reloc, /* special_function */
579
         "R_PPC64_UADDR32",     /* name */
580
         FALSE,                 /* partial_inplace */
581
         0,                      /* src_mask */
582
         0xffffffff,            /* dst_mask */
583
         FALSE),                /* pcrel_offset */
584
 
585
  /* Like R_PPC64_ADDR16, but may be unaligned.  */
586
  HOWTO (R_PPC64_UADDR16,       /* type */
587
         0,                      /* rightshift */
588
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
589
         16,                    /* bitsize */
590
         FALSE,                 /* pc_relative */
591
         0,                      /* bitpos */
592
         complain_overflow_bitfield, /* complain_on_overflow */
593
         bfd_elf_generic_reloc, /* special_function */
594
         "R_PPC64_UADDR16",     /* name */
595
         FALSE,                 /* partial_inplace */
596
         0,                      /* src_mask */
597
         0xffff,                /* dst_mask */
598
         FALSE),                /* pcrel_offset */
599
 
600
  /* 32-bit PC relative.  */
601
  HOWTO (R_PPC64_REL32,         /* type */
602
         0,                      /* rightshift */
603
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
604
         32,                    /* bitsize */
605
         TRUE,                  /* pc_relative */
606
         0,                      /* bitpos */
607
         /* FIXME: Verify.  Was complain_overflow_bitfield.  */
608
         complain_overflow_signed, /* complain_on_overflow */
609
         bfd_elf_generic_reloc, /* special_function */
610
         "R_PPC64_REL32",       /* name */
611
         FALSE,                 /* partial_inplace */
612
         0,                      /* src_mask */
613
         0xffffffff,            /* dst_mask */
614
         TRUE),                 /* pcrel_offset */
615
 
616
  /* 32-bit relocation to the symbol's procedure linkage table.  */
617
  HOWTO (R_PPC64_PLT32,         /* type */
618
         0,                      /* rightshift */
619
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
620
         32,                    /* bitsize */
621
         FALSE,                 /* pc_relative */
622
         0,                      /* bitpos */
623
         complain_overflow_bitfield, /* complain_on_overflow */
624
         ppc64_elf_unhandled_reloc, /* special_function */
625
         "R_PPC64_PLT32",       /* name */
626
         FALSE,                 /* partial_inplace */
627
         0,                      /* src_mask */
628
         0xffffffff,            /* dst_mask */
629
         FALSE),                /* pcrel_offset */
630
 
631
  /* 32-bit PC relative relocation to the symbol's procedure linkage table.
632
     FIXME: R_PPC64_PLTREL32 not supported.  */
633
  HOWTO (R_PPC64_PLTREL32,      /* type */
634
         0,                      /* rightshift */
635
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
636
         32,                    /* bitsize */
637
         TRUE,                  /* pc_relative */
638
         0,                      /* bitpos */
639
         complain_overflow_signed, /* complain_on_overflow */
640
         bfd_elf_generic_reloc, /* special_function */
641
         "R_PPC64_PLTREL32",    /* name */
642
         FALSE,                 /* partial_inplace */
643
         0,                      /* src_mask */
644
         0xffffffff,            /* dst_mask */
645
         TRUE),                 /* pcrel_offset */
646
 
647
  /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
648
     the symbol.  */
649
  HOWTO (R_PPC64_PLT16_LO,      /* type */
650
         0,                      /* rightshift */
651
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
652
         16,                    /* bitsize */
653
         FALSE,                 /* pc_relative */
654
         0,                      /* bitpos */
655
         complain_overflow_dont, /* complain_on_overflow */
656
         ppc64_elf_unhandled_reloc, /* special_function */
657
         "R_PPC64_PLT16_LO",    /* name */
658
         FALSE,                 /* partial_inplace */
659
         0,                      /* src_mask */
660
         0xffff,                /* dst_mask */
661
         FALSE),                /* pcrel_offset */
662
 
663
  /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
664
     the symbol.  */
665
  HOWTO (R_PPC64_PLT16_HI,      /* type */
666
         16,                    /* rightshift */
667
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
668
         16,                    /* bitsize */
669
         FALSE,                 /* pc_relative */
670
         0,                      /* bitpos */
671
         complain_overflow_dont, /* complain_on_overflow */
672
         ppc64_elf_unhandled_reloc, /* special_function */
673
         "R_PPC64_PLT16_HI",    /* name */
674
         FALSE,                 /* partial_inplace */
675
         0,                      /* src_mask */
676
         0xffff,                /* dst_mask */
677
         FALSE),                /* pcrel_offset */
678
 
679
  /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
680
     the symbol.  */
681
  HOWTO (R_PPC64_PLT16_HA,      /* type */
682
         16,                    /* rightshift */
683
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
684
         16,                    /* bitsize */
685
         FALSE,                 /* pc_relative */
686
         0,                      /* bitpos */
687
         complain_overflow_dont, /* complain_on_overflow */
688
         ppc64_elf_unhandled_reloc, /* special_function */
689
         "R_PPC64_PLT16_HA",    /* name */
690
         FALSE,                 /* partial_inplace */
691
         0,                      /* src_mask */
692
         0xffff,                /* dst_mask */
693
         FALSE),                /* pcrel_offset */
694
 
695
  /* 16-bit section relative relocation.  */
696
  HOWTO (R_PPC64_SECTOFF,       /* type */
697
         0,                      /* rightshift */
698
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
699
         16,                    /* bitsize */
700
         FALSE,                 /* pc_relative */
701
         0,                      /* bitpos */
702
         complain_overflow_bitfield, /* complain_on_overflow */
703
         ppc64_elf_sectoff_reloc, /* special_function */
704
         "R_PPC64_SECTOFF",     /* name */
705
         FALSE,                 /* partial_inplace */
706
         0,                      /* src_mask */
707
         0xffff,                /* dst_mask */
708
         FALSE),                /* pcrel_offset */
709
 
710
  /* Like R_PPC64_SECTOFF, but no overflow warning.  */
711
  HOWTO (R_PPC64_SECTOFF_LO,    /* type */
712
         0,                      /* rightshift */
713
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
714
         16,                    /* bitsize */
715
         FALSE,                 /* pc_relative */
716
         0,                      /* bitpos */
717
         complain_overflow_dont, /* complain_on_overflow */
718
         ppc64_elf_sectoff_reloc, /* special_function */
719
         "R_PPC64_SECTOFF_LO",  /* name */
720
         FALSE,                 /* partial_inplace */
721
         0,                      /* src_mask */
722
         0xffff,                /* dst_mask */
723
         FALSE),                /* pcrel_offset */
724
 
725
  /* 16-bit upper half section relative relocation.  */
726
  HOWTO (R_PPC64_SECTOFF_HI,    /* type */
727
         16,                    /* rightshift */
728
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
729
         16,                    /* bitsize */
730
         FALSE,                 /* pc_relative */
731
         0,                      /* bitpos */
732
         complain_overflow_dont, /* complain_on_overflow */
733
         ppc64_elf_sectoff_reloc, /* special_function */
734
         "R_PPC64_SECTOFF_HI",  /* name */
735
         FALSE,                 /* partial_inplace */
736
         0,                      /* src_mask */
737
         0xffff,                /* dst_mask */
738
         FALSE),                /* pcrel_offset */
739
 
740
  /* 16-bit upper half adjusted section relative relocation.  */
741
  HOWTO (R_PPC64_SECTOFF_HA,    /* type */
742
         16,                    /* rightshift */
743
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
744
         16,                    /* bitsize */
745
         FALSE,                 /* pc_relative */
746
         0,                      /* bitpos */
747
         complain_overflow_dont, /* complain_on_overflow */
748
         ppc64_elf_sectoff_ha_reloc, /* special_function */
749
         "R_PPC64_SECTOFF_HA",  /* name */
750
         FALSE,                 /* partial_inplace */
751
         0,                      /* src_mask */
752
         0xffff,                /* dst_mask */
753
         FALSE),                /* pcrel_offset */
754
 
755
  /* Like R_PPC64_REL24 without touching the two least significant bits.  */
756
  HOWTO (R_PPC64_REL30,         /* type */
757
         2,                     /* rightshift */
758
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
759
         30,                    /* bitsize */
760
         TRUE,                  /* pc_relative */
761
         0,                      /* bitpos */
762
         complain_overflow_dont, /* complain_on_overflow */
763
         bfd_elf_generic_reloc, /* special_function */
764
         "R_PPC64_REL30",       /* name */
765
         FALSE,                 /* partial_inplace */
766
         0,                      /* src_mask */
767
         0xfffffffc,            /* dst_mask */
768
         TRUE),                 /* pcrel_offset */
769
 
770
  /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI.  */
771
 
772
  /* A standard 64-bit relocation.  */
773
  HOWTO (R_PPC64_ADDR64,        /* type */
774
         0,                      /* rightshift */
775
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
776
         64,                    /* bitsize */
777
         FALSE,                 /* pc_relative */
778
         0,                      /* bitpos */
779
         complain_overflow_dont, /* complain_on_overflow */
780
         bfd_elf_generic_reloc, /* special_function */
781
         "R_PPC64_ADDR64",      /* name */
782
         FALSE,                 /* partial_inplace */
783
         0,                      /* src_mask */
784
         ONES (64),             /* dst_mask */
785
         FALSE),                /* pcrel_offset */
786
 
787
  /* The bits 32-47 of an address.  */
788
  HOWTO (R_PPC64_ADDR16_HIGHER, /* type */
789
         32,                    /* rightshift */
790
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
791
         16,                    /* bitsize */
792
         FALSE,                 /* pc_relative */
793
         0,                      /* bitpos */
794
         complain_overflow_dont, /* complain_on_overflow */
795
         bfd_elf_generic_reloc, /* special_function */
796
         "R_PPC64_ADDR16_HIGHER", /* name */
797
         FALSE,                 /* partial_inplace */
798
         0,                      /* src_mask */
799
         0xffff,                /* dst_mask */
800
         FALSE),                /* pcrel_offset */
801
 
802
  /* The bits 32-47 of an address, plus 1 if the contents of the low
803
     16 bits, treated as a signed number, is negative.  */
804
  HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */
805
         32,                    /* rightshift */
806
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
807
         16,                    /* bitsize */
808
         FALSE,                 /* pc_relative */
809
         0,                      /* bitpos */
810
         complain_overflow_dont, /* complain_on_overflow */
811
         ppc64_elf_ha_reloc,    /* special_function */
812
         "R_PPC64_ADDR16_HIGHERA", /* name */
813
         FALSE,                 /* partial_inplace */
814
         0,                      /* src_mask */
815
         0xffff,                /* dst_mask */
816
         FALSE),                /* pcrel_offset */
817
 
818
  /* The bits 48-63 of an address.  */
819
  HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */
820
         48,                    /* rightshift */
821
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
822
         16,                    /* bitsize */
823
         FALSE,                 /* pc_relative */
824
         0,                      /* bitpos */
825
         complain_overflow_dont, /* complain_on_overflow */
826
         bfd_elf_generic_reloc, /* special_function */
827
         "R_PPC64_ADDR16_HIGHEST", /* name */
828
         FALSE,                 /* partial_inplace */
829
         0,                      /* src_mask */
830
         0xffff,                /* dst_mask */
831
         FALSE),                /* pcrel_offset */
832
 
833
  /* The bits 48-63 of an address, plus 1 if the contents of the low
834
     16 bits, treated as a signed number, is negative.  */
835
  HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */
836
         48,                    /* rightshift */
837
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
838
         16,                    /* bitsize */
839
         FALSE,                 /* pc_relative */
840
         0,                      /* bitpos */
841
         complain_overflow_dont, /* complain_on_overflow */
842
         ppc64_elf_ha_reloc,    /* special_function */
843
         "R_PPC64_ADDR16_HIGHESTA", /* name */
844
         FALSE,                 /* partial_inplace */
845
         0,                      /* src_mask */
846
         0xffff,                /* dst_mask */
847
         FALSE),                /* pcrel_offset */
848
 
849
  /* Like ADDR64, but may be unaligned.  */
850
  HOWTO (R_PPC64_UADDR64,       /* type */
851
         0,                      /* rightshift */
852
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
853
         64,                    /* bitsize */
854
         FALSE,                 /* pc_relative */
855
         0,                      /* bitpos */
856
         complain_overflow_dont, /* complain_on_overflow */
857
         bfd_elf_generic_reloc, /* special_function */
858
         "R_PPC64_UADDR64",     /* name */
859
         FALSE,                 /* partial_inplace */
860
         0,                      /* src_mask */
861
         ONES (64),             /* dst_mask */
862
         FALSE),                /* pcrel_offset */
863
 
864
  /* 64-bit relative relocation.  */
865
  HOWTO (R_PPC64_REL64,         /* type */
866
         0,                      /* rightshift */
867
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
868
         64,                    /* bitsize */
869
         TRUE,                  /* pc_relative */
870
         0,                      /* bitpos */
871
         complain_overflow_dont, /* complain_on_overflow */
872
         bfd_elf_generic_reloc, /* special_function */
873
         "R_PPC64_REL64",       /* name */
874
         FALSE,                 /* partial_inplace */
875
         0,                      /* src_mask */
876
         ONES (64),             /* dst_mask */
877
         TRUE),                 /* pcrel_offset */
878
 
879
  /* 64-bit relocation to the symbol's procedure linkage table.  */
880
  HOWTO (R_PPC64_PLT64,         /* type */
881
         0,                      /* rightshift */
882
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
883
         64,                    /* bitsize */
884
         FALSE,                 /* pc_relative */
885
         0,                      /* bitpos */
886
         complain_overflow_dont, /* complain_on_overflow */
887
         ppc64_elf_unhandled_reloc, /* special_function */
888
         "R_PPC64_PLT64",       /* name */
889
         FALSE,                 /* partial_inplace */
890
         0,                      /* src_mask */
891
         ONES (64),             /* dst_mask */
892
         FALSE),                /* pcrel_offset */
893
 
894
  /* 64-bit PC relative relocation to the symbol's procedure linkage
895
     table.  */
896
  /* FIXME: R_PPC64_PLTREL64 not supported.  */
897
  HOWTO (R_PPC64_PLTREL64,      /* type */
898
         0,                      /* rightshift */
899
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
900
         64,                    /* bitsize */
901
         TRUE,                  /* pc_relative */
902
         0,                      /* bitpos */
903
         complain_overflow_dont, /* complain_on_overflow */
904
         ppc64_elf_unhandled_reloc, /* special_function */
905
         "R_PPC64_PLTREL64",    /* name */
906
         FALSE,                 /* partial_inplace */
907
         0,                      /* src_mask */
908
         ONES (64),             /* dst_mask */
909
         TRUE),                 /* pcrel_offset */
910
 
911
  /* 16 bit TOC-relative relocation.  */
912
 
913
  /* R_PPC64_TOC16        47       half16*      S + A - .TOC.  */
914
  HOWTO (R_PPC64_TOC16,         /* type */
915
         0,                      /* rightshift */
916
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
917
         16,                    /* bitsize */
918
         FALSE,                 /* pc_relative */
919
         0,                      /* bitpos */
920
         complain_overflow_signed, /* complain_on_overflow */
921
         ppc64_elf_toc_reloc,   /* special_function */
922
         "R_PPC64_TOC16",       /* name */
923
         FALSE,                 /* partial_inplace */
924
         0,                      /* src_mask */
925
         0xffff,                /* dst_mask */
926
         FALSE),                /* pcrel_offset */
927
 
928
  /* 16 bit TOC-relative relocation without overflow.  */
929
 
930
  /* R_PPC64_TOC16_LO     48       half16        #lo (S + A - .TOC.)  */
931
  HOWTO (R_PPC64_TOC16_LO,      /* type */
932
         0,                      /* rightshift */
933
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
934
         16,                    /* bitsize */
935
         FALSE,                 /* pc_relative */
936
         0,                      /* bitpos */
937
         complain_overflow_dont, /* complain_on_overflow */
938
         ppc64_elf_toc_reloc,   /* special_function */
939
         "R_PPC64_TOC16_LO",    /* name */
940
         FALSE,                 /* partial_inplace */
941
         0,                      /* src_mask */
942
         0xffff,                /* dst_mask */
943
         FALSE),                /* pcrel_offset */
944
 
945
  /* 16 bit TOC-relative relocation, high 16 bits.  */
946
 
947
  /* R_PPC64_TOC16_HI     49       half16        #hi (S + A - .TOC.)  */
948
  HOWTO (R_PPC64_TOC16_HI,      /* type */
949
         16,                    /* rightshift */
950
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
951
         16,                    /* bitsize */
952
         FALSE,                 /* pc_relative */
953
         0,                      /* bitpos */
954
         complain_overflow_dont, /* complain_on_overflow */
955
         ppc64_elf_toc_reloc,   /* special_function */
956
         "R_PPC64_TOC16_HI",    /* name */
957
         FALSE,                 /* partial_inplace */
958
         0,                      /* src_mask */
959
         0xffff,                /* dst_mask */
960
         FALSE),                /* pcrel_offset */
961
 
962
  /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
963
     contents of the low 16 bits, treated as a signed number, is
964
     negative.  */
965
 
966
  /* R_PPC64_TOC16_HA     50       half16        #ha (S + A - .TOC.)  */
967
  HOWTO (R_PPC64_TOC16_HA,      /* type */
968
         16,                    /* rightshift */
969
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
970
         16,                    /* bitsize */
971
         FALSE,                 /* pc_relative */
972
         0,                      /* bitpos */
973
         complain_overflow_dont, /* complain_on_overflow */
974
         ppc64_elf_toc_ha_reloc, /* special_function */
975
         "R_PPC64_TOC16_HA",    /* name */
976
         FALSE,                 /* partial_inplace */
977
         0,                      /* src_mask */
978
         0xffff,                /* dst_mask */
979
         FALSE),                /* pcrel_offset */
980
 
981
  /* 64-bit relocation; insert value of TOC base (.TOC.).  */
982
 
983
  /* R_PPC64_TOC                  51       doubleword64  .TOC.  */
984
  HOWTO (R_PPC64_TOC,           /* type */
985
         0,                      /* rightshift */
986
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
987
         64,                    /* bitsize */
988
         FALSE,                 /* pc_relative */
989
         0,                      /* bitpos */
990
         complain_overflow_bitfield, /* complain_on_overflow */
991
         ppc64_elf_toc64_reloc, /* special_function */
992
         "R_PPC64_TOC",         /* name */
993
         FALSE,                 /* partial_inplace */
994
         0,                      /* src_mask */
995
         ONES (64),             /* dst_mask */
996
         FALSE),                /* pcrel_offset */
997
 
998
  /* Like R_PPC64_GOT16, but also informs the link editor that the
999
     value to relocate may (!) refer to a PLT entry which the link
1000
     editor (a) may replace with the symbol value.  If the link editor
1001
     is unable to fully resolve the symbol, it may (b) create a PLT
1002
     entry and store the address to the new PLT entry in the GOT.
1003
     This permits lazy resolution of function symbols at run time.
1004
     The link editor may also skip all of this and just (c) emit a
1005
     R_PPC64_GLOB_DAT to tie the symbol to the GOT entry.  */
1006
  /* FIXME: R_PPC64_PLTGOT16 not implemented.  */
1007
    HOWTO (R_PPC64_PLTGOT16,    /* type */
1008
         0,                      /* rightshift */
1009
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1010
         16,                    /* bitsize */
1011
         FALSE,                 /* pc_relative */
1012
         0,                      /* bitpos */
1013
         complain_overflow_signed, /* complain_on_overflow */
1014
         ppc64_elf_unhandled_reloc, /* special_function */
1015
         "R_PPC64_PLTGOT16",    /* name */
1016
         FALSE,                 /* partial_inplace */
1017
         0,                      /* src_mask */
1018
         0xffff,                /* dst_mask */
1019
         FALSE),                /* pcrel_offset */
1020
 
1021
  /* Like R_PPC64_PLTGOT16, but without overflow.  */
1022
  /* FIXME: R_PPC64_PLTGOT16_LO not implemented.  */
1023
  HOWTO (R_PPC64_PLTGOT16_LO,   /* type */
1024
         0,                      /* rightshift */
1025
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1026
         16,                    /* bitsize */
1027
         FALSE,                 /* pc_relative */
1028
         0,                      /* bitpos */
1029
         complain_overflow_dont, /* complain_on_overflow */
1030
         ppc64_elf_unhandled_reloc, /* special_function */
1031
         "R_PPC64_PLTGOT16_LO", /* name */
1032
         FALSE,                 /* partial_inplace */
1033
         0,                      /* src_mask */
1034
         0xffff,                /* dst_mask */
1035
         FALSE),                /* pcrel_offset */
1036
 
1037
  /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address.  */
1038
  /* FIXME: R_PPC64_PLTGOT16_HI not implemented.  */
1039
  HOWTO (R_PPC64_PLTGOT16_HI,   /* type */
1040
         16,                    /* rightshift */
1041
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1042
         16,                    /* bitsize */
1043
         FALSE,                 /* pc_relative */
1044
         0,                      /* bitpos */
1045
         complain_overflow_dont, /* complain_on_overflow */
1046
         ppc64_elf_unhandled_reloc, /* special_function */
1047
         "R_PPC64_PLTGOT16_HI", /* name */
1048
         FALSE,                 /* partial_inplace */
1049
         0,                      /* src_mask */
1050
         0xffff,                /* dst_mask */
1051
         FALSE),                /* pcrel_offset */
1052
 
1053
  /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1054
     1 if the contents of the low 16 bits, treated as a signed number,
1055
     is negative.  */
1056
  /* FIXME: R_PPC64_PLTGOT16_HA not implemented.  */
1057
  HOWTO (R_PPC64_PLTGOT16_HA,   /* type */
1058
         16,                    /* rightshift */
1059
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1060
         16,                    /* bitsize */
1061
         FALSE,                 /* pc_relative */
1062
         0,                      /* bitpos */
1063
         complain_overflow_dont,/* complain_on_overflow */
1064
         ppc64_elf_unhandled_reloc, /* special_function */
1065
         "R_PPC64_PLTGOT16_HA", /* name */
1066
         FALSE,                 /* partial_inplace */
1067
         0,                      /* src_mask */
1068
         0xffff,                /* dst_mask */
1069
         FALSE),                /* pcrel_offset */
1070
 
1071
  /* Like R_PPC64_ADDR16, but for instructions with a DS field.  */
1072
  HOWTO (R_PPC64_ADDR16_DS,     /* type */
1073
         0,                      /* rightshift */
1074
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1075
         16,                    /* bitsize */
1076
         FALSE,                 /* pc_relative */
1077
         0,                      /* bitpos */
1078
         complain_overflow_bitfield, /* complain_on_overflow */
1079
         bfd_elf_generic_reloc, /* special_function */
1080
         "R_PPC64_ADDR16_DS",   /* name */
1081
         FALSE,                 /* partial_inplace */
1082
         0,                      /* src_mask */
1083
         0xfffc,                /* dst_mask */
1084
         FALSE),                /* pcrel_offset */
1085
 
1086
  /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field.  */
1087
  HOWTO (R_PPC64_ADDR16_LO_DS,  /* type */
1088
         0,                      /* rightshift */
1089
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1090
         16,                    /* bitsize */
1091
         FALSE,                 /* pc_relative */
1092
         0,                      /* bitpos */
1093
         complain_overflow_dont,/* complain_on_overflow */
1094
         bfd_elf_generic_reloc, /* special_function */
1095
         "R_PPC64_ADDR16_LO_DS",/* name */
1096
         FALSE,                 /* partial_inplace */
1097
         0,                      /* src_mask */
1098
         0xfffc,                /* dst_mask */
1099
         FALSE),                /* pcrel_offset */
1100
 
1101
  /* Like R_PPC64_GOT16, but for instructions with a DS field.  */
1102
  HOWTO (R_PPC64_GOT16_DS,      /* type */
1103
         0,                      /* rightshift */
1104
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1105
         16,                    /* bitsize */
1106
         FALSE,                 /* pc_relative */
1107
         0,                      /* bitpos */
1108
         complain_overflow_signed, /* complain_on_overflow */
1109
         ppc64_elf_unhandled_reloc, /* special_function */
1110
         "R_PPC64_GOT16_DS",    /* name */
1111
         FALSE,                 /* partial_inplace */
1112
         0,                      /* src_mask */
1113
         0xfffc,                /* dst_mask */
1114
         FALSE),                /* pcrel_offset */
1115
 
1116
  /* Like R_PPC64_GOT16_LO, but for instructions with a DS field.  */
1117
  HOWTO (R_PPC64_GOT16_LO_DS,   /* type */
1118
         0,                      /* rightshift */
1119
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1120
         16,                    /* bitsize */
1121
         FALSE,                 /* pc_relative */
1122
         0,                      /* bitpos */
1123
         complain_overflow_dont, /* complain_on_overflow */
1124
         ppc64_elf_unhandled_reloc, /* special_function */
1125
         "R_PPC64_GOT16_LO_DS", /* name */
1126
         FALSE,                 /* partial_inplace */
1127
         0,                      /* src_mask */
1128
         0xfffc,                /* dst_mask */
1129
         FALSE),                /* pcrel_offset */
1130
 
1131
  /* Like R_PPC64_PLT16_LO, but for instructions with a DS field.  */
1132
  HOWTO (R_PPC64_PLT16_LO_DS,   /* type */
1133
         0,                      /* rightshift */
1134
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1135
         16,                    /* bitsize */
1136
         FALSE,                 /* pc_relative */
1137
         0,                      /* bitpos */
1138
         complain_overflow_dont, /* complain_on_overflow */
1139
         ppc64_elf_unhandled_reloc, /* special_function */
1140
         "R_PPC64_PLT16_LO_DS", /* name */
1141
         FALSE,                 /* partial_inplace */
1142
         0,                      /* src_mask */
1143
         0xfffc,                /* dst_mask */
1144
         FALSE),                /* pcrel_offset */
1145
 
1146
  /* Like R_PPC64_SECTOFF, but for instructions with a DS field.  */
1147
  HOWTO (R_PPC64_SECTOFF_DS,    /* type */
1148
         0,                      /* rightshift */
1149
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1150
         16,                    /* bitsize */
1151
         FALSE,                 /* pc_relative */
1152
         0,                      /* bitpos */
1153
         complain_overflow_bitfield, /* complain_on_overflow */
1154
         ppc64_elf_sectoff_reloc, /* special_function */
1155
         "R_PPC64_SECTOFF_DS",  /* name */
1156
         FALSE,                 /* partial_inplace */
1157
         0,                      /* src_mask */
1158
         0xfffc,                /* dst_mask */
1159
         FALSE),                /* pcrel_offset */
1160
 
1161
  /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field.  */
1162
  HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */
1163
         0,                      /* rightshift */
1164
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1165
         16,                    /* bitsize */
1166
         FALSE,                 /* pc_relative */
1167
         0,                      /* bitpos */
1168
         complain_overflow_dont, /* complain_on_overflow */
1169
         ppc64_elf_sectoff_reloc, /* special_function */
1170
         "R_PPC64_SECTOFF_LO_DS",/* name */
1171
         FALSE,                 /* partial_inplace */
1172
         0,                      /* src_mask */
1173
         0xfffc,                /* dst_mask */
1174
         FALSE),                /* pcrel_offset */
1175
 
1176
  /* Like R_PPC64_TOC16, but for instructions with a DS field.  */
1177
  HOWTO (R_PPC64_TOC16_DS,      /* type */
1178
         0,                      /* rightshift */
1179
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1180
         16,                    /* bitsize */
1181
         FALSE,                 /* pc_relative */
1182
         0,                      /* bitpos */
1183
         complain_overflow_signed, /* complain_on_overflow */
1184
         ppc64_elf_toc_reloc,   /* special_function */
1185
         "R_PPC64_TOC16_DS",    /* name */
1186
         FALSE,                 /* partial_inplace */
1187
         0,                      /* src_mask */
1188
         0xfffc,                /* dst_mask */
1189
         FALSE),                /* pcrel_offset */
1190
 
1191
  /* Like R_PPC64_TOC16_LO, but for instructions with a DS field.  */
1192
  HOWTO (R_PPC64_TOC16_LO_DS,   /* type */
1193
         0,                      /* rightshift */
1194
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1195
         16,                    /* bitsize */
1196
         FALSE,                 /* pc_relative */
1197
         0,                      /* bitpos */
1198
         complain_overflow_dont, /* complain_on_overflow */
1199
         ppc64_elf_toc_reloc,   /* special_function */
1200
         "R_PPC64_TOC16_LO_DS", /* name */
1201
         FALSE,                 /* partial_inplace */
1202
         0,                      /* src_mask */
1203
         0xfffc,                /* dst_mask */
1204
         FALSE),                /* pcrel_offset */
1205
 
1206
  /* Like R_PPC64_PLTGOT16, but for instructions with a DS field.  */
1207
  /* FIXME: R_PPC64_PLTGOT16_DS not implemented.  */
1208
  HOWTO (R_PPC64_PLTGOT16_DS,   /* type */
1209
         0,                      /* rightshift */
1210
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1211
         16,                    /* bitsize */
1212
         FALSE,                 /* pc_relative */
1213
         0,                      /* bitpos */
1214
         complain_overflow_signed, /* complain_on_overflow */
1215
         ppc64_elf_unhandled_reloc, /* special_function */
1216
         "R_PPC64_PLTGOT16_DS", /* name */
1217
         FALSE,                 /* partial_inplace */
1218
         0,                      /* src_mask */
1219
         0xfffc,                /* dst_mask */
1220
         FALSE),                /* pcrel_offset */
1221
 
1222
  /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field.  */
1223
  /* FIXME: R_PPC64_PLTGOT16_LO not implemented.  */
1224
  HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */
1225
         0,                      /* rightshift */
1226
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1227
         16,                    /* bitsize */
1228
         FALSE,                 /* pc_relative */
1229
         0,                      /* bitpos */
1230
         complain_overflow_dont, /* complain_on_overflow */
1231
         ppc64_elf_unhandled_reloc, /* special_function */
1232
         "R_PPC64_PLTGOT16_LO_DS",/* name */
1233
         FALSE,                 /* partial_inplace */
1234
         0,                      /* src_mask */
1235
         0xfffc,                /* dst_mask */
1236
         FALSE),                /* pcrel_offset */
1237
 
1238
  /* Marker reloc for TLS.  */
1239
  HOWTO (R_PPC64_TLS,
1240
         0,                      /* rightshift */
1241
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1242
         32,                    /* bitsize */
1243
         FALSE,                 /* pc_relative */
1244
         0,                      /* bitpos */
1245
         complain_overflow_dont, /* complain_on_overflow */
1246
         bfd_elf_generic_reloc, /* special_function */
1247
         "R_PPC64_TLS",         /* name */
1248
         FALSE,                 /* partial_inplace */
1249
         0,                      /* src_mask */
1250
         0,                      /* dst_mask */
1251
         FALSE),                /* pcrel_offset */
1252
 
1253
  /* Computes the load module index of the load module that contains the
1254
     definition of its TLS sym.  */
1255
  HOWTO (R_PPC64_DTPMOD64,
1256
         0,                      /* rightshift */
1257
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
1258
         64,                    /* bitsize */
1259
         FALSE,                 /* pc_relative */
1260
         0,                      /* bitpos */
1261
         complain_overflow_dont, /* complain_on_overflow */
1262
         ppc64_elf_unhandled_reloc, /* special_function */
1263
         "R_PPC64_DTPMOD64",    /* name */
1264
         FALSE,                 /* partial_inplace */
1265
         0,                      /* src_mask */
1266
         ONES (64),             /* dst_mask */
1267
         FALSE),                /* pcrel_offset */
1268
 
1269
  /* Computes a dtv-relative displacement, the difference between the value
1270
     of sym+add and the base address of the thread-local storage block that
1271
     contains the definition of sym, minus 0x8000.  */
1272
  HOWTO (R_PPC64_DTPREL64,
1273
         0,                      /* rightshift */
1274
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
1275
         64,                    /* bitsize */
1276
         FALSE,                 /* pc_relative */
1277
         0,                      /* bitpos */
1278
         complain_overflow_dont, /* complain_on_overflow */
1279
         ppc64_elf_unhandled_reloc, /* special_function */
1280
         "R_PPC64_DTPREL64",    /* name */
1281
         FALSE,                 /* partial_inplace */
1282
         0,                      /* src_mask */
1283
         ONES (64),             /* dst_mask */
1284
         FALSE),                /* pcrel_offset */
1285
 
1286
  /* A 16 bit dtprel reloc.  */
1287
  HOWTO (R_PPC64_DTPREL16,
1288
         0,                      /* rightshift */
1289
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1290
         16,                    /* bitsize */
1291
         FALSE,                 /* pc_relative */
1292
         0,                      /* bitpos */
1293
         complain_overflow_signed, /* complain_on_overflow */
1294
         ppc64_elf_unhandled_reloc, /* special_function */
1295
         "R_PPC64_DTPREL16",    /* name */
1296
         FALSE,                 /* partial_inplace */
1297
         0,                      /* src_mask */
1298
         0xffff,                /* dst_mask */
1299
         FALSE),                /* pcrel_offset */
1300
 
1301
  /* Like DTPREL16, but no overflow.  */
1302
  HOWTO (R_PPC64_DTPREL16_LO,
1303
         0,                      /* rightshift */
1304
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1305
         16,                    /* bitsize */
1306
         FALSE,                 /* pc_relative */
1307
         0,                      /* bitpos */
1308
         complain_overflow_dont, /* complain_on_overflow */
1309
         ppc64_elf_unhandled_reloc, /* special_function */
1310
         "R_PPC64_DTPREL16_LO", /* name */
1311
         FALSE,                 /* partial_inplace */
1312
         0,                      /* src_mask */
1313
         0xffff,                /* dst_mask */
1314
         FALSE),                /* pcrel_offset */
1315
 
1316
  /* Like DTPREL16_LO, but next higher group of 16 bits.  */
1317
  HOWTO (R_PPC64_DTPREL16_HI,
1318
         16,                    /* rightshift */
1319
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1320
         16,                    /* bitsize */
1321
         FALSE,                 /* pc_relative */
1322
         0,                      /* bitpos */
1323
         complain_overflow_dont, /* complain_on_overflow */
1324
         ppc64_elf_unhandled_reloc, /* special_function */
1325
         "R_PPC64_DTPREL16_HI", /* name */
1326
         FALSE,                 /* partial_inplace */
1327
         0,                      /* src_mask */
1328
         0xffff,                /* dst_mask */
1329
         FALSE),                /* pcrel_offset */
1330
 
1331
  /* Like DTPREL16_HI, but adjust for low 16 bits.  */
1332
  HOWTO (R_PPC64_DTPREL16_HA,
1333
         16,                    /* rightshift */
1334
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1335
         16,                    /* bitsize */
1336
         FALSE,                 /* pc_relative */
1337
         0,                      /* bitpos */
1338
         complain_overflow_dont, /* complain_on_overflow */
1339
         ppc64_elf_unhandled_reloc, /* special_function */
1340
         "R_PPC64_DTPREL16_HA", /* name */
1341
         FALSE,                 /* partial_inplace */
1342
         0,                      /* src_mask */
1343
         0xffff,                /* dst_mask */
1344
         FALSE),                /* pcrel_offset */
1345
 
1346
  /* Like DTPREL16_HI, but next higher group of 16 bits.  */
1347
  HOWTO (R_PPC64_DTPREL16_HIGHER,
1348
         32,                    /* rightshift */
1349
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1350
         16,                    /* bitsize */
1351
         FALSE,                 /* pc_relative */
1352
         0,                      /* bitpos */
1353
         complain_overflow_dont, /* complain_on_overflow */
1354
         ppc64_elf_unhandled_reloc, /* special_function */
1355
         "R_PPC64_DTPREL16_HIGHER", /* name */
1356
         FALSE,                 /* partial_inplace */
1357
         0,                      /* src_mask */
1358
         0xffff,                /* dst_mask */
1359
         FALSE),                /* pcrel_offset */
1360
 
1361
  /* Like DTPREL16_HIGHER, but adjust for low 16 bits.  */
1362
  HOWTO (R_PPC64_DTPREL16_HIGHERA,
1363
         32,                    /* rightshift */
1364
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1365
         16,                    /* bitsize */
1366
         FALSE,                 /* pc_relative */
1367
         0,                      /* bitpos */
1368
         complain_overflow_dont, /* complain_on_overflow */
1369
         ppc64_elf_unhandled_reloc, /* special_function */
1370
         "R_PPC64_DTPREL16_HIGHERA", /* name */
1371
         FALSE,                 /* partial_inplace */
1372
         0,                      /* src_mask */
1373
         0xffff,                /* dst_mask */
1374
         FALSE),                /* pcrel_offset */
1375
 
1376
  /* Like DTPREL16_HIGHER, but next higher group of 16 bits.  */
1377
  HOWTO (R_PPC64_DTPREL16_HIGHEST,
1378
         48,                    /* rightshift */
1379
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1380
         16,                    /* bitsize */
1381
         FALSE,                 /* pc_relative */
1382
         0,                      /* bitpos */
1383
         complain_overflow_dont, /* complain_on_overflow */
1384
         ppc64_elf_unhandled_reloc, /* special_function */
1385
         "R_PPC64_DTPREL16_HIGHEST", /* name */
1386
         FALSE,                 /* partial_inplace */
1387
         0,                      /* src_mask */
1388
         0xffff,                /* dst_mask */
1389
         FALSE),                /* pcrel_offset */
1390
 
1391
  /* Like DTPREL16_HIGHEST, but adjust for low 16 bits.  */
1392
  HOWTO (R_PPC64_DTPREL16_HIGHESTA,
1393
         48,                    /* rightshift */
1394
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1395
         16,                    /* bitsize */
1396
         FALSE,                 /* pc_relative */
1397
         0,                      /* bitpos */
1398
         complain_overflow_dont, /* complain_on_overflow */
1399
         ppc64_elf_unhandled_reloc, /* special_function */
1400
         "R_PPC64_DTPREL16_HIGHESTA", /* name */
1401
         FALSE,                 /* partial_inplace */
1402
         0,                      /* src_mask */
1403
         0xffff,                /* dst_mask */
1404
         FALSE),                /* pcrel_offset */
1405
 
1406
  /* Like DTPREL16, but for insns with a DS field.  */
1407
  HOWTO (R_PPC64_DTPREL16_DS,
1408
         0,                      /* rightshift */
1409
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1410
         16,                    /* bitsize */
1411
         FALSE,                 /* pc_relative */
1412
         0,                      /* bitpos */
1413
         complain_overflow_signed, /* complain_on_overflow */
1414
         ppc64_elf_unhandled_reloc, /* special_function */
1415
         "R_PPC64_DTPREL16_DS", /* name */
1416
         FALSE,                 /* partial_inplace */
1417
         0,                      /* src_mask */
1418
         0xfffc,                /* dst_mask */
1419
         FALSE),                /* pcrel_offset */
1420
 
1421
  /* Like DTPREL16_DS, but no overflow.  */
1422
  HOWTO (R_PPC64_DTPREL16_LO_DS,
1423
         0,                      /* rightshift */
1424
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1425
         16,                    /* bitsize */
1426
         FALSE,                 /* pc_relative */
1427
         0,                      /* bitpos */
1428
         complain_overflow_dont, /* complain_on_overflow */
1429
         ppc64_elf_unhandled_reloc, /* special_function */
1430
         "R_PPC64_DTPREL16_LO_DS", /* name */
1431
         FALSE,                 /* partial_inplace */
1432
         0,                      /* src_mask */
1433
         0xfffc,                /* dst_mask */
1434
         FALSE),                /* pcrel_offset */
1435
 
1436
  /* Computes a tp-relative displacement, the difference between the value of
1437
     sym+add and the value of the thread pointer (r13).  */
1438
  HOWTO (R_PPC64_TPREL64,
1439
         0,                      /* rightshift */
1440
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
1441
         64,                    /* bitsize */
1442
         FALSE,                 /* pc_relative */
1443
         0,                      /* bitpos */
1444
         complain_overflow_dont, /* complain_on_overflow */
1445
         ppc64_elf_unhandled_reloc, /* special_function */
1446
         "R_PPC64_TPREL64",     /* name */
1447
         FALSE,                 /* partial_inplace */
1448
         0,                      /* src_mask */
1449
         ONES (64),             /* dst_mask */
1450
         FALSE),                /* pcrel_offset */
1451
 
1452
  /* A 16 bit tprel reloc.  */
1453
  HOWTO (R_PPC64_TPREL16,
1454
         0,                      /* rightshift */
1455
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1456
         16,                    /* bitsize */
1457
         FALSE,                 /* pc_relative */
1458
         0,                      /* bitpos */
1459
         complain_overflow_signed, /* complain_on_overflow */
1460
         ppc64_elf_unhandled_reloc, /* special_function */
1461
         "R_PPC64_TPREL16",     /* name */
1462
         FALSE,                 /* partial_inplace */
1463
         0,                      /* src_mask */
1464
         0xffff,                /* dst_mask */
1465
         FALSE),                /* pcrel_offset */
1466
 
1467
  /* Like TPREL16, but no overflow.  */
1468
  HOWTO (R_PPC64_TPREL16_LO,
1469
         0,                      /* rightshift */
1470
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1471
         16,                    /* bitsize */
1472
         FALSE,                 /* pc_relative */
1473
         0,                      /* bitpos */
1474
         complain_overflow_dont, /* complain_on_overflow */
1475
         ppc64_elf_unhandled_reloc, /* special_function */
1476
         "R_PPC64_TPREL16_LO",  /* name */
1477
         FALSE,                 /* partial_inplace */
1478
         0,                      /* src_mask */
1479
         0xffff,                /* dst_mask */
1480
         FALSE),                /* pcrel_offset */
1481
 
1482
  /* Like TPREL16_LO, but next higher group of 16 bits.  */
1483
  HOWTO (R_PPC64_TPREL16_HI,
1484
         16,                    /* rightshift */
1485
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1486
         16,                    /* bitsize */
1487
         FALSE,                 /* pc_relative */
1488
         0,                      /* bitpos */
1489
         complain_overflow_dont, /* complain_on_overflow */
1490
         ppc64_elf_unhandled_reloc, /* special_function */
1491
         "R_PPC64_TPREL16_HI",  /* name */
1492
         FALSE,                 /* partial_inplace */
1493
         0,                      /* src_mask */
1494
         0xffff,                /* dst_mask */
1495
         FALSE),                /* pcrel_offset */
1496
 
1497
  /* Like TPREL16_HI, but adjust for low 16 bits.  */
1498
  HOWTO (R_PPC64_TPREL16_HA,
1499
         16,                    /* rightshift */
1500
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1501
         16,                    /* bitsize */
1502
         FALSE,                 /* pc_relative */
1503
         0,                      /* bitpos */
1504
         complain_overflow_dont, /* complain_on_overflow */
1505
         ppc64_elf_unhandled_reloc, /* special_function */
1506
         "R_PPC64_TPREL16_HA",  /* name */
1507
         FALSE,                 /* partial_inplace */
1508
         0,                      /* src_mask */
1509
         0xffff,                /* dst_mask */
1510
         FALSE),                /* pcrel_offset */
1511
 
1512
  /* Like TPREL16_HI, but next higher group of 16 bits.  */
1513
  HOWTO (R_PPC64_TPREL16_HIGHER,
1514
         32,                    /* rightshift */
1515
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1516
         16,                    /* bitsize */
1517
         FALSE,                 /* pc_relative */
1518
         0,                      /* bitpos */
1519
         complain_overflow_dont, /* complain_on_overflow */
1520
         ppc64_elf_unhandled_reloc, /* special_function */
1521
         "R_PPC64_TPREL16_HIGHER",      /* name */
1522
         FALSE,                 /* partial_inplace */
1523
         0,                      /* src_mask */
1524
         0xffff,                /* dst_mask */
1525
         FALSE),                /* pcrel_offset */
1526
 
1527
  /* Like TPREL16_HIGHER, but adjust for low 16 bits.  */
1528
  HOWTO (R_PPC64_TPREL16_HIGHERA,
1529
         32,                    /* rightshift */
1530
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1531
         16,                    /* bitsize */
1532
         FALSE,                 /* pc_relative */
1533
         0,                      /* bitpos */
1534
         complain_overflow_dont, /* complain_on_overflow */
1535
         ppc64_elf_unhandled_reloc, /* special_function */
1536
         "R_PPC64_TPREL16_HIGHERA", /* name */
1537
         FALSE,                 /* partial_inplace */
1538
         0,                      /* src_mask */
1539
         0xffff,                /* dst_mask */
1540
         FALSE),                /* pcrel_offset */
1541
 
1542
  /* Like TPREL16_HIGHER, but next higher group of 16 bits.  */
1543
  HOWTO (R_PPC64_TPREL16_HIGHEST,
1544
         48,                    /* rightshift */
1545
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1546
         16,                    /* bitsize */
1547
         FALSE,                 /* pc_relative */
1548
         0,                      /* bitpos */
1549
         complain_overflow_dont, /* complain_on_overflow */
1550
         ppc64_elf_unhandled_reloc, /* special_function */
1551
         "R_PPC64_TPREL16_HIGHEST", /* name */
1552
         FALSE,                 /* partial_inplace */
1553
         0,                      /* src_mask */
1554
         0xffff,                /* dst_mask */
1555
         FALSE),                /* pcrel_offset */
1556
 
1557
  /* Like TPREL16_HIGHEST, but adjust for low 16 bits.  */
1558
  HOWTO (R_PPC64_TPREL16_HIGHESTA,
1559
         48,                    /* rightshift */
1560
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1561
         16,                    /* bitsize */
1562
         FALSE,                 /* pc_relative */
1563
         0,                      /* bitpos */
1564
         complain_overflow_dont, /* complain_on_overflow */
1565
         ppc64_elf_unhandled_reloc, /* special_function */
1566
         "R_PPC64_TPREL16_HIGHESTA", /* name */
1567
         FALSE,                 /* partial_inplace */
1568
         0,                      /* src_mask */
1569
         0xffff,                /* dst_mask */
1570
         FALSE),                /* pcrel_offset */
1571
 
1572
  /* Like TPREL16, but for insns with a DS field.  */
1573
  HOWTO (R_PPC64_TPREL16_DS,
1574
         0,                      /* rightshift */
1575
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1576
         16,                    /* bitsize */
1577
         FALSE,                 /* pc_relative */
1578
         0,                      /* bitpos */
1579
         complain_overflow_signed, /* complain_on_overflow */
1580
         ppc64_elf_unhandled_reloc, /* special_function */
1581
         "R_PPC64_TPREL16_DS",  /* name */
1582
         FALSE,                 /* partial_inplace */
1583
         0,                      /* src_mask */
1584
         0xfffc,                /* dst_mask */
1585
         FALSE),                /* pcrel_offset */
1586
 
1587
  /* Like TPREL16_DS, but no overflow.  */
1588
  HOWTO (R_PPC64_TPREL16_LO_DS,
1589
         0,                      /* rightshift */
1590
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1591
         16,                    /* bitsize */
1592
         FALSE,                 /* pc_relative */
1593
         0,                      /* bitpos */
1594
         complain_overflow_dont, /* complain_on_overflow */
1595
         ppc64_elf_unhandled_reloc, /* special_function */
1596
         "R_PPC64_TPREL16_LO_DS", /* name */
1597
         FALSE,                 /* partial_inplace */
1598
         0,                      /* src_mask */
1599
         0xfffc,                /* dst_mask */
1600
         FALSE),                /* pcrel_offset */
1601
 
1602
  /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1603
     with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1604
     to the first entry relative to the TOC base (r2).  */
1605
  HOWTO (R_PPC64_GOT_TLSGD16,
1606
         0,                      /* rightshift */
1607
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1608
         16,                    /* bitsize */
1609
         FALSE,                 /* pc_relative */
1610
         0,                      /* bitpos */
1611
         complain_overflow_signed, /* complain_on_overflow */
1612
         ppc64_elf_unhandled_reloc, /* special_function */
1613
         "R_PPC64_GOT_TLSGD16", /* name */
1614
         FALSE,                 /* partial_inplace */
1615
         0,                      /* src_mask */
1616
         0xffff,                /* dst_mask */
1617
         FALSE),                /* pcrel_offset */
1618
 
1619
  /* Like GOT_TLSGD16, but no overflow.  */
1620
  HOWTO (R_PPC64_GOT_TLSGD16_LO,
1621
         0,                      /* rightshift */
1622
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1623
         16,                    /* bitsize */
1624
         FALSE,                 /* pc_relative */
1625
         0,                      /* bitpos */
1626
         complain_overflow_dont, /* complain_on_overflow */
1627
         ppc64_elf_unhandled_reloc, /* special_function */
1628
         "R_PPC64_GOT_TLSGD16_LO", /* name */
1629
         FALSE,                 /* partial_inplace */
1630
         0,                      /* src_mask */
1631
         0xffff,                /* dst_mask */
1632
         FALSE),                /* pcrel_offset */
1633
 
1634
  /* Like GOT_TLSGD16_LO, but next higher group of 16 bits.  */
1635
  HOWTO (R_PPC64_GOT_TLSGD16_HI,
1636
         16,                    /* rightshift */
1637
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1638
         16,                    /* bitsize */
1639
         FALSE,                 /* pc_relative */
1640
         0,                      /* bitpos */
1641
         complain_overflow_dont, /* complain_on_overflow */
1642
         ppc64_elf_unhandled_reloc, /* special_function */
1643
         "R_PPC64_GOT_TLSGD16_HI", /* name */
1644
         FALSE,                 /* partial_inplace */
1645
         0,                      /* src_mask */
1646
         0xffff,                /* dst_mask */
1647
         FALSE),                /* pcrel_offset */
1648
 
1649
  /* Like GOT_TLSGD16_HI, but adjust for low 16 bits.  */
1650
  HOWTO (R_PPC64_GOT_TLSGD16_HA,
1651
         16,                    /* rightshift */
1652
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1653
         16,                    /* bitsize */
1654
         FALSE,                 /* pc_relative */
1655
         0,                      /* bitpos */
1656
         complain_overflow_dont, /* complain_on_overflow */
1657
         ppc64_elf_unhandled_reloc, /* special_function */
1658
         "R_PPC64_GOT_TLSGD16_HA", /* name */
1659
         FALSE,                 /* partial_inplace */
1660
         0,                      /* src_mask */
1661
         0xffff,                /* dst_mask */
1662
         FALSE),                /* pcrel_offset */
1663
 
1664
  /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1665
     with values (sym+add)@dtpmod and zero, and computes the offset to the
1666
     first entry relative to the TOC base (r2).  */
1667
  HOWTO (R_PPC64_GOT_TLSLD16,
1668
         0,                      /* rightshift */
1669
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1670
         16,                    /* bitsize */
1671
         FALSE,                 /* pc_relative */
1672
         0,                      /* bitpos */
1673
         complain_overflow_signed, /* complain_on_overflow */
1674
         ppc64_elf_unhandled_reloc, /* special_function */
1675
         "R_PPC64_GOT_TLSLD16", /* name */
1676
         FALSE,                 /* partial_inplace */
1677
         0,                      /* src_mask */
1678
         0xffff,                /* dst_mask */
1679
         FALSE),                /* pcrel_offset */
1680
 
1681
  /* Like GOT_TLSLD16, but no overflow.  */
1682
  HOWTO (R_PPC64_GOT_TLSLD16_LO,
1683
         0,                      /* rightshift */
1684
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1685
         16,                    /* bitsize */
1686
         FALSE,                 /* pc_relative */
1687
         0,                      /* bitpos */
1688
         complain_overflow_dont, /* complain_on_overflow */
1689
         ppc64_elf_unhandled_reloc, /* special_function */
1690
         "R_PPC64_GOT_TLSLD16_LO", /* name */
1691
         FALSE,                 /* partial_inplace */
1692
         0,                      /* src_mask */
1693
         0xffff,                /* dst_mask */
1694
         FALSE),                /* pcrel_offset */
1695
 
1696
  /* Like GOT_TLSLD16_LO, but next higher group of 16 bits.  */
1697
  HOWTO (R_PPC64_GOT_TLSLD16_HI,
1698
         16,                    /* rightshift */
1699
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1700
         16,                    /* bitsize */
1701
         FALSE,                 /* pc_relative */
1702
         0,                      /* bitpos */
1703
         complain_overflow_dont, /* complain_on_overflow */
1704
         ppc64_elf_unhandled_reloc, /* special_function */
1705
         "R_PPC64_GOT_TLSLD16_HI", /* name */
1706
         FALSE,                 /* partial_inplace */
1707
         0,                      /* src_mask */
1708
         0xffff,                /* dst_mask */
1709
         FALSE),                /* pcrel_offset */
1710
 
1711
  /* Like GOT_TLSLD16_HI, but adjust for low 16 bits.  */
1712
  HOWTO (R_PPC64_GOT_TLSLD16_HA,
1713
         16,                    /* rightshift */
1714
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1715
         16,                    /* bitsize */
1716
         FALSE,                 /* pc_relative */
1717
         0,                      /* bitpos */
1718
         complain_overflow_dont, /* complain_on_overflow */
1719
         ppc64_elf_unhandled_reloc, /* special_function */
1720
         "R_PPC64_GOT_TLSLD16_HA", /* name */
1721
         FALSE,                 /* partial_inplace */
1722
         0,                      /* src_mask */
1723
         0xffff,                /* dst_mask */
1724
         FALSE),                /* pcrel_offset */
1725
 
1726
  /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1727
     the offset to the entry relative to the TOC base (r2).  */
1728
  HOWTO (R_PPC64_GOT_DTPREL16_DS,
1729
         0,                      /* rightshift */
1730
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1731
         16,                    /* bitsize */
1732
         FALSE,                 /* pc_relative */
1733
         0,                      /* bitpos */
1734
         complain_overflow_signed, /* complain_on_overflow */
1735
         ppc64_elf_unhandled_reloc, /* special_function */
1736
         "R_PPC64_GOT_DTPREL16_DS", /* name */
1737
         FALSE,                 /* partial_inplace */
1738
         0,                      /* src_mask */
1739
         0xfffc,                /* dst_mask */
1740
         FALSE),                /* pcrel_offset */
1741
 
1742
  /* Like GOT_DTPREL16_DS, but no overflow.  */
1743
  HOWTO (R_PPC64_GOT_DTPREL16_LO_DS,
1744
         0,                      /* rightshift */
1745
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1746
         16,                    /* bitsize */
1747
         FALSE,                 /* pc_relative */
1748
         0,                      /* bitpos */
1749
         complain_overflow_dont, /* complain_on_overflow */
1750
         ppc64_elf_unhandled_reloc, /* special_function */
1751
         "R_PPC64_GOT_DTPREL16_LO_DS", /* name */
1752
         FALSE,                 /* partial_inplace */
1753
         0,                      /* src_mask */
1754
         0xfffc,                /* dst_mask */
1755
         FALSE),                /* pcrel_offset */
1756
 
1757
  /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits.  */
1758
  HOWTO (R_PPC64_GOT_DTPREL16_HI,
1759
         16,                    /* rightshift */
1760
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1761
         16,                    /* bitsize */
1762
         FALSE,                 /* pc_relative */
1763
         0,                      /* bitpos */
1764
         complain_overflow_dont, /* complain_on_overflow */
1765
         ppc64_elf_unhandled_reloc, /* special_function */
1766
         "R_PPC64_GOT_DTPREL16_HI", /* name */
1767
         FALSE,                 /* partial_inplace */
1768
         0,                      /* src_mask */
1769
         0xffff,                /* dst_mask */
1770
         FALSE),                /* pcrel_offset */
1771
 
1772
  /* Like GOT_DTPREL16_HI, but adjust for low 16 bits.  */
1773
  HOWTO (R_PPC64_GOT_DTPREL16_HA,
1774
         16,                    /* rightshift */
1775
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1776
         16,                    /* bitsize */
1777
         FALSE,                 /* pc_relative */
1778
         0,                      /* bitpos */
1779
         complain_overflow_dont, /* complain_on_overflow */
1780
         ppc64_elf_unhandled_reloc, /* special_function */
1781
         "R_PPC64_GOT_DTPREL16_HA", /* name */
1782
         FALSE,                 /* partial_inplace */
1783
         0,                      /* src_mask */
1784
         0xffff,                /* dst_mask */
1785
         FALSE),                /* pcrel_offset */
1786
 
1787
  /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1788
     offset to the entry relative to the TOC base (r2).  */
1789
  HOWTO (R_PPC64_GOT_TPREL16_DS,
1790
         0,                      /* rightshift */
1791
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1792
         16,                    /* bitsize */
1793
         FALSE,                 /* pc_relative */
1794
         0,                      /* bitpos */
1795
         complain_overflow_signed, /* complain_on_overflow */
1796
         ppc64_elf_unhandled_reloc, /* special_function */
1797
         "R_PPC64_GOT_TPREL16_DS", /* name */
1798
         FALSE,                 /* partial_inplace */
1799
         0,                      /* src_mask */
1800
         0xfffc,                /* dst_mask */
1801
         FALSE),                /* pcrel_offset */
1802
 
1803
  /* Like GOT_TPREL16_DS, but no overflow.  */
1804
  HOWTO (R_PPC64_GOT_TPREL16_LO_DS,
1805
         0,                      /* rightshift */
1806
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1807
         16,                    /* bitsize */
1808
         FALSE,                 /* pc_relative */
1809
         0,                      /* bitpos */
1810
         complain_overflow_dont, /* complain_on_overflow */
1811
         ppc64_elf_unhandled_reloc, /* special_function */
1812
         "R_PPC64_GOT_TPREL16_LO_DS", /* name */
1813
         FALSE,                 /* partial_inplace */
1814
         0,                      /* src_mask */
1815
         0xfffc,                /* dst_mask */
1816
         FALSE),                /* pcrel_offset */
1817
 
1818
  /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits.  */
1819
  HOWTO (R_PPC64_GOT_TPREL16_HI,
1820
         16,                    /* rightshift */
1821
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1822
         16,                    /* bitsize */
1823
         FALSE,                 /* pc_relative */
1824
         0,                      /* bitpos */
1825
         complain_overflow_dont, /* complain_on_overflow */
1826
         ppc64_elf_unhandled_reloc, /* special_function */
1827
         "R_PPC64_GOT_TPREL16_HI", /* name */
1828
         FALSE,                 /* partial_inplace */
1829
         0,                      /* src_mask */
1830
         0xffff,                /* dst_mask */
1831
         FALSE),                /* pcrel_offset */
1832
 
1833
  /* Like GOT_TPREL16_HI, but adjust for low 16 bits.  */
1834
  HOWTO (R_PPC64_GOT_TPREL16_HA,
1835
         16,                    /* rightshift */
1836
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1837
         16,                    /* bitsize */
1838
         FALSE,                 /* pc_relative */
1839
         0,                      /* bitpos */
1840
         complain_overflow_dont, /* complain_on_overflow */
1841
         ppc64_elf_unhandled_reloc, /* special_function */
1842
         "R_PPC64_GOT_TPREL16_HA", /* name */
1843
         FALSE,                 /* partial_inplace */
1844
         0,                      /* src_mask */
1845
         0xffff,                /* dst_mask */
1846
         FALSE),                /* pcrel_offset */
1847
 
1848
  /* GNU extension to record C++ vtable hierarchy.  */
1849
  HOWTO (R_PPC64_GNU_VTINHERIT, /* type */
1850
         0,                      /* rightshift */
1851
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
1852
         0,                      /* bitsize */
1853
         FALSE,                 /* pc_relative */
1854
         0,                      /* bitpos */
1855
         complain_overflow_dont, /* complain_on_overflow */
1856
         NULL,                  /* special_function */
1857
         "R_PPC64_GNU_VTINHERIT", /* name */
1858
         FALSE,                 /* partial_inplace */
1859
         0,                      /* src_mask */
1860
         0,                      /* dst_mask */
1861
         FALSE),                /* pcrel_offset */
1862
 
1863
  /* GNU extension to record C++ vtable member usage.  */
1864
  HOWTO (R_PPC64_GNU_VTENTRY,   /* type */
1865
         0,                      /* rightshift */
1866
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
1867
         0,                      /* bitsize */
1868
         FALSE,                 /* pc_relative */
1869
         0,                      /* bitpos */
1870
         complain_overflow_dont, /* complain_on_overflow */
1871
         NULL,                  /* special_function */
1872
         "R_PPC64_GNU_VTENTRY", /* name */
1873
         FALSE,                 /* partial_inplace */
1874
         0,                      /* src_mask */
1875
         0,                      /* dst_mask */
1876
         FALSE),                /* pcrel_offset */
1877
};
1878
 
1879
 
1880
/* Initialize the ppc64_elf_howto_table, so that linear accesses can
1881
   be done.  */
1882
 
1883
static void
1884
ppc_howto_init (void)
1885
{
1886
  unsigned int i, type;
1887
 
1888
  for (i = 0;
1889
       i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
1890
       i++)
1891
    {
1892
      type = ppc64_elf_howto_raw[i].type;
1893
      BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table)
1894
                          / sizeof (ppc64_elf_howto_table[0])));
1895
      ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
1896
    }
1897
}
1898
 
1899
static reloc_howto_type *
1900
ppc64_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1901
                             bfd_reloc_code_real_type code)
1902
{
1903
  enum elf_ppc64_reloc_type r = R_PPC64_NONE;
1904
 
1905
  if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
1906
    /* Initialize howto table if needed.  */
1907
    ppc_howto_init ();
1908
 
1909
  switch (code)
1910
    {
1911
    default:
1912
      return NULL;
1913
 
1914
    case BFD_RELOC_NONE:                        r = R_PPC64_NONE;
1915
      break;
1916
    case BFD_RELOC_32:                          r = R_PPC64_ADDR32;
1917
      break;
1918
    case BFD_RELOC_PPC_BA26:                    r = R_PPC64_ADDR24;
1919
      break;
1920
    case BFD_RELOC_16:                          r = R_PPC64_ADDR16;
1921
      break;
1922
    case BFD_RELOC_LO16:                        r = R_PPC64_ADDR16_LO;
1923
      break;
1924
    case BFD_RELOC_HI16:                        r = R_PPC64_ADDR16_HI;
1925
      break;
1926
    case BFD_RELOC_HI16_S:                      r = R_PPC64_ADDR16_HA;
1927
      break;
1928
    case BFD_RELOC_PPC_BA16:                    r = R_PPC64_ADDR14;
1929
      break;
1930
    case BFD_RELOC_PPC_BA16_BRTAKEN:            r = R_PPC64_ADDR14_BRTAKEN;
1931
      break;
1932
    case BFD_RELOC_PPC_BA16_BRNTAKEN:           r = R_PPC64_ADDR14_BRNTAKEN;
1933
      break;
1934
    case BFD_RELOC_PPC_B26:                     r = R_PPC64_REL24;
1935
      break;
1936
    case BFD_RELOC_PPC_B16:                     r = R_PPC64_REL14;
1937
      break;
1938
    case BFD_RELOC_PPC_B16_BRTAKEN:             r = R_PPC64_REL14_BRTAKEN;
1939
      break;
1940
    case BFD_RELOC_PPC_B16_BRNTAKEN:            r = R_PPC64_REL14_BRNTAKEN;
1941
      break;
1942
    case BFD_RELOC_16_GOTOFF:                   r = R_PPC64_GOT16;
1943
      break;
1944
    case BFD_RELOC_LO16_GOTOFF:                 r = R_PPC64_GOT16_LO;
1945
      break;
1946
    case BFD_RELOC_HI16_GOTOFF:                 r = R_PPC64_GOT16_HI;
1947
      break;
1948
    case BFD_RELOC_HI16_S_GOTOFF:               r = R_PPC64_GOT16_HA;
1949
      break;
1950
    case BFD_RELOC_PPC_COPY:                    r = R_PPC64_COPY;
1951
      break;
1952
    case BFD_RELOC_PPC_GLOB_DAT:                r = R_PPC64_GLOB_DAT;
1953
      break;
1954
    case BFD_RELOC_32_PCREL:                    r = R_PPC64_REL32;
1955
      break;
1956
    case BFD_RELOC_32_PLTOFF:                   r = R_PPC64_PLT32;
1957
      break;
1958
    case BFD_RELOC_32_PLT_PCREL:                r = R_PPC64_PLTREL32;
1959
      break;
1960
    case BFD_RELOC_LO16_PLTOFF:                 r = R_PPC64_PLT16_LO;
1961
      break;
1962
    case BFD_RELOC_HI16_PLTOFF:                 r = R_PPC64_PLT16_HI;
1963
      break;
1964
    case BFD_RELOC_HI16_S_PLTOFF:               r = R_PPC64_PLT16_HA;
1965
      break;
1966
    case BFD_RELOC_16_BASEREL:                  r = R_PPC64_SECTOFF;
1967
      break;
1968
    case BFD_RELOC_LO16_BASEREL:                r = R_PPC64_SECTOFF_LO;
1969
      break;
1970
    case BFD_RELOC_HI16_BASEREL:                r = R_PPC64_SECTOFF_HI;
1971
      break;
1972
    case BFD_RELOC_HI16_S_BASEREL:              r = R_PPC64_SECTOFF_HA;
1973
      break;
1974
    case BFD_RELOC_CTOR:                        r = R_PPC64_ADDR64;
1975
      break;
1976
    case BFD_RELOC_64:                          r = R_PPC64_ADDR64;
1977
      break;
1978
    case BFD_RELOC_PPC64_HIGHER:                r = R_PPC64_ADDR16_HIGHER;
1979
      break;
1980
    case BFD_RELOC_PPC64_HIGHER_S:              r = R_PPC64_ADDR16_HIGHERA;
1981
      break;
1982
    case BFD_RELOC_PPC64_HIGHEST:               r = R_PPC64_ADDR16_HIGHEST;
1983
      break;
1984
    case BFD_RELOC_PPC64_HIGHEST_S:             r = R_PPC64_ADDR16_HIGHESTA;
1985
      break;
1986
    case BFD_RELOC_64_PCREL:                    r = R_PPC64_REL64;
1987
      break;
1988
    case BFD_RELOC_64_PLTOFF:                   r = R_PPC64_PLT64;
1989
      break;
1990
    case BFD_RELOC_64_PLT_PCREL:                r = R_PPC64_PLTREL64;
1991
      break;
1992
    case BFD_RELOC_PPC_TOC16:                   r = R_PPC64_TOC16;
1993
      break;
1994
    case BFD_RELOC_PPC64_TOC16_LO:              r = R_PPC64_TOC16_LO;
1995
      break;
1996
    case BFD_RELOC_PPC64_TOC16_HI:              r = R_PPC64_TOC16_HI;
1997
      break;
1998
    case BFD_RELOC_PPC64_TOC16_HA:              r = R_PPC64_TOC16_HA;
1999
      break;
2000
    case BFD_RELOC_PPC64_TOC:                   r = R_PPC64_TOC;
2001
      break;
2002
    case BFD_RELOC_PPC64_PLTGOT16:              r = R_PPC64_PLTGOT16;
2003
      break;
2004
    case BFD_RELOC_PPC64_PLTGOT16_LO:           r = R_PPC64_PLTGOT16_LO;
2005
      break;
2006
    case BFD_RELOC_PPC64_PLTGOT16_HI:           r = R_PPC64_PLTGOT16_HI;
2007
      break;
2008
    case BFD_RELOC_PPC64_PLTGOT16_HA:           r = R_PPC64_PLTGOT16_HA;
2009
      break;
2010
    case BFD_RELOC_PPC64_ADDR16_DS:             r = R_PPC64_ADDR16_DS;
2011
      break;
2012
    case BFD_RELOC_PPC64_ADDR16_LO_DS:          r = R_PPC64_ADDR16_LO_DS;
2013
      break;
2014
    case BFD_RELOC_PPC64_GOT16_DS:              r = R_PPC64_GOT16_DS;
2015
      break;
2016
    case BFD_RELOC_PPC64_GOT16_LO_DS:           r = R_PPC64_GOT16_LO_DS;
2017
      break;
2018
    case BFD_RELOC_PPC64_PLT16_LO_DS:           r = R_PPC64_PLT16_LO_DS;
2019
      break;
2020
    case BFD_RELOC_PPC64_SECTOFF_DS:            r = R_PPC64_SECTOFF_DS;
2021
      break;
2022
    case BFD_RELOC_PPC64_SECTOFF_LO_DS:         r = R_PPC64_SECTOFF_LO_DS;
2023
      break;
2024
    case BFD_RELOC_PPC64_TOC16_DS:              r = R_PPC64_TOC16_DS;
2025
      break;
2026
    case BFD_RELOC_PPC64_TOC16_LO_DS:           r = R_PPC64_TOC16_LO_DS;
2027
      break;
2028
    case BFD_RELOC_PPC64_PLTGOT16_DS:           r = R_PPC64_PLTGOT16_DS;
2029
      break;
2030
    case BFD_RELOC_PPC64_PLTGOT16_LO_DS:        r = R_PPC64_PLTGOT16_LO_DS;
2031
      break;
2032
    case BFD_RELOC_PPC_TLS:                     r = R_PPC64_TLS;
2033
      break;
2034
    case BFD_RELOC_PPC_DTPMOD:                  r = R_PPC64_DTPMOD64;
2035
      break;
2036
    case BFD_RELOC_PPC_TPREL16:                 r = R_PPC64_TPREL16;
2037
      break;
2038
    case BFD_RELOC_PPC_TPREL16_LO:              r = R_PPC64_TPREL16_LO;
2039
      break;
2040
    case BFD_RELOC_PPC_TPREL16_HI:              r = R_PPC64_TPREL16_HI;
2041
      break;
2042
    case BFD_RELOC_PPC_TPREL16_HA:              r = R_PPC64_TPREL16_HA;
2043
      break;
2044
    case BFD_RELOC_PPC_TPREL:                   r = R_PPC64_TPREL64;
2045
      break;
2046
    case BFD_RELOC_PPC_DTPREL16:                r = R_PPC64_DTPREL16;
2047
      break;
2048
    case BFD_RELOC_PPC_DTPREL16_LO:             r = R_PPC64_DTPREL16_LO;
2049
      break;
2050
    case BFD_RELOC_PPC_DTPREL16_HI:             r = R_PPC64_DTPREL16_HI;
2051
      break;
2052
    case BFD_RELOC_PPC_DTPREL16_HA:             r = R_PPC64_DTPREL16_HA;
2053
      break;
2054
    case BFD_RELOC_PPC_DTPREL:                  r = R_PPC64_DTPREL64;
2055
      break;
2056
    case BFD_RELOC_PPC_GOT_TLSGD16:             r = R_PPC64_GOT_TLSGD16;
2057
      break;
2058
    case BFD_RELOC_PPC_GOT_TLSGD16_LO:          r = R_PPC64_GOT_TLSGD16_LO;
2059
      break;
2060
    case BFD_RELOC_PPC_GOT_TLSGD16_HI:          r = R_PPC64_GOT_TLSGD16_HI;
2061
      break;
2062
    case BFD_RELOC_PPC_GOT_TLSGD16_HA:          r = R_PPC64_GOT_TLSGD16_HA;
2063
      break;
2064
    case BFD_RELOC_PPC_GOT_TLSLD16:             r = R_PPC64_GOT_TLSLD16;
2065
      break;
2066
    case BFD_RELOC_PPC_GOT_TLSLD16_LO:          r = R_PPC64_GOT_TLSLD16_LO;
2067
      break;
2068
    case BFD_RELOC_PPC_GOT_TLSLD16_HI:          r = R_PPC64_GOT_TLSLD16_HI;
2069
      break;
2070
    case BFD_RELOC_PPC_GOT_TLSLD16_HA:          r = R_PPC64_GOT_TLSLD16_HA;
2071
      break;
2072
    case BFD_RELOC_PPC_GOT_TPREL16:             r = R_PPC64_GOT_TPREL16_DS;
2073
      break;
2074
    case BFD_RELOC_PPC_GOT_TPREL16_LO:          r = R_PPC64_GOT_TPREL16_LO_DS;
2075
      break;
2076
    case BFD_RELOC_PPC_GOT_TPREL16_HI:          r = R_PPC64_GOT_TPREL16_HI;
2077
      break;
2078
    case BFD_RELOC_PPC_GOT_TPREL16_HA:          r = R_PPC64_GOT_TPREL16_HA;
2079
      break;
2080
    case BFD_RELOC_PPC_GOT_DTPREL16:            r = R_PPC64_GOT_DTPREL16_DS;
2081
      break;
2082
    case BFD_RELOC_PPC_GOT_DTPREL16_LO:         r = R_PPC64_GOT_DTPREL16_LO_DS;
2083
      break;
2084
    case BFD_RELOC_PPC_GOT_DTPREL16_HI:         r = R_PPC64_GOT_DTPREL16_HI;
2085
      break;
2086
    case BFD_RELOC_PPC_GOT_DTPREL16_HA:         r = R_PPC64_GOT_DTPREL16_HA;
2087
      break;
2088
    case BFD_RELOC_PPC64_TPREL16_DS:            r = R_PPC64_TPREL16_DS;
2089
      break;
2090
    case BFD_RELOC_PPC64_TPREL16_LO_DS:         r = R_PPC64_TPREL16_LO_DS;
2091
      break;
2092
    case BFD_RELOC_PPC64_TPREL16_HIGHER:        r = R_PPC64_TPREL16_HIGHER;
2093
      break;
2094
    case BFD_RELOC_PPC64_TPREL16_HIGHERA:       r = R_PPC64_TPREL16_HIGHERA;
2095
      break;
2096
    case BFD_RELOC_PPC64_TPREL16_HIGHEST:       r = R_PPC64_TPREL16_HIGHEST;
2097
      break;
2098
    case BFD_RELOC_PPC64_TPREL16_HIGHESTA:      r = R_PPC64_TPREL16_HIGHESTA;
2099
      break;
2100
    case BFD_RELOC_PPC64_DTPREL16_DS:           r = R_PPC64_DTPREL16_DS;
2101
      break;
2102
    case BFD_RELOC_PPC64_DTPREL16_LO_DS:        r = R_PPC64_DTPREL16_LO_DS;
2103
      break;
2104
    case BFD_RELOC_PPC64_DTPREL16_HIGHER:       r = R_PPC64_DTPREL16_HIGHER;
2105
      break;
2106
    case BFD_RELOC_PPC64_DTPREL16_HIGHERA:      r = R_PPC64_DTPREL16_HIGHERA;
2107
      break;
2108
    case BFD_RELOC_PPC64_DTPREL16_HIGHEST:      r = R_PPC64_DTPREL16_HIGHEST;
2109
      break;
2110
    case BFD_RELOC_PPC64_DTPREL16_HIGHESTA:     r = R_PPC64_DTPREL16_HIGHESTA;
2111
      break;
2112
    case BFD_RELOC_VTABLE_INHERIT:              r = R_PPC64_GNU_VTINHERIT;
2113
      break;
2114
    case BFD_RELOC_VTABLE_ENTRY:                r = R_PPC64_GNU_VTENTRY;
2115
      break;
2116
    }
2117
 
2118
  return ppc64_elf_howto_table[r];
2119
};
2120
 
2121
static reloc_howto_type *
2122
ppc64_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2123
                             const char *r_name)
2124
{
2125
  unsigned int i;
2126
 
2127
  for (i = 0;
2128
       i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
2129
       i++)
2130
    if (ppc64_elf_howto_raw[i].name != NULL
2131
        && strcasecmp (ppc64_elf_howto_raw[i].name, r_name) == 0)
2132
      return &ppc64_elf_howto_raw[i];
2133
 
2134
  return NULL;
2135
}
2136
 
2137
/* Set the howto pointer for a PowerPC ELF reloc.  */
2138
 
2139
static void
2140
ppc64_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2141
                         Elf_Internal_Rela *dst)
2142
{
2143
  unsigned int type;
2144
 
2145
  /* Initialize howto table if needed.  */
2146
  if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2147
    ppc_howto_init ();
2148
 
2149
  type = ELF64_R_TYPE (dst->r_info);
2150
  if (type >= (sizeof (ppc64_elf_howto_table)
2151
               / sizeof (ppc64_elf_howto_table[0])))
2152
    {
2153
      (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
2154
                             abfd, (int) type);
2155
      type = R_PPC64_NONE;
2156
    }
2157
  cache_ptr->howto = ppc64_elf_howto_table[type];
2158
}
2159
 
2160
/* Handle the R_PPC64_ADDR16_HA and similar relocs.  */
2161
 
2162
static bfd_reloc_status_type
2163
ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2164
                    void *data, asection *input_section,
2165
                    bfd *output_bfd, char **error_message)
2166
{
2167
  /* If this is a relocatable link (output_bfd test tells us), just
2168
     call the generic function.  Any adjustment will be done at final
2169
     link time.  */
2170
  if (output_bfd != NULL)
2171
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2172
                                  input_section, output_bfd, error_message);
2173
 
2174
  /* Adjust the addend for sign extension of the low 16 bits.
2175
     We won't actually be using the low 16 bits, so trashing them
2176
     doesn't matter.  */
2177
  reloc_entry->addend += 0x8000;
2178
  return bfd_reloc_continue;
2179
}
2180
 
2181
static bfd_reloc_status_type
2182
ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2183
                        void *data, asection *input_section,
2184
                        bfd *output_bfd, char **error_message)
2185
{
2186
  if (output_bfd != NULL)
2187
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2188
                                  input_section, output_bfd, error_message);
2189
 
2190
  if (strcmp (symbol->section->name, ".opd") == 0
2191
      && (symbol->section->owner->flags & DYNAMIC) == 0)
2192
    {
2193
      bfd_vma dest = opd_entry_value (symbol->section,
2194
                                      symbol->value + reloc_entry->addend,
2195
                                      NULL, NULL);
2196
      if (dest != (bfd_vma) -1)
2197
        reloc_entry->addend = dest - (symbol->value
2198
                                      + symbol->section->output_section->vma
2199
                                      + symbol->section->output_offset);
2200
    }
2201
  return bfd_reloc_continue;
2202
}
2203
 
2204
static bfd_reloc_status_type
2205
ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2206
                         void *data, asection *input_section,
2207
                         bfd *output_bfd, char **error_message)
2208
{
2209
  long insn;
2210
  enum elf_ppc64_reloc_type r_type;
2211
  bfd_size_type octets;
2212
  /* Disabled until we sort out how ld should choose 'y' vs 'at'.  */
2213
  bfd_boolean is_power4 = FALSE;
2214
 
2215
  /* If this is a relocatable link (output_bfd test tells us), just
2216
     call the generic function.  Any adjustment will be done at final
2217
     link time.  */
2218
  if (output_bfd != NULL)
2219
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2220
                                  input_section, output_bfd, error_message);
2221
 
2222
  octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2223
  insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2224
  insn &= ~(0x01 << 21);
2225
  r_type = reloc_entry->howto->type;
2226
  if (r_type == R_PPC64_ADDR14_BRTAKEN
2227
      || r_type == R_PPC64_REL14_BRTAKEN)
2228
    insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field.  */
2229
 
2230
  if (is_power4)
2231
    {
2232
      /* Set 'a' bit.  This is 0b00010 in BO field for branch
2233
         on CR(BI) insns (BO == 001at or 011at), and 0b01000
2234
         for branch on CTR insns (BO == 1a00t or 1a01t).  */
2235
      if ((insn & (0x14 << 21)) == (0x04 << 21))
2236
        insn |= 0x02 << 21;
2237
      else if ((insn & (0x14 << 21)) == (0x10 << 21))
2238
        insn |= 0x08 << 21;
2239
      else
2240
        goto out;
2241
    }
2242
  else
2243
    {
2244
      bfd_vma target = 0;
2245
      bfd_vma from;
2246
 
2247
      if (!bfd_is_com_section (symbol->section))
2248
        target = symbol->value;
2249
      target += symbol->section->output_section->vma;
2250
      target += symbol->section->output_offset;
2251
      target += reloc_entry->addend;
2252
 
2253
      from = (reloc_entry->address
2254
              + input_section->output_offset
2255
              + input_section->output_section->vma);
2256
 
2257
      /* Invert 'y' bit if not the default.  */
2258
      if ((bfd_signed_vma) (target - from) < 0)
2259
        insn ^= 0x01 << 21;
2260
    }
2261
  bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2262
 out:
2263
  return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
2264
                                 input_section, output_bfd, error_message);
2265
}
2266
 
2267
static bfd_reloc_status_type
2268
ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2269
                         void *data, asection *input_section,
2270
                         bfd *output_bfd, char **error_message)
2271
{
2272
  /* If this is a relocatable link (output_bfd test tells us), just
2273
     call the generic function.  Any adjustment will be done at final
2274
     link time.  */
2275
  if (output_bfd != NULL)
2276
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2277
                                  input_section, output_bfd, error_message);
2278
 
2279
  /* Subtract the symbol section base address.  */
2280
  reloc_entry->addend -= symbol->section->output_section->vma;
2281
  return bfd_reloc_continue;
2282
}
2283
 
2284
static bfd_reloc_status_type
2285
ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2286
                            void *data, asection *input_section,
2287
                            bfd *output_bfd, char **error_message)
2288
{
2289
  /* If this is a relocatable link (output_bfd test tells us), just
2290
     call the generic function.  Any adjustment will be done at final
2291
     link time.  */
2292
  if (output_bfd != NULL)
2293
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2294
                                  input_section, output_bfd, error_message);
2295
 
2296
  /* Subtract the symbol section base address.  */
2297
  reloc_entry->addend -= symbol->section->output_section->vma;
2298
 
2299
  /* Adjust the addend for sign extension of the low 16 bits.  */
2300
  reloc_entry->addend += 0x8000;
2301
  return bfd_reloc_continue;
2302
}
2303
 
2304
static bfd_reloc_status_type
2305
ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2306
                     void *data, asection *input_section,
2307
                     bfd *output_bfd, char **error_message)
2308
{
2309
  bfd_vma TOCstart;
2310
 
2311
  /* If this is a relocatable link (output_bfd test tells us), just
2312
     call the generic function.  Any adjustment will be done at final
2313
     link time.  */
2314
  if (output_bfd != NULL)
2315
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2316
                                  input_section, output_bfd, error_message);
2317
 
2318
  TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2319
  if (TOCstart == 0)
2320
    TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2321
 
2322
  /* Subtract the TOC base address.  */
2323
  reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2324
  return bfd_reloc_continue;
2325
}
2326
 
2327
static bfd_reloc_status_type
2328
ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2329
                        void *data, asection *input_section,
2330
                        bfd *output_bfd, char **error_message)
2331
{
2332
  bfd_vma TOCstart;
2333
 
2334
  /* If this is a relocatable link (output_bfd test tells us), just
2335
     call the generic function.  Any adjustment will be done at final
2336
     link time.  */
2337
  if (output_bfd != NULL)
2338
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2339
                                  input_section, output_bfd, error_message);
2340
 
2341
  TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2342
  if (TOCstart == 0)
2343
    TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2344
 
2345
  /* Subtract the TOC base address.  */
2346
  reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2347
 
2348
  /* Adjust the addend for sign extension of the low 16 bits.  */
2349
  reloc_entry->addend += 0x8000;
2350
  return bfd_reloc_continue;
2351
}
2352
 
2353
static bfd_reloc_status_type
2354
ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2355
                       void *data, asection *input_section,
2356
                       bfd *output_bfd, char **error_message)
2357
{
2358
  bfd_vma TOCstart;
2359
  bfd_size_type octets;
2360
 
2361
  /* If this is a relocatable link (output_bfd test tells us), just
2362
     call the generic function.  Any adjustment will be done at final
2363
     link time.  */
2364
  if (output_bfd != NULL)
2365
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2366
                                  input_section, output_bfd, error_message);
2367
 
2368
  TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2369
  if (TOCstart == 0)
2370
    TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2371
 
2372
  octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2373
  bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
2374
  return bfd_reloc_ok;
2375
}
2376
 
2377
static bfd_reloc_status_type
2378
ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2379
                           void *data, asection *input_section,
2380
                           bfd *output_bfd, char **error_message)
2381
{
2382
  /* If this is a relocatable link (output_bfd test tells us), just
2383
     call the generic function.  Any adjustment will be done at final
2384
     link time.  */
2385
  if (output_bfd != NULL)
2386
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2387
                                  input_section, output_bfd, error_message);
2388
 
2389
  if (error_message != NULL)
2390
    {
2391
      static char buf[60];
2392
      sprintf (buf, "generic linker can't handle %s",
2393
               reloc_entry->howto->name);
2394
      *error_message = buf;
2395
    }
2396
  return bfd_reloc_dangerous;
2397
}
2398
 
2399
struct ppc64_elf_obj_tdata
2400
{
2401
  struct elf_obj_tdata elf;
2402
 
2403
  /* Shortcuts to dynamic linker sections.  */
2404
  asection *got;
2405
  asection *relgot;
2406
 
2407
  /* Used during garbage collection.  We attach global symbols defined
2408
     on removed .opd entries to this section so that the sym is removed.  */
2409
  asection *deleted_section;
2410
 
2411
  /* TLS local dynamic got entry handling.  Suppose for multiple GOT
2412
     sections means we potentially need one of these for each input bfd.  */
2413
  union {
2414
    bfd_signed_vma refcount;
2415
    bfd_vma offset;
2416
  } tlsld_got;
2417
 
2418
  /* A copy of relocs before they are modified for --emit-relocs.  */
2419
  Elf_Internal_Rela *opd_relocs;
2420
};
2421
 
2422
#define ppc64_elf_tdata(bfd) \
2423
  ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
2424
 
2425
#define ppc64_tlsld_got(bfd) \
2426
  (&ppc64_elf_tdata (bfd)->tlsld_got)
2427
 
2428
#define is_ppc64_elf(bfd) \
2429
  (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2430
   && elf_object_id (bfd) == PPC64_ELF_TDATA)
2431
 
2432
/* Override the generic function because we store some extras.  */
2433
 
2434
static bfd_boolean
2435
ppc64_elf_mkobject (bfd *abfd)
2436
{
2437
  return bfd_elf_allocate_object (abfd, sizeof (struct ppc64_elf_obj_tdata),
2438
                                  PPC64_ELF_TDATA);
2439
}
2440
 
2441
/* Fix bad default arch selected for a 64 bit input bfd when the
2442
   default is 32 bit.  */
2443
 
2444
static bfd_boolean
2445
ppc64_elf_object_p (bfd *abfd)
2446
{
2447
  if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 32)
2448
    {
2449
      Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2450
 
2451
      if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
2452
        {
2453
          /* Relies on arch after 32 bit default being 64 bit default.  */
2454
          abfd->arch_info = abfd->arch_info->next;
2455
          BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
2456
        }
2457
    }
2458
  return TRUE;
2459
}
2460
 
2461
/* Support for core dump NOTE sections.  */
2462
 
2463
static bfd_boolean
2464
ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2465
{
2466
  size_t offset, size;
2467
 
2468
  if (note->descsz != 504)
2469
    return FALSE;
2470
 
2471
  /* pr_cursig */
2472
  elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2473
 
2474
  /* pr_pid */
2475
  elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 32);
2476
 
2477
  /* pr_reg */
2478
  offset = 112;
2479
  size = 384;
2480
 
2481
  /* Make a ".reg/999" section.  */
2482
  return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2483
                                          size, note->descpos + offset);
2484
}
2485
 
2486
static bfd_boolean
2487
ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2488
{
2489
  if (note->descsz != 136)
2490
    return FALSE;
2491
 
2492
  elf_tdata (abfd)->core_program
2493
    = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
2494
  elf_tdata (abfd)->core_command
2495
    = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
2496
 
2497
  return TRUE;
2498
}
2499
 
2500
static char *
2501
ppc64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
2502
                           ...)
2503
{
2504
  switch (note_type)
2505
    {
2506
    default:
2507
      return NULL;
2508
 
2509
    case NT_PRPSINFO:
2510
      {
2511
        char data[136];
2512
        va_list ap;
2513
 
2514
        va_start (ap, note_type);
2515
        memset (data, 0, 40);
2516
        strncpy (data + 40, va_arg (ap, const char *), 16);
2517
        strncpy (data + 56, va_arg (ap, const char *), 80);
2518
        va_end (ap);
2519
        return elfcore_write_note (abfd, buf, bufsiz,
2520
                                   "CORE", note_type, data, sizeof (data));
2521
      }
2522
 
2523
    case NT_PRSTATUS:
2524
      {
2525
        char data[504];
2526
        va_list ap;
2527
        long pid;
2528
        int cursig;
2529
        const void *greg;
2530
 
2531
        va_start (ap, note_type);
2532
        memset (data, 0, 112);
2533
        pid = va_arg (ap, long);
2534
        bfd_put_32 (abfd, pid, data + 32);
2535
        cursig = va_arg (ap, int);
2536
        bfd_put_16 (abfd, cursig, data + 12);
2537
        greg = va_arg (ap, const void *);
2538
        memcpy (data + 112, greg, 384);
2539
        memset (data + 496, 0, 8);
2540
        va_end (ap);
2541
        return elfcore_write_note (abfd, buf, bufsiz,
2542
                                   "CORE", note_type, data, sizeof (data));
2543
      }
2544
    }
2545
}
2546
 
2547
/* Merge backend specific data from an object file to the output
2548
   object file when linking.  */
2549
 
2550
static bfd_boolean
2551
ppc64_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
2552
{
2553
  /* Check if we have the same endianess.  */
2554
  if (ibfd->xvec->byteorder != obfd->xvec->byteorder
2555
      && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
2556
      && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
2557
    {
2558
      const char *msg;
2559
 
2560
      if (bfd_big_endian (ibfd))
2561
        msg = _("%B: compiled for a big endian system "
2562
                "and target is little endian");
2563
      else
2564
        msg = _("%B: compiled for a little endian system "
2565
                "and target is big endian");
2566
 
2567
      (*_bfd_error_handler) (msg, ibfd);
2568
 
2569
      bfd_set_error (bfd_error_wrong_format);
2570
      return FALSE;
2571
    }
2572
 
2573
  return TRUE;
2574
}
2575
 
2576
/* Add extra PPC sections.  */
2577
 
2578
static const struct bfd_elf_special_section ppc64_elf_special_sections[]=
2579
{
2580
  { STRING_COMMA_LEN (".plt"),    0, SHT_NOBITS,   0 },
2581
  { STRING_COMMA_LEN (".sbss"),  -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
2582
  { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2583
  { STRING_COMMA_LEN (".toc"),    0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2584
  { STRING_COMMA_LEN (".toc1"),   0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2585
  { STRING_COMMA_LEN (".tocbss"), 0, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
2586
  { NULL,                     0,  0, 0,            0 }
2587
};
2588
 
2589
enum _ppc64_sec_type {
2590
  sec_normal = 0,
2591
  sec_opd = 1,
2592
  sec_toc = 2
2593
};
2594
 
2595
struct _ppc64_elf_section_data
2596
{
2597
  struct bfd_elf_section_data elf;
2598
 
2599
  union
2600
  {
2601
    /* An array with one entry for each opd function descriptor.  */
2602
    struct _opd_sec_data
2603
    {
2604
      /* Points to the function code section for local opd entries.  */
2605
      asection **func_sec;
2606
 
2607
      /* After editing .opd, adjust references to opd local syms.  */
2608
      long *adjust;
2609
    } opd;
2610
 
2611
    /* An array for toc sections, indexed by offset/8.
2612
       Specifies the relocation symbol index used at a given toc offset.  */
2613
    unsigned *t_symndx;
2614
  } u;
2615
 
2616
  enum _ppc64_sec_type sec_type:2;
2617
 
2618
  /* Flag set when small branches are detected.  Used to
2619
     select suitable defaults for the stub group size.  */
2620
  unsigned int has_14bit_branch:1;
2621
};
2622
 
2623
#define ppc64_elf_section_data(sec) \
2624
  ((struct _ppc64_elf_section_data *) elf_section_data (sec))
2625
 
2626
static bfd_boolean
2627
ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
2628
{
2629
  if (!sec->used_by_bfd)
2630
    {
2631
      struct _ppc64_elf_section_data *sdata;
2632
      bfd_size_type amt = sizeof (*sdata);
2633
 
2634
      sdata = bfd_zalloc (abfd, amt);
2635
      if (sdata == NULL)
2636
        return FALSE;
2637
      sec->used_by_bfd = sdata;
2638
    }
2639
 
2640
  return _bfd_elf_new_section_hook (abfd, sec);
2641
}
2642
 
2643
static struct _opd_sec_data *
2644
get_opd_info (asection * sec)
2645
{
2646
  if (sec != NULL
2647
      && ppc64_elf_section_data (sec) != NULL
2648
      && ppc64_elf_section_data (sec)->sec_type == sec_opd)
2649
    return &ppc64_elf_section_data (sec)->u.opd;
2650
  return NULL;
2651
}
2652
 
2653
/* Parameters for the qsort hook.  */
2654
static asection *synthetic_opd;
2655
static bfd_boolean synthetic_relocatable;
2656
 
2657
/* qsort comparison function for ppc64_elf_get_synthetic_symtab.  */
2658
 
2659
static int
2660
compare_symbols (const void *ap, const void *bp)
2661
{
2662
  const asymbol *a = * (const asymbol **) ap;
2663
  const asymbol *b = * (const asymbol **) bp;
2664
 
2665
  /* Section symbols first.  */
2666
  if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
2667
    return -1;
2668
  if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
2669
    return 1;
2670
 
2671
  /* then .opd symbols.  */
2672
  if (a->section == synthetic_opd && b->section != synthetic_opd)
2673
    return -1;
2674
  if (a->section != synthetic_opd && b->section == synthetic_opd)
2675
    return 1;
2676
 
2677
  /* then other code symbols.  */
2678
  if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2679
      == (SEC_CODE | SEC_ALLOC)
2680
      && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2681
         != (SEC_CODE | SEC_ALLOC))
2682
    return -1;
2683
 
2684
  if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2685
      != (SEC_CODE | SEC_ALLOC)
2686
      && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2687
         == (SEC_CODE | SEC_ALLOC))
2688
    return 1;
2689
 
2690
  if (synthetic_relocatable)
2691
    {
2692
      if (a->section->id < b->section->id)
2693
        return -1;
2694
 
2695
      if (a->section->id > b->section->id)
2696
        return 1;
2697
    }
2698
 
2699
  if (a->value + a->section->vma < b->value + b->section->vma)
2700
    return -1;
2701
 
2702
  if (a->value + a->section->vma > b->value + b->section->vma)
2703
    return 1;
2704
 
2705
  /* For syms with the same value, prefer strong dynamic global function
2706
     syms over other syms.  */
2707
  if ((a->flags & BSF_GLOBAL) != 0 && (b->flags & BSF_GLOBAL) == 0)
2708
    return -1;
2709
 
2710
  if ((a->flags & BSF_GLOBAL) == 0 && (b->flags & BSF_GLOBAL) != 0)
2711
    return 1;
2712
 
2713
  if ((a->flags & BSF_FUNCTION) != 0 && (b->flags & BSF_FUNCTION) == 0)
2714
    return -1;
2715
 
2716
  if ((a->flags & BSF_FUNCTION) == 0 && (b->flags & BSF_FUNCTION) != 0)
2717
    return 1;
2718
 
2719
  if ((a->flags & BSF_WEAK) == 0 && (b->flags & BSF_WEAK) != 0)
2720
    return -1;
2721
 
2722
  if ((a->flags & BSF_WEAK) != 0 && (b->flags & BSF_WEAK) == 0)
2723
    return 1;
2724
 
2725
  if ((a->flags & BSF_DYNAMIC) != 0 && (b->flags & BSF_DYNAMIC) == 0)
2726
    return -1;
2727
 
2728
  if ((a->flags & BSF_DYNAMIC) == 0 && (b->flags & BSF_DYNAMIC) != 0)
2729
    return 1;
2730
 
2731
  return 0;
2732
}
2733
 
2734
/* Search SYMS for a symbol of the given VALUE.  */
2735
 
2736
static asymbol *
2737
sym_exists_at (asymbol **syms, long lo, long hi, int id, bfd_vma value)
2738
{
2739
  long mid;
2740
 
2741
  if (id == -1)
2742
    {
2743
      while (lo < hi)
2744
        {
2745
          mid = (lo + hi) >> 1;
2746
          if (syms[mid]->value + syms[mid]->section->vma < value)
2747
            lo = mid + 1;
2748
          else if (syms[mid]->value + syms[mid]->section->vma > value)
2749
            hi = mid;
2750
          else
2751
            return syms[mid];
2752
        }
2753
    }
2754
  else
2755
    {
2756
      while (lo < hi)
2757
        {
2758
          mid = (lo + hi) >> 1;
2759
          if (syms[mid]->section->id < id)
2760
            lo = mid + 1;
2761
          else if (syms[mid]->section->id > id)
2762
            hi = mid;
2763
          else if (syms[mid]->value < value)
2764
            lo = mid + 1;
2765
          else if (syms[mid]->value > value)
2766
            hi = mid;
2767
          else
2768
            return syms[mid];
2769
        }
2770
    }
2771
  return NULL;
2772
}
2773
 
2774
/* Create synthetic symbols, effectively restoring "dot-symbol" function
2775
   entry syms.  */
2776
 
2777
static long
2778
ppc64_elf_get_synthetic_symtab (bfd *abfd,
2779
                                long static_count, asymbol **static_syms,
2780
                                long dyn_count, asymbol **dyn_syms,
2781
                                asymbol **ret)
2782
{
2783
  asymbol *s;
2784
  long i;
2785
  long count;
2786
  char *names;
2787
  long symcount, codesecsym, codesecsymend, secsymend, opdsymend;
2788
  asection *opd;
2789
  bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
2790
  asymbol **syms;
2791
 
2792
  *ret = NULL;
2793
 
2794
  opd = bfd_get_section_by_name (abfd, ".opd");
2795
  if (opd == NULL)
2796
    return 0;
2797
 
2798
  symcount = static_count;
2799
  if (!relocatable)
2800
    symcount += dyn_count;
2801
  if (symcount == 0)
2802
    return 0;
2803
 
2804
  syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
2805
  if (syms == NULL)
2806
    return -1;
2807
 
2808
  if (!relocatable && static_count != 0 && dyn_count != 0)
2809
    {
2810
      /* Use both symbol tables.  */
2811
      memcpy (syms, static_syms, static_count * sizeof (*syms));
2812
      memcpy (syms + static_count, dyn_syms, (dyn_count + 1) * sizeof (*syms));
2813
    }
2814
  else if (!relocatable && static_count == 0)
2815
    memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
2816
  else
2817
    memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
2818
 
2819
  synthetic_opd = opd;
2820
  synthetic_relocatable = relocatable;
2821
  qsort (syms, symcount, sizeof (*syms), compare_symbols);
2822
 
2823
  if (!relocatable && symcount > 1)
2824
    {
2825
      long j;
2826
      /* Trim duplicate syms, since we may have merged the normal and
2827
         dynamic symbols.  Actually, we only care about syms that have
2828
         different values, so trim any with the same value.  */
2829
      for (i = 1, j = 1; i < symcount; ++i)
2830
        if (syms[i - 1]->value + syms[i - 1]->section->vma
2831
            != syms[i]->value + syms[i]->section->vma)
2832
          syms[j++] = syms[i];
2833
      symcount = j;
2834
    }
2835
 
2836
  i = 0;
2837
  if (syms[i]->section == opd)
2838
    ++i;
2839
  codesecsym = i;
2840
 
2841
  for (; i < symcount; ++i)
2842
    if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2843
         != (SEC_CODE | SEC_ALLOC))
2844
        || (syms[i]->flags & BSF_SECTION_SYM) == 0)
2845
      break;
2846
  codesecsymend = i;
2847
 
2848
  for (; i < symcount; ++i)
2849
    if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
2850
      break;
2851
  secsymend = i;
2852
 
2853
  for (; i < symcount; ++i)
2854
    if (syms[i]->section != opd)
2855
      break;
2856
  opdsymend = i;
2857
 
2858
  for (; i < symcount; ++i)
2859
    if ((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2860
        != (SEC_CODE | SEC_ALLOC))
2861
      break;
2862
  symcount = i;
2863
 
2864
  count = 0;
2865
  if (opdsymend == secsymend)
2866
    goto done;
2867
 
2868
  if (relocatable)
2869
    {
2870
      bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
2871
      arelent *r;
2872
      size_t size;
2873
      long relcount;
2874
 
2875
      slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
2876
      relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
2877
      if (relcount == 0)
2878
        goto done;
2879
 
2880
      if (!(*slurp_relocs) (abfd, opd, static_syms, FALSE))
2881
        {
2882
          count = -1;
2883
          goto done;
2884
        }
2885
 
2886
      size = 0;
2887
      for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
2888
        {
2889
          asymbol *sym;
2890
 
2891
          while (r < opd->relocation + relcount
2892
                 && r->address < syms[i]->value + opd->vma)
2893
            ++r;
2894
 
2895
          if (r == opd->relocation + relcount)
2896
            break;
2897
 
2898
          if (r->address != syms[i]->value + opd->vma)
2899
            continue;
2900
 
2901
          if (r->howto->type != R_PPC64_ADDR64)
2902
            continue;
2903
 
2904
          sym = *r->sym_ptr_ptr;
2905
          if (!sym_exists_at (syms, opdsymend, symcount,
2906
                              sym->section->id, sym->value + r->addend))
2907
            {
2908
              ++count;
2909
              size += sizeof (asymbol);
2910
              size += strlen (syms[i]->name) + 2;
2911
            }
2912
        }
2913
 
2914
      s = *ret = bfd_malloc (size);
2915
      if (s == NULL)
2916
        {
2917
          count = -1;
2918
          goto done;
2919
        }
2920
 
2921
      names = (char *) (s + count);
2922
 
2923
      for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
2924
        {
2925
          asymbol *sym;
2926
 
2927
          while (r < opd->relocation + relcount
2928
                 && r->address < syms[i]->value + opd->vma)
2929
            ++r;
2930
 
2931
          if (r == opd->relocation + relcount)
2932
            break;
2933
 
2934
          if (r->address != syms[i]->value + opd->vma)
2935
            continue;
2936
 
2937
          if (r->howto->type != R_PPC64_ADDR64)
2938
            continue;
2939
 
2940
          sym = *r->sym_ptr_ptr;
2941
          if (!sym_exists_at (syms, opdsymend, symcount,
2942
                              sym->section->id, sym->value + r->addend))
2943
            {
2944
              size_t len;
2945
 
2946
              *s = *syms[i];
2947
              s->section = sym->section;
2948
              s->value = sym->value + r->addend;
2949
              s->name = names;
2950
              *names++ = '.';
2951
              len = strlen (syms[i]->name);
2952
              memcpy (names, syms[i]->name, len + 1);
2953
              names += len + 1;
2954
              /* Have udata.p point back to the original symbol this
2955
                 synthetic symbol was derived from.  */
2956
              s->udata.p = syms[i];
2957
              s++;
2958
            }
2959
        }
2960
    }
2961
  else
2962
    {
2963
      bfd_byte *contents;
2964
      size_t size;
2965
 
2966
      if (!bfd_malloc_and_get_section (abfd, opd, &contents))
2967
        {
2968
          if (contents)
2969
            {
2970
            free_contents_and_exit:
2971
              free (contents);
2972
            }
2973
          count = -1;
2974
          goto done;
2975
        }
2976
 
2977
      size = 0;
2978
      for (i = secsymend; i < opdsymend; ++i)
2979
        {
2980
          bfd_vma ent;
2981
 
2982
          ent = bfd_get_64 (abfd, contents + syms[i]->value);
2983
          if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
2984
            {
2985
              ++count;
2986
              size += sizeof (asymbol);
2987
              size += strlen (syms[i]->name) + 2;
2988
            }
2989
        }
2990
 
2991
      s = *ret = bfd_malloc (size);
2992
      if (s == NULL)
2993
        goto free_contents_and_exit;
2994
 
2995
      names = (char *) (s + count);
2996
 
2997
      for (i = secsymend; i < opdsymend; ++i)
2998
        {
2999
          bfd_vma ent;
3000
 
3001
          ent = bfd_get_64 (abfd, contents + syms[i]->value);
3002
          if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3003
            {
3004
              long lo, hi;
3005
              size_t len;
3006
              asection *sec = abfd->sections;
3007
 
3008
              *s = *syms[i];
3009
              lo = codesecsym;
3010
              hi = codesecsymend;
3011
              while (lo < hi)
3012
                {
3013
                  long mid = (lo + hi) >> 1;
3014
                  if (syms[mid]->section->vma < ent)
3015
                    lo = mid + 1;
3016
                  else if (syms[mid]->section->vma > ent)
3017
                    hi = mid;
3018
                  else
3019
                    {
3020
                      sec = syms[mid]->section;
3021
                      break;
3022
                    }
3023
                }
3024
 
3025
              if (lo >= hi && lo > codesecsym)
3026
                sec = syms[lo - 1]->section;
3027
 
3028
              for (; sec != NULL; sec = sec->next)
3029
                {
3030
                  if (sec->vma > ent)
3031
                    break;
3032
                  if ((sec->flags & SEC_ALLOC) == 0
3033
                      || (sec->flags & SEC_LOAD) == 0)
3034
                    break;
3035
                  if ((sec->flags & SEC_CODE) != 0)
3036
                    s->section = sec;
3037
                }
3038
              s->value = ent - s->section->vma;
3039
              s->name = names;
3040
              *names++ = '.';
3041
              len = strlen (syms[i]->name);
3042
              memcpy (names, syms[i]->name, len + 1);
3043
              names += len + 1;
3044
              /* Have udata.p point back to the original symbol this
3045
                 synthetic symbol was derived from.  */
3046
              s->udata.p = syms[i];
3047
              s++;
3048
            }
3049
        }
3050
      free (contents);
3051
    }
3052
 
3053
 done:
3054
  free (syms);
3055
  return count;
3056
}
3057
 
3058
/* The following functions are specific to the ELF linker, while
3059
   functions above are used generally.  Those named ppc64_elf_* are
3060
   called by the main ELF linker code.  They appear in this file more
3061
   or less in the order in which they are called.  eg.
3062
   ppc64_elf_check_relocs is called early in the link process,
3063
   ppc64_elf_finish_dynamic_sections is one of the last functions
3064
   called.
3065
 
3066
   PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
3067
   functions have both a function code symbol and a function descriptor
3068
   symbol.  A call to foo in a relocatable object file looks like:
3069
 
3070
   .            .text
3071
   .    x:
3072
   .            bl      .foo
3073
   .            nop
3074
 
3075
   The function definition in another object file might be:
3076
 
3077
   .            .section .opd
3078
   .    foo:    .quad   .foo
3079
   .            .quad   .TOC.@tocbase
3080
   .            .quad   0
3081
   .
3082
   .            .text
3083
   .    .foo:   blr
3084
 
3085
   When the linker resolves the call during a static link, the branch
3086
   unsurprisingly just goes to .foo and the .opd information is unused.
3087
   If the function definition is in a shared library, things are a little
3088
   different:  The call goes via a plt call stub, the opd information gets
3089
   copied to the plt, and the linker patches the nop.
3090
 
3091
   .    x:
3092
   .            bl      .foo_stub
3093
   .            ld      2,40(1)
3094
   .
3095
   .
3096
   .    .foo_stub:
3097
   .            addis   12,2,Lfoo@toc@ha        # in practice, the call stub
3098
   .            addi    12,12,Lfoo@toc@l        # is slightly optimized, but
3099
   .            std     2,40(1)                 # this is the general idea
3100
   .            ld      11,0(12)
3101
   .            ld      2,8(12)
3102
   .            mtctr   11
3103
   .            ld      11,16(12)
3104
   .            bctr
3105
   .
3106
   .            .section .plt
3107
   .    Lfoo:   reloc (R_PPC64_JMP_SLOT, foo)
3108
 
3109
   The "reloc ()" notation is supposed to indicate that the linker emits
3110
   an R_PPC64_JMP_SLOT reloc against foo.  The dynamic linker does the opd
3111
   copying.
3112
 
3113
   What are the difficulties here?  Well, firstly, the relocations
3114
   examined by the linker in check_relocs are against the function code
3115
   sym .foo, while the dynamic relocation in the plt is emitted against
3116
   the function descriptor symbol, foo.  Somewhere along the line, we need
3117
   to carefully copy dynamic link information from one symbol to the other.
3118
   Secondly, the generic part of the elf linker will make .foo a dynamic
3119
   symbol as is normal for most other backends.  We need foo dynamic
3120
   instead, at least for an application final link.  However, when
3121
   creating a shared library containing foo, we need to have both symbols
3122
   dynamic so that references to .foo are satisfied during the early
3123
   stages of linking.  Otherwise the linker might decide to pull in a
3124
   definition from some other object, eg. a static library.
3125
 
3126
   Update: As of August 2004, we support a new convention.  Function
3127
   calls may use the function descriptor symbol, ie. "bl foo".  This
3128
   behaves exactly as "bl .foo".  */
3129
 
3130
/* The linker needs to keep track of the number of relocs that it
3131
   decides to copy as dynamic relocs in check_relocs for each symbol.
3132
   This is so that it can later discard them if they are found to be
3133
   unnecessary.  We store the information in a field extending the
3134
   regular ELF linker hash table.  */
3135
 
3136
struct ppc_dyn_relocs
3137
{
3138
  struct ppc_dyn_relocs *next;
3139
 
3140
  /* The input section of the reloc.  */
3141
  asection *sec;
3142
 
3143
  /* Total number of relocs copied for the input section.  */
3144
  bfd_size_type count;
3145
 
3146
  /* Number of pc-relative relocs copied for the input section.  */
3147
  bfd_size_type pc_count;
3148
};
3149
 
3150
/* Track GOT entries needed for a given symbol.  We might need more
3151
   than one got entry per symbol.  */
3152
struct got_entry
3153
{
3154
  struct got_entry *next;
3155
 
3156
  /* The symbol addend that we'll be placing in the GOT.  */
3157
  bfd_vma addend;
3158
 
3159
  /* Unlike other ELF targets, we use separate GOT entries for the same
3160
     symbol referenced from different input files.  This is to support
3161
     automatic multiple TOC/GOT sections, where the TOC base can vary
3162
     from one input file to another.  FIXME: After group_sections we
3163
     ought to merge entries within the group.
3164
 
3165
     Point to the BFD owning this GOT entry.  */
3166
  bfd *owner;
3167
 
3168
  /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
3169
     TLS_TPREL or TLS_DTPREL for tls entries.  */
3170
  char tls_type;
3171
 
3172
  /* Reference count until size_dynamic_sections, GOT offset thereafter.  */
3173
  union
3174
    {
3175
      bfd_signed_vma refcount;
3176
      bfd_vma offset;
3177
    } got;
3178
};
3179
 
3180
/* The same for PLT.  */
3181
struct plt_entry
3182
{
3183
  struct plt_entry *next;
3184
 
3185
  bfd_vma addend;
3186
 
3187
  union
3188
    {
3189
      bfd_signed_vma refcount;
3190
      bfd_vma offset;
3191
    } plt;
3192
};
3193
 
3194
/* Of those relocs that might be copied as dynamic relocs, this macro
3195
   selects those that must be copied when linking a shared library,
3196
   even when the symbol is local.  */
3197
 
3198
#define MUST_BE_DYN_RELOC(RTYPE)                \
3199
  ((RTYPE) != R_PPC64_REL32                     \
3200
   && (RTYPE) != R_PPC64_REL64                  \
3201
   && (RTYPE) != R_PPC64_REL30)
3202
 
3203
/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
3204
   copying dynamic variables from a shared lib into an app's dynbss
3205
   section, and instead use a dynamic relocation to point into the
3206
   shared lib.  With code that gcc generates, it's vital that this be
3207
   enabled;  In the PowerPC64 ABI, the address of a function is actually
3208
   the address of a function descriptor, which resides in the .opd
3209
   section.  gcc uses the descriptor directly rather than going via the
3210
   GOT as some other ABI's do, which means that initialized function
3211
   pointers must reference the descriptor.  Thus, a function pointer
3212
   initialized to the address of a function in a shared library will
3213
   either require a copy reloc, or a dynamic reloc.  Using a copy reloc
3214
   redefines the function descriptor symbol to point to the copy.  This
3215
   presents a problem as a plt entry for that function is also
3216
   initialized from the function descriptor symbol and the copy reloc
3217
   may not be initialized first.  */
3218
#define ELIMINATE_COPY_RELOCS 1
3219
 
3220
/* Section name for stubs is the associated section name plus this
3221
   string.  */
3222
#define STUB_SUFFIX ".stub"
3223
 
3224
/* Linker stubs.
3225
   ppc_stub_long_branch:
3226
   Used when a 14 bit branch (or even a 24 bit branch) can't reach its
3227
   destination, but a 24 bit branch in a stub section will reach.
3228
   .    b       dest
3229
 
3230
   ppc_stub_plt_branch:
3231
   Similar to the above, but a 24 bit branch in the stub section won't
3232
   reach its destination.
3233
   .    addis   %r12,%r2,xxx@toc@ha
3234
   .    ld      %r11,xxx@toc@l(%r12)
3235
   .    mtctr   %r11
3236
   .    bctr
3237
 
3238
   ppc_stub_plt_call:
3239
   Used to call a function in a shared library.  If it so happens that
3240
   the plt entry referenced crosses a 64k boundary, then an extra
3241
   "addi %r12,%r12,xxx@toc@l" will be inserted before the "mtctr".
3242
   .    addis   %r12,%r2,xxx@toc@ha
3243
   .    std     %r2,40(%r1)
3244
   .    ld      %r11,xxx+0@toc@l(%r12)
3245
   .    mtctr   %r11
3246
   .    ld      %r2,xxx+8@toc@l(%r12)
3247
   .    ld      %r11,xxx+16@toc@l(%r12)
3248
   .    bctr
3249
 
3250
   ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
3251
   code to adjust the value and save r2 to support multiple toc sections.
3252
   A ppc_stub_long_branch with an r2 offset looks like:
3253
   .    std     %r2,40(%r1)
3254
   .    addis   %r2,%r2,off@ha
3255
   .    addi    %r2,%r2,off@l
3256
   .    b       dest
3257
 
3258
   A ppc_stub_plt_branch with an r2 offset looks like:
3259
   .    std     %r2,40(%r1)
3260
   .    addis   %r12,%r2,xxx@toc@ha
3261
   .    ld      %r11,xxx@toc@l(%r12)
3262
   .    addis   %r2,%r2,off@ha
3263
   .    addi    %r2,%r2,off@l
3264
   .    mtctr   %r11
3265
   .    bctr
3266
 
3267
   In cases where the "addis" instruction would add zero, the "addis" is
3268
   omitted and following instructions modified slightly in some cases.
3269
*/
3270
 
3271
enum ppc_stub_type {
3272
  ppc_stub_none,
3273
  ppc_stub_long_branch,
3274
  ppc_stub_long_branch_r2off,
3275
  ppc_stub_plt_branch,
3276
  ppc_stub_plt_branch_r2off,
3277
  ppc_stub_plt_call
3278
};
3279
 
3280
struct ppc_stub_hash_entry {
3281
 
3282
  /* Base hash table entry structure.  */
3283
  struct bfd_hash_entry root;
3284
 
3285
  enum ppc_stub_type stub_type;
3286
 
3287
  /* The stub section.  */
3288
  asection *stub_sec;
3289
 
3290
  /* Offset within stub_sec of the beginning of this stub.  */
3291
  bfd_vma stub_offset;
3292
 
3293
  /* Given the symbol's value and its section we can determine its final
3294
     value when building the stubs (so the stub knows where to jump.  */
3295
  bfd_vma target_value;
3296
  asection *target_section;
3297
 
3298
  /* The symbol table entry, if any, that this was derived from.  */
3299
  struct ppc_link_hash_entry *h;
3300
 
3301
  /* And the reloc addend that this was derived from.  */
3302
  bfd_vma addend;
3303
 
3304
  /* Where this stub is being called from, or, in the case of combined
3305
     stub sections, the first input section in the group.  */
3306
  asection *id_sec;
3307
};
3308
 
3309
struct ppc_branch_hash_entry {
3310
 
3311
  /* Base hash table entry structure.  */
3312
  struct bfd_hash_entry root;
3313
 
3314
  /* Offset within branch lookup table.  */
3315
  unsigned int offset;
3316
 
3317
  /* Generation marker.  */
3318
  unsigned int iter;
3319
};
3320
 
3321
struct ppc_link_hash_entry
3322
{
3323
  struct elf_link_hash_entry elf;
3324
 
3325
  union {
3326
    /* A pointer to the most recently used stub hash entry against this
3327
       symbol.  */
3328
    struct ppc_stub_hash_entry *stub_cache;
3329
 
3330
    /* A pointer to the next symbol starting with a '.'  */
3331
    struct ppc_link_hash_entry *next_dot_sym;
3332
  } u;
3333
 
3334
  /* Track dynamic relocs copied for this symbol.  */
3335
  struct ppc_dyn_relocs *dyn_relocs;
3336
 
3337
  /* Link between function code and descriptor symbols.  */
3338
  struct ppc_link_hash_entry *oh;
3339
 
3340
  /* Flag function code and descriptor symbols.  */
3341
  unsigned int is_func:1;
3342
  unsigned int is_func_descriptor:1;
3343
  unsigned int fake:1;
3344
 
3345
  /* Whether global opd/toc sym has been adjusted or not.
3346
     After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
3347
     should be set for all globals defined in any opd/toc section.  */
3348
  unsigned int adjust_done:1;
3349
 
3350
  /* Set if we twiddled this symbol to weak at some stage.  */
3351
  unsigned int was_undefined:1;
3352
 
3353
  /* Contexts in which symbol is used in the GOT (or TOC).
3354
     TLS_GD .. TLS_EXPLICIT bits are or'd into the mask as the
3355
     corresponding relocs are encountered during check_relocs.
3356
     tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
3357
     indicate the corresponding GOT entry type is not needed.
3358
     tls_optimize may also set TLS_TPRELGD when a GD reloc turns into
3359
     a TPREL one.  We use a separate flag rather than setting TPREL
3360
     just for convenience in distinguishing the two cases.  */
3361
#define TLS_GD           1      /* GD reloc. */
3362
#define TLS_LD           2      /* LD reloc. */
3363
#define TLS_TPREL        4      /* TPREL reloc, => IE. */
3364
#define TLS_DTPREL       8      /* DTPREL reloc, => LD. */
3365
#define TLS_TLS         16      /* Any TLS reloc.  */
3366
#define TLS_EXPLICIT    32      /* Marks TOC section TLS relocs. */
3367
#define TLS_TPRELGD     64      /* TPREL reloc resulting from GD->IE. */
3368
  char tls_mask;
3369
};
3370
 
3371
/* ppc64 ELF linker hash table.  */
3372
 
3373
struct ppc_link_hash_table
3374
{
3375
  struct elf_link_hash_table elf;
3376
 
3377
  /* The stub hash table.  */
3378
  struct bfd_hash_table stub_hash_table;
3379
 
3380
  /* Another hash table for plt_branch stubs.  */
3381
  struct bfd_hash_table branch_hash_table;
3382
 
3383
  /* Linker stub bfd.  */
3384
  bfd *stub_bfd;
3385
 
3386
  /* Linker call-backs.  */
3387
  asection * (*add_stub_section) (const char *, asection *);
3388
  void (*layout_sections_again) (void);
3389
 
3390
  /* Array to keep track of which stub sections have been created, and
3391
     information on stub grouping.  */
3392
  struct map_stub {
3393
    /* This is the section to which stubs in the group will be attached.  */
3394
    asection *link_sec;
3395
    /* The stub section.  */
3396
    asection *stub_sec;
3397
    /* Along with elf_gp, specifies the TOC pointer used in this group.  */
3398
    bfd_vma toc_off;
3399
  } *stub_group;
3400
 
3401
  /* Temp used when calculating TOC pointers.  */
3402
  bfd_vma toc_curr;
3403
 
3404
  /* Highest input section id.  */
3405
  int top_id;
3406
 
3407
  /* Highest output section index.  */
3408
  int top_index;
3409
 
3410
  /* Used when adding symbols.  */
3411
  struct ppc_link_hash_entry *dot_syms;
3412
 
3413
  /* List of input sections for each output section.  */
3414
  asection **input_list;
3415
 
3416
  /* Short-cuts to get to dynamic linker sections.  */
3417
  asection *got;
3418
  asection *plt;
3419
  asection *relplt;
3420
  asection *dynbss;
3421
  asection *relbss;
3422
  asection *glink;
3423
  asection *sfpr;
3424
  asection *brlt;
3425
  asection *relbrlt;
3426
 
3427
  /* Shortcut to .__tls_get_addr and __tls_get_addr.  */
3428
  struct ppc_link_hash_entry *tls_get_addr;
3429
  struct ppc_link_hash_entry *tls_get_addr_fd;
3430
 
3431
  /* Statistics.  */
3432
  unsigned long stub_count[ppc_stub_plt_call];
3433
 
3434
  /* Number of stubs against global syms.  */
3435
  unsigned long stub_globals;
3436
 
3437
  /* Set if we should emit symbols for stubs.  */
3438
  unsigned int emit_stub_syms:1;
3439
 
3440
  /* Support for multiple toc sections.  */
3441
  unsigned int no_multi_toc:1;
3442
  unsigned int multi_toc_needed:1;
3443
 
3444
  /* Set on error.  */
3445
  unsigned int stub_error:1;
3446
 
3447
  /* Temp used by ppc64_elf_check_directives.  */
3448
  unsigned int twiddled_syms:1;
3449
 
3450
  /* Incremented every time we size stubs.  */
3451
  unsigned int stub_iteration;
3452
 
3453
  /* Small local sym to section mapping cache.  */
3454
  struct sym_sec_cache sym_sec;
3455
};
3456
 
3457
/* Rename some of the generic section flags to better document how they
3458
   are used here.  */
3459
#define has_toc_reloc has_gp_reloc
3460
#define makes_toc_func_call need_finalize_relax
3461
#define call_check_in_progress reloc_done
3462
 
3463
/* Get the ppc64 ELF linker hash table from a link_info structure.  */
3464
 
3465
#define ppc_hash_table(p) \
3466
  ((struct ppc_link_hash_table *) ((p)->hash))
3467
 
3468
#define ppc_stub_hash_lookup(table, string, create, copy) \
3469
  ((struct ppc_stub_hash_entry *) \
3470
   bfd_hash_lookup ((table), (string), (create), (copy)))
3471
 
3472
#define ppc_branch_hash_lookup(table, string, create, copy) \
3473
  ((struct ppc_branch_hash_entry *) \
3474
   bfd_hash_lookup ((table), (string), (create), (copy)))
3475
 
3476
/* Create an entry in the stub hash table.  */
3477
 
3478
static struct bfd_hash_entry *
3479
stub_hash_newfunc (struct bfd_hash_entry *entry,
3480
                   struct bfd_hash_table *table,
3481
                   const char *string)
3482
{
3483
  /* Allocate the structure if it has not already been allocated by a
3484
     subclass.  */
3485
  if (entry == NULL)
3486
    {
3487
      entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
3488
      if (entry == NULL)
3489
        return entry;
3490
    }
3491
 
3492
  /* Call the allocation method of the superclass.  */
3493
  entry = bfd_hash_newfunc (entry, table, string);
3494
  if (entry != NULL)
3495
    {
3496
      struct ppc_stub_hash_entry *eh;
3497
 
3498
      /* Initialize the local fields.  */
3499
      eh = (struct ppc_stub_hash_entry *) entry;
3500
      eh->stub_type = ppc_stub_none;
3501
      eh->stub_sec = NULL;
3502
      eh->stub_offset = 0;
3503
      eh->target_value = 0;
3504
      eh->target_section = NULL;
3505
      eh->h = NULL;
3506
      eh->id_sec = NULL;
3507
    }
3508
 
3509
  return entry;
3510
}
3511
 
3512
/* Create an entry in the branch hash table.  */
3513
 
3514
static struct bfd_hash_entry *
3515
branch_hash_newfunc (struct bfd_hash_entry *entry,
3516
                     struct bfd_hash_table *table,
3517
                     const char *string)
3518
{
3519
  /* Allocate the structure if it has not already been allocated by a
3520
     subclass.  */
3521
  if (entry == NULL)
3522
    {
3523
      entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
3524
      if (entry == NULL)
3525
        return entry;
3526
    }
3527
 
3528
  /* Call the allocation method of the superclass.  */
3529
  entry = bfd_hash_newfunc (entry, table, string);
3530
  if (entry != NULL)
3531
    {
3532
      struct ppc_branch_hash_entry *eh;
3533
 
3534
      /* Initialize the local fields.  */
3535
      eh = (struct ppc_branch_hash_entry *) entry;
3536
      eh->offset = 0;
3537
      eh->iter = 0;
3538
    }
3539
 
3540
  return entry;
3541
}
3542
 
3543
/* Create an entry in a ppc64 ELF linker hash table.  */
3544
 
3545
static struct bfd_hash_entry *
3546
link_hash_newfunc (struct bfd_hash_entry *entry,
3547
                   struct bfd_hash_table *table,
3548
                   const char *string)
3549
{
3550
  /* Allocate the structure if it has not already been allocated by a
3551
     subclass.  */
3552
  if (entry == NULL)
3553
    {
3554
      entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
3555
      if (entry == NULL)
3556
        return entry;
3557
    }
3558
 
3559
  /* Call the allocation method of the superclass.  */
3560
  entry = _bfd_elf_link_hash_newfunc (entry, table, string);
3561
  if (entry != NULL)
3562
    {
3563
      struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
3564
 
3565
      memset (&eh->u.stub_cache, 0,
3566
              (sizeof (struct ppc_link_hash_entry)
3567
               - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
3568
 
3569
      /* When making function calls, old ABI code references function entry
3570
         points (dot symbols), while new ABI code references the function
3571
         descriptor symbol.  We need to make any combination of reference and
3572
         definition work together, without breaking archive linking.
3573
 
3574
         For a defined function "foo" and an undefined call to "bar":
3575
         An old object defines "foo" and ".foo", references ".bar" (possibly
3576
         "bar" too).
3577
         A new object defines "foo" and references "bar".
3578
 
3579
         A new object thus has no problem with its undefined symbols being
3580
         satisfied by definitions in an old object.  On the other hand, the
3581
         old object won't have ".bar" satisfied by a new object.
3582
 
3583
         Keep a list of newly added dot-symbols.  */
3584
 
3585
      if (string[0] == '.')
3586
        {
3587
          struct ppc_link_hash_table *htab;
3588
 
3589
          htab = (struct ppc_link_hash_table *) table;
3590
          eh->u.next_dot_sym = htab->dot_syms;
3591
          htab->dot_syms = eh;
3592
        }
3593
    }
3594
 
3595
  return entry;
3596
}
3597
 
3598
/* Create a ppc64 ELF linker hash table.  */
3599
 
3600
static struct bfd_link_hash_table *
3601
ppc64_elf_link_hash_table_create (bfd *abfd)
3602
{
3603
  struct ppc_link_hash_table *htab;
3604
  bfd_size_type amt = sizeof (struct ppc_link_hash_table);
3605
 
3606
  htab = bfd_zmalloc (amt);
3607
  if (htab == NULL)
3608
    return NULL;
3609
 
3610
  if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
3611
                                      sizeof (struct ppc_link_hash_entry)))
3612
    {
3613
      free (htab);
3614
      return NULL;
3615
    }
3616
 
3617
  /* Init the stub hash table too.  */
3618
  if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
3619
                            sizeof (struct ppc_stub_hash_entry)))
3620
    return NULL;
3621
 
3622
  /* And the branch hash table.  */
3623
  if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
3624
                            sizeof (struct ppc_branch_hash_entry)))
3625
    return NULL;
3626
 
3627
  /* Initializing two fields of the union is just cosmetic.  We really
3628
     only care about glist, but when compiled on a 32-bit host the
3629
     bfd_vma fields are larger.  Setting the bfd_vma to zero makes
3630
     debugger inspection of these fields look nicer.  */
3631
  htab->elf.init_got_refcount.refcount = 0;
3632
  htab->elf.init_got_refcount.glist = NULL;
3633
  htab->elf.init_plt_refcount.refcount = 0;
3634
  htab->elf.init_plt_refcount.glist = NULL;
3635
  htab->elf.init_got_offset.offset = 0;
3636
  htab->elf.init_got_offset.glist = NULL;
3637
  htab->elf.init_plt_offset.offset = 0;
3638
  htab->elf.init_plt_offset.glist = NULL;
3639
 
3640
  return &htab->elf.root;
3641
}
3642
 
3643
/* Free the derived linker hash table.  */
3644
 
3645
static void
3646
ppc64_elf_link_hash_table_free (struct bfd_link_hash_table *hash)
3647
{
3648
  struct ppc_link_hash_table *ret = (struct ppc_link_hash_table *) hash;
3649
 
3650
  bfd_hash_table_free (&ret->stub_hash_table);
3651
  bfd_hash_table_free (&ret->branch_hash_table);
3652
  _bfd_generic_link_hash_table_free (hash);
3653
}
3654
 
3655
/* Satisfy the ELF linker by filling in some fields in our fake bfd.  */
3656
 
3657
void
3658
ppc64_elf_init_stub_bfd (bfd *abfd, struct bfd_link_info *info)
3659
{
3660
  struct ppc_link_hash_table *htab;
3661
 
3662
  elf_elfheader (abfd)->e_ident[EI_CLASS] = ELFCLASS64;
3663
 
3664
/* Always hook our dynamic sections into the first bfd, which is the
3665
   linker created stub bfd.  This ensures that the GOT header is at
3666
   the start of the output TOC section.  */
3667
  htab = ppc_hash_table (info);
3668
  htab->stub_bfd = abfd;
3669
  htab->elf.dynobj = abfd;
3670
}
3671
 
3672
/* Build a name for an entry in the stub hash table.  */
3673
 
3674
static char *
3675
ppc_stub_name (const asection *input_section,
3676
               const asection *sym_sec,
3677
               const struct ppc_link_hash_entry *h,
3678
               const Elf_Internal_Rela *rel)
3679
{
3680
  char *stub_name;
3681
  bfd_size_type len;
3682
 
3683
  /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
3684
     offsets from a sym as a branch target?  In fact, we could
3685
     probably assume the addend is always zero.  */
3686
  BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
3687
 
3688
  if (h)
3689
    {
3690
      len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
3691
      stub_name = bfd_malloc (len);
3692
      if (stub_name == NULL)
3693
        return stub_name;
3694
 
3695
      sprintf (stub_name, "%08x.%s+%x",
3696
               input_section->id & 0xffffffff,
3697
               h->elf.root.root.string,
3698
               (int) rel->r_addend & 0xffffffff);
3699
    }
3700
  else
3701
    {
3702
      len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
3703
      stub_name = bfd_malloc (len);
3704
      if (stub_name == NULL)
3705
        return stub_name;
3706
 
3707
      sprintf (stub_name, "%08x.%x:%x+%x",
3708
               input_section->id & 0xffffffff,
3709
               sym_sec->id & 0xffffffff,
3710
               (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
3711
               (int) rel->r_addend & 0xffffffff);
3712
    }
3713
  if (stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
3714
    stub_name[len - 2] = 0;
3715
  return stub_name;
3716
}
3717
 
3718
/* Look up an entry in the stub hash.  Stub entries are cached because
3719
   creating the stub name takes a bit of time.  */
3720
 
3721
static struct ppc_stub_hash_entry *
3722
ppc_get_stub_entry (const asection *input_section,
3723
                    const asection *sym_sec,
3724
                    struct ppc_link_hash_entry *h,
3725
                    const Elf_Internal_Rela *rel,
3726
                    struct ppc_link_hash_table *htab)
3727
{
3728
  struct ppc_stub_hash_entry *stub_entry;
3729
  const asection *id_sec;
3730
 
3731
  /* If this input section is part of a group of sections sharing one
3732
     stub section, then use the id of the first section in the group.
3733
     Stub names need to include a section id, as there may well be
3734
     more than one stub used to reach say, printf, and we need to
3735
     distinguish between them.  */
3736
  id_sec = htab->stub_group[input_section->id].link_sec;
3737
 
3738
  if (h != NULL && h->u.stub_cache != NULL
3739
      && h->u.stub_cache->h == h
3740
      && h->u.stub_cache->id_sec == id_sec)
3741
    {
3742
      stub_entry = h->u.stub_cache;
3743
    }
3744
  else
3745
    {
3746
      char *stub_name;
3747
 
3748
      stub_name = ppc_stub_name (id_sec, sym_sec, h, rel);
3749
      if (stub_name == NULL)
3750
        return NULL;
3751
 
3752
      stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
3753
                                         stub_name, FALSE, FALSE);
3754
      if (h != NULL)
3755
        h->u.stub_cache = stub_entry;
3756
 
3757
      free (stub_name);
3758
    }
3759
 
3760
  return stub_entry;
3761
}
3762
 
3763
/* Add a new stub entry to the stub hash.  Not all fields of the new
3764
   stub entry are initialised.  */
3765
 
3766
static struct ppc_stub_hash_entry *
3767
ppc_add_stub (const char *stub_name,
3768
              asection *section,
3769
              struct ppc_link_hash_table *htab)
3770
{
3771
  asection *link_sec;
3772
  asection *stub_sec;
3773
  struct ppc_stub_hash_entry *stub_entry;
3774
 
3775
  link_sec = htab->stub_group[section->id].link_sec;
3776
  stub_sec = htab->stub_group[section->id].stub_sec;
3777
  if (stub_sec == NULL)
3778
    {
3779
      stub_sec = htab->stub_group[link_sec->id].stub_sec;
3780
      if (stub_sec == NULL)
3781
        {
3782
          size_t namelen;
3783
          bfd_size_type len;
3784
          char *s_name;
3785
 
3786
          namelen = strlen (link_sec->name);
3787
          len = namelen + sizeof (STUB_SUFFIX);
3788
          s_name = bfd_alloc (htab->stub_bfd, len);
3789
          if (s_name == NULL)
3790
            return NULL;
3791
 
3792
          memcpy (s_name, link_sec->name, namelen);
3793
          memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
3794
          stub_sec = (*htab->add_stub_section) (s_name, link_sec);
3795
          if (stub_sec == NULL)
3796
            return NULL;
3797
          htab->stub_group[link_sec->id].stub_sec = stub_sec;
3798
        }
3799
      htab->stub_group[section->id].stub_sec = stub_sec;
3800
    }
3801
 
3802
  /* Enter this entry into the linker stub hash table.  */
3803
  stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
3804
                                     TRUE, FALSE);
3805
  if (stub_entry == NULL)
3806
    {
3807
      (*_bfd_error_handler) (_("%B: cannot create stub entry %s"),
3808
                             section->owner, stub_name);
3809
      return NULL;
3810
    }
3811
 
3812
  stub_entry->stub_sec = stub_sec;
3813
  stub_entry->stub_offset = 0;
3814
  stub_entry->id_sec = link_sec;
3815
  return stub_entry;
3816
}
3817
 
3818
/* Create sections for linker generated code.  */
3819
 
3820
static bfd_boolean
3821
create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
3822
{
3823
  struct ppc_link_hash_table *htab;
3824
  flagword flags;
3825
 
3826
  htab = ppc_hash_table (info);
3827
 
3828
  /* Create .sfpr for code to save and restore fp regs.  */
3829
  flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
3830
           | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3831
  htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
3832
                                                   flags);
3833
  if (htab->sfpr == NULL
3834
      || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
3835
    return FALSE;
3836
 
3837
  /* Create .glink for lazy dynamic linking support.  */
3838
  htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
3839
                                                    flags);
3840
  if (htab->glink == NULL
3841
      || ! bfd_set_section_alignment (dynobj, htab->glink, 3))
3842
    return FALSE;
3843
 
3844
  /* Create branch lookup table for plt_branch stubs.  */
3845
  flags = (SEC_ALLOC | SEC_LOAD
3846
           | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3847
  htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
3848
                                                   flags);
3849
  if (htab->brlt == NULL
3850
      || ! bfd_set_section_alignment (dynobj, htab->brlt, 3))
3851
    return FALSE;
3852
 
3853
  if (!info->shared)
3854
    return TRUE;
3855
 
3856
  flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
3857
           | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3858
  htab->relbrlt = bfd_make_section_anyway_with_flags (dynobj,
3859
                                                      ".rela.branch_lt",
3860
                                                      flags);
3861
  if (!htab->relbrlt
3862
      || ! bfd_set_section_alignment (dynobj, htab->relbrlt, 3))
3863
    return FALSE;
3864
 
3865
  return TRUE;
3866
}
3867
 
3868
/* Create .got and .rela.got sections in ABFD, and .got in dynobj if
3869
   not already done.  */
3870
 
3871
static bfd_boolean
3872
create_got_section (bfd *abfd, struct bfd_link_info *info)
3873
{
3874
  asection *got, *relgot;
3875
  flagword flags;
3876
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
3877
 
3878
  if (!is_ppc64_elf (abfd))
3879
    return FALSE;
3880
 
3881
  if (!htab->got)
3882
    {
3883
      if (! _bfd_elf_create_got_section (htab->elf.dynobj, info))
3884
        return FALSE;
3885
 
3886
      htab->got = bfd_get_section_by_name (htab->elf.dynobj, ".got");
3887
      if (!htab->got)
3888
        abort ();
3889
    }
3890
 
3891
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3892
           | SEC_LINKER_CREATED);
3893
 
3894
  got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
3895
  if (!got
3896
      || !bfd_set_section_alignment (abfd, got, 3))
3897
    return FALSE;
3898
 
3899
  relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
3900
                                               flags | SEC_READONLY);
3901
  if (!relgot
3902
      || ! bfd_set_section_alignment (abfd, relgot, 3))
3903
    return FALSE;
3904
 
3905
  ppc64_elf_tdata (abfd)->got = got;
3906
  ppc64_elf_tdata (abfd)->relgot = relgot;
3907
  return TRUE;
3908
}
3909
 
3910
/* Create the dynamic sections, and set up shortcuts.  */
3911
 
3912
static bfd_boolean
3913
ppc64_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
3914
{
3915
  struct ppc_link_hash_table *htab;
3916
 
3917
  if (!_bfd_elf_create_dynamic_sections (dynobj, info))
3918
    return FALSE;
3919
 
3920
  htab = ppc_hash_table (info);
3921
  if (!htab->got)
3922
    htab->got = bfd_get_section_by_name (dynobj, ".got");
3923
  htab->plt = bfd_get_section_by_name (dynobj, ".plt");
3924
  htab->relplt = bfd_get_section_by_name (dynobj, ".rela.plt");
3925
  htab->dynbss = bfd_get_section_by_name (dynobj, ".dynbss");
3926
  if (!info->shared)
3927
    htab->relbss = bfd_get_section_by_name (dynobj, ".rela.bss");
3928
 
3929
  if (!htab->got || !htab->plt || !htab->relplt || !htab->dynbss
3930
      || (!info->shared && !htab->relbss))
3931
    abort ();
3932
 
3933
  return TRUE;
3934
}
3935
 
3936
/* Merge PLT info on FROM with that on TO.  */
3937
 
3938
static void
3939
move_plt_plist (struct ppc_link_hash_entry *from,
3940
                struct ppc_link_hash_entry *to)
3941
{
3942
  if (from->elf.plt.plist != NULL)
3943
    {
3944
      if (to->elf.plt.plist != NULL)
3945
        {
3946
          struct plt_entry **entp;
3947
          struct plt_entry *ent;
3948
 
3949
          for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
3950
            {
3951
              struct plt_entry *dent;
3952
 
3953
              for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
3954
                if (dent->addend == ent->addend)
3955
                  {
3956
                    dent->plt.refcount += ent->plt.refcount;
3957
                    *entp = ent->next;
3958
                    break;
3959
                  }
3960
              if (dent == NULL)
3961
                entp = &ent->next;
3962
            }
3963
          *entp = to->elf.plt.plist;
3964
        }
3965
 
3966
      to->elf.plt.plist = from->elf.plt.plist;
3967
      from->elf.plt.plist = NULL;
3968
    }
3969
}
3970
 
3971
/* Copy the extra info we tack onto an elf_link_hash_entry.  */
3972
 
3973
static void
3974
ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
3975
                                struct elf_link_hash_entry *dir,
3976
                                struct elf_link_hash_entry *ind)
3977
{
3978
  struct ppc_link_hash_entry *edir, *eind;
3979
 
3980
  edir = (struct ppc_link_hash_entry *) dir;
3981
  eind = (struct ppc_link_hash_entry *) ind;
3982
 
3983
  /* Copy over any dynamic relocs we may have on the indirect sym.  */
3984
  if (eind->dyn_relocs != NULL)
3985
    {
3986
      if (edir->dyn_relocs != NULL)
3987
        {
3988
          struct ppc_dyn_relocs **pp;
3989
          struct ppc_dyn_relocs *p;
3990
 
3991
          /* Add reloc counts against the indirect sym to the direct sym
3992
             list.  Merge any entries against the same section.  */
3993
          for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
3994
            {
3995
              struct ppc_dyn_relocs *q;
3996
 
3997
              for (q = edir->dyn_relocs; q != NULL; q = q->next)
3998
                if (q->sec == p->sec)
3999
                  {
4000
                    q->pc_count += p->pc_count;
4001
                    q->count += p->count;
4002
                    *pp = p->next;
4003
                    break;
4004
                  }
4005
              if (q == NULL)
4006
                pp = &p->next;
4007
            }
4008
          *pp = edir->dyn_relocs;
4009
        }
4010
 
4011
      edir->dyn_relocs = eind->dyn_relocs;
4012
      eind->dyn_relocs = NULL;
4013
    }
4014
 
4015
  edir->is_func |= eind->is_func;
4016
  edir->is_func_descriptor |= eind->is_func_descriptor;
4017
  edir->tls_mask |= eind->tls_mask;
4018
 
4019
  /* If called to transfer flags for a weakdef during processing
4020
     of elf_adjust_dynamic_symbol, don't copy NON_GOT_REF.
4021
     We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
4022
  if (!(ELIMINATE_COPY_RELOCS
4023
        && eind->elf.root.type != bfd_link_hash_indirect
4024
        && edir->elf.dynamic_adjusted))
4025
    edir->elf.non_got_ref |= eind->elf.non_got_ref;
4026
 
4027
  edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
4028
  edir->elf.ref_regular |= eind->elf.ref_regular;
4029
  edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4030
  edir->elf.needs_plt |= eind->elf.needs_plt;
4031
 
4032
  /* If we were called to copy over info for a weak sym, that's all.  */
4033
  if (eind->elf.root.type != bfd_link_hash_indirect)
4034
    return;
4035
 
4036
  /* Copy over got entries that we may have already seen to the
4037
     symbol which just became indirect.  */
4038
  if (eind->elf.got.glist != NULL)
4039
    {
4040
      if (edir->elf.got.glist != NULL)
4041
        {
4042
          struct got_entry **entp;
4043
          struct got_entry *ent;
4044
 
4045
          for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
4046
            {
4047
              struct got_entry *dent;
4048
 
4049
              for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
4050
                if (dent->addend == ent->addend
4051
                    && dent->owner == ent->owner
4052
                    && dent->tls_type == ent->tls_type)
4053
                  {
4054
                    dent->got.refcount += ent->got.refcount;
4055
                    *entp = ent->next;
4056
                    break;
4057
                  }
4058
              if (dent == NULL)
4059
                entp = &ent->next;
4060
            }
4061
          *entp = edir->elf.got.glist;
4062
        }
4063
 
4064
      edir->elf.got.glist = eind->elf.got.glist;
4065
      eind->elf.got.glist = NULL;
4066
    }
4067
 
4068
  /* And plt entries.  */
4069
  move_plt_plist (eind, edir);
4070
 
4071
  if (eind->elf.dynindx != -1)
4072
    {
4073
      if (edir->elf.dynindx != -1)
4074
        _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
4075
                                edir->elf.dynstr_index);
4076
      edir->elf.dynindx = eind->elf.dynindx;
4077
      edir->elf.dynstr_index = eind->elf.dynstr_index;
4078
      eind->elf.dynindx = -1;
4079
      eind->elf.dynstr_index = 0;
4080
    }
4081
}
4082
 
4083
/* Find the function descriptor hash entry from the given function code
4084
   hash entry FH.  Link the entries via their OH fields.  */
4085
 
4086
static struct ppc_link_hash_entry *
4087
get_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
4088
{
4089
  struct ppc_link_hash_entry *fdh = fh->oh;
4090
 
4091
  if (fdh == NULL)
4092
    {
4093
      const char *fd_name = fh->elf.root.root.string + 1;
4094
 
4095
      fdh = (struct ppc_link_hash_entry *)
4096
        elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
4097
      if (fdh != NULL)
4098
        {
4099
          fdh->is_func_descriptor = 1;
4100
          fdh->oh = fh;
4101
          fh->is_func = 1;
4102
          fh->oh = fdh;
4103
        }
4104
    }
4105
 
4106
  return fdh;
4107
}
4108
 
4109
/* Make a fake function descriptor sym for the code sym FH.  */
4110
 
4111
static struct ppc_link_hash_entry *
4112
make_fdh (struct bfd_link_info *info,
4113
          struct ppc_link_hash_entry *fh)
4114
{
4115
  bfd *abfd;
4116
  asymbol *newsym;
4117
  struct bfd_link_hash_entry *bh;
4118
  struct ppc_link_hash_entry *fdh;
4119
 
4120
  abfd = fh->elf.root.u.undef.abfd;
4121
  newsym = bfd_make_empty_symbol (abfd);
4122
  newsym->name = fh->elf.root.root.string + 1;
4123
  newsym->section = bfd_und_section_ptr;
4124
  newsym->value = 0;
4125
  newsym->flags = BSF_WEAK;
4126
 
4127
  bh = NULL;
4128
  if (!_bfd_generic_link_add_one_symbol (info, abfd, newsym->name,
4129
                                         newsym->flags, newsym->section,
4130
                                         newsym->value, NULL, FALSE, FALSE,
4131
                                         &bh))
4132
    return NULL;
4133
 
4134
  fdh = (struct ppc_link_hash_entry *) bh;
4135
  fdh->elf.non_elf = 0;
4136
  fdh->fake = 1;
4137
  fdh->is_func_descriptor = 1;
4138
  fdh->oh = fh;
4139
  fh->is_func = 1;
4140
  fh->oh = fdh;
4141
  return fdh;
4142
}
4143
 
4144
/* Fix function descriptor symbols defined in .opd sections to be
4145
   function type.  */
4146
 
4147
static bfd_boolean
4148
ppc64_elf_add_symbol_hook (bfd *ibfd ATTRIBUTE_UNUSED,
4149
                           struct bfd_link_info *info ATTRIBUTE_UNUSED,
4150
                           Elf_Internal_Sym *isym,
4151
                           const char **name ATTRIBUTE_UNUSED,
4152
                           flagword *flags ATTRIBUTE_UNUSED,
4153
                           asection **sec,
4154
                           bfd_vma *value ATTRIBUTE_UNUSED)
4155
{
4156
  if (*sec != NULL
4157
      && strcmp (bfd_get_section_name (ibfd, *sec), ".opd") == 0)
4158
    isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
4159
 
4160
  return TRUE;
4161
}
4162
 
4163
/* This function makes an old ABI object reference to ".bar" cause the
4164
   inclusion of a new ABI object archive that defines "bar".
4165
   NAME is a symbol defined in an archive.  Return a symbol in the hash
4166
   table that might be satisfied by the archive symbols.  */
4167
 
4168
static struct elf_link_hash_entry *
4169
ppc64_elf_archive_symbol_lookup (bfd *abfd,
4170
                                 struct bfd_link_info *info,
4171
                                 const char *name)
4172
{
4173
  struct elf_link_hash_entry *h;
4174
  char *dot_name;
4175
  size_t len;
4176
 
4177
  h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
4178
  if (h != NULL
4179
      /* Don't return this sym if it is a fake function descriptor
4180
         created by add_symbol_adjust.  */
4181
      && !(h->root.type == bfd_link_hash_undefweak
4182
           && ((struct ppc_link_hash_entry *) h)->fake))
4183
    return h;
4184
 
4185
  if (name[0] == '.')
4186
    return h;
4187
 
4188
  len = strlen (name);
4189
  dot_name = bfd_alloc (abfd, len + 2);
4190
  if (dot_name == NULL)
4191
    return (struct elf_link_hash_entry *) 0 - 1;
4192
  dot_name[0] = '.';
4193
  memcpy (dot_name + 1, name, len + 1);
4194
  h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
4195
  bfd_release (abfd, dot_name);
4196
  return h;
4197
}
4198
 
4199
/* This function satisfies all old ABI object references to ".bar" if a
4200
   new ABI object defines "bar".  Well, at least, undefined dot symbols
4201
   are made weak.  This stops later archive searches from including an
4202
   object if we already have a function descriptor definition.  It also
4203
   prevents the linker complaining about undefined symbols.
4204
   We also check and correct mismatched symbol visibility here.  The
4205
   most restrictive visibility of the function descriptor and the
4206
   function entry symbol is used.  */
4207
 
4208
static bfd_boolean
4209
add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
4210
{
4211
  struct ppc_link_hash_table *htab;
4212
  struct ppc_link_hash_entry *fdh;
4213
 
4214
  if (eh->elf.root.type == bfd_link_hash_indirect)
4215
    return TRUE;
4216
 
4217
  if (eh->elf.root.type == bfd_link_hash_warning)
4218
    eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
4219
 
4220
  if (eh->elf.root.root.string[0] != '.')
4221
    abort ();
4222
 
4223
  htab = ppc_hash_table (info);
4224
  fdh = get_fdh (eh, htab);
4225
  if (fdh == NULL
4226
      && !info->relocatable
4227
      && (eh->elf.root.type == bfd_link_hash_undefined
4228
          || eh->elf.root.type == bfd_link_hash_undefweak)
4229
      && eh->elf.ref_regular)
4230
    {
4231
      /* Make an undefweak function descriptor sym, which is enough to
4232
         pull in an --as-needed shared lib, but won't cause link
4233
         errors.  Archives are handled elsewhere.  */
4234
      fdh = make_fdh (info, eh);
4235
      if (fdh == NULL)
4236
        return FALSE;
4237
      else
4238
        fdh->elf.ref_regular = 1;
4239
    }
4240
  else if (fdh != NULL)
4241
    {
4242
      unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
4243
      unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
4244
      if (entry_vis < descr_vis)
4245
        fdh->elf.other += entry_vis - descr_vis;
4246
      else if (entry_vis > descr_vis)
4247
        eh->elf.other += descr_vis - entry_vis;
4248
 
4249
      if ((fdh->elf.root.type == bfd_link_hash_defined
4250
           || fdh->elf.root.type == bfd_link_hash_defweak)
4251
          && eh->elf.root.type == bfd_link_hash_undefined)
4252
        {
4253
          eh->elf.root.type = bfd_link_hash_undefweak;
4254
          eh->was_undefined = 1;
4255
          htab->twiddled_syms = 1;
4256
        }
4257
    }
4258
 
4259
  return TRUE;
4260
}
4261
 
4262
/* Process list of dot-symbols we made in link_hash_newfunc.  */
4263
 
4264
static bfd_boolean
4265
ppc64_elf_check_directives (bfd *ibfd, struct bfd_link_info *info)
4266
{
4267
  struct ppc_link_hash_table *htab;
4268
  struct ppc_link_hash_entry **p, *eh;
4269
 
4270
  htab = ppc_hash_table (info);
4271
  if (!is_ppc64_elf (info->output_bfd))
4272
    return TRUE;
4273
 
4274
  if (is_ppc64_elf (ibfd))
4275
    {
4276
      p = &htab->dot_syms;
4277
      while ((eh = *p) != NULL)
4278
        {
4279
          *p = NULL;
4280
          if (!add_symbol_adjust (eh, info))
4281
            return FALSE;
4282
          p = &eh->u.next_dot_sym;
4283
        }
4284
    }
4285
 
4286
  /* Clear the list for non-ppc64 input files.  */
4287
  p = &htab->dot_syms;
4288
  while ((eh = *p) != NULL)
4289
    {
4290
      *p = NULL;
4291
      p = &eh->u.next_dot_sym;
4292
    }
4293
 
4294
  /* We need to fix the undefs list for any syms we have twiddled to
4295
     undef_weak.  */
4296
  if (htab->twiddled_syms)
4297
    {
4298
      bfd_link_repair_undef_list (&htab->elf.root);
4299
      htab->twiddled_syms = 0;
4300
    }
4301
  return TRUE;
4302
}
4303
 
4304
/* Undo hash table changes when an --as-needed input file is determined
4305
   not to be needed.  */
4306
 
4307
static bfd_boolean
4308
ppc64_elf_as_needed_cleanup (bfd *ibfd ATTRIBUTE_UNUSED,
4309
                             struct bfd_link_info *info)
4310
{
4311
  ppc_hash_table (info)->dot_syms = NULL;
4312
  return TRUE;
4313
}
4314
 
4315
static bfd_boolean
4316
update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
4317
                       unsigned long r_symndx, bfd_vma r_addend, int tls_type)
4318
{
4319
  struct got_entry **local_got_ents = elf_local_got_ents (abfd);
4320
  char *local_got_tls_masks;
4321
 
4322
  if (local_got_ents == NULL)
4323
    {
4324
      bfd_size_type size = symtab_hdr->sh_info;
4325
 
4326
      size *= sizeof (*local_got_ents) + sizeof (*local_got_tls_masks);
4327
      local_got_ents = bfd_zalloc (abfd, size);
4328
      if (local_got_ents == NULL)
4329
        return FALSE;
4330
      elf_local_got_ents (abfd) = local_got_ents;
4331
    }
4332
 
4333
  if ((tls_type & TLS_EXPLICIT) == 0)
4334
    {
4335
      struct got_entry *ent;
4336
 
4337
      for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
4338
        if (ent->addend == r_addend
4339
            && ent->owner == abfd
4340
            && ent->tls_type == tls_type)
4341
          break;
4342
      if (ent == NULL)
4343
        {
4344
          bfd_size_type amt = sizeof (*ent);
4345
          ent = bfd_alloc (abfd, amt);
4346
          if (ent == NULL)
4347
            return FALSE;
4348
          ent->next = local_got_ents[r_symndx];
4349
          ent->addend = r_addend;
4350
          ent->owner = abfd;
4351
          ent->tls_type = tls_type;
4352
          ent->got.refcount = 0;
4353
          local_got_ents[r_symndx] = ent;
4354
        }
4355
      ent->got.refcount += 1;
4356
    }
4357
 
4358
  local_got_tls_masks = (char *) (local_got_ents + symtab_hdr->sh_info);
4359
  local_got_tls_masks[r_symndx] |= tls_type;
4360
  return TRUE;
4361
}
4362
 
4363
static bfd_boolean
4364
update_plt_info (bfd *abfd, struct ppc_link_hash_entry *eh, bfd_vma addend)
4365
{
4366
  struct plt_entry *ent;
4367
 
4368
  for (ent = eh->elf.plt.plist; ent != NULL; ent = ent->next)
4369
    if (ent->addend == addend)
4370
      break;
4371
  if (ent == NULL)
4372
    {
4373
      bfd_size_type amt = sizeof (*ent);
4374
      ent = bfd_alloc (abfd, amt);
4375
      if (ent == NULL)
4376
        return FALSE;
4377
      ent->next = eh->elf.plt.plist;
4378
      ent->addend = addend;
4379
      ent->plt.refcount = 0;
4380
      eh->elf.plt.plist = ent;
4381
    }
4382
  ent->plt.refcount += 1;
4383
  eh->elf.needs_plt = 1;
4384
  if (eh->elf.root.root.string[0] == '.'
4385
      && eh->elf.root.root.string[1] != '\0')
4386
    eh->is_func = 1;
4387
  return TRUE;
4388
}
4389
 
4390
/* Look through the relocs for a section during the first phase, and
4391
   calculate needed space in the global offset table, procedure
4392
   linkage table, and dynamic reloc sections.  */
4393
 
4394
static bfd_boolean
4395
ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
4396
                        asection *sec, const Elf_Internal_Rela *relocs)
4397
{
4398
  struct ppc_link_hash_table *htab;
4399
  Elf_Internal_Shdr *symtab_hdr;
4400
  struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
4401
  const Elf_Internal_Rela *rel;
4402
  const Elf_Internal_Rela *rel_end;
4403
  asection *sreloc;
4404
  asection **opd_sym_map;
4405
 
4406
  if (info->relocatable)
4407
    return TRUE;
4408
 
4409
  /* Don't do anything special with non-loaded, non-alloced sections.
4410
     In particular, any relocs in such sections should not affect GOT
4411
     and PLT reference counting (ie. we don't allow them to create GOT
4412
     or PLT entries), there's no possibility or desire to optimize TLS
4413
     relocs, and there's not much point in propagating relocs to shared
4414
     libs that the dynamic linker won't relocate.  */
4415
  if ((sec->flags & SEC_ALLOC) == 0)
4416
    return TRUE;
4417
 
4418
  BFD_ASSERT (is_ppc64_elf (abfd));
4419
 
4420
  htab = ppc_hash_table (info);
4421
  symtab_hdr = &elf_symtab_hdr (abfd);
4422
 
4423
  sym_hashes = elf_sym_hashes (abfd);
4424
  sym_hashes_end = (sym_hashes
4425
                    + symtab_hdr->sh_size / sizeof (Elf64_External_Sym)
4426
                    - symtab_hdr->sh_info);
4427
 
4428
  sreloc = NULL;
4429
  opd_sym_map = NULL;
4430
  if (strcmp (bfd_get_section_name (abfd, sec), ".opd") == 0)
4431
    {
4432
      /* Garbage collection needs some extra help with .opd sections.
4433
         We don't want to necessarily keep everything referenced by
4434
         relocs in .opd, as that would keep all functions.  Instead,
4435
         if we reference an .opd symbol (a function descriptor), we
4436
         want to keep the function code symbol's section.  This is
4437
         easy for global symbols, but for local syms we need to keep
4438
         information about the associated function section.  */
4439
      bfd_size_type amt;
4440
 
4441
      amt = sec->size * sizeof (*opd_sym_map) / 8;
4442
      opd_sym_map = bfd_zalloc (abfd, amt);
4443
      if (opd_sym_map == NULL)
4444
        return FALSE;
4445
      ppc64_elf_section_data (sec)->u.opd.func_sec = opd_sym_map;
4446
      BFD_ASSERT (ppc64_elf_section_data (sec)->sec_type == sec_normal);
4447
      ppc64_elf_section_data (sec)->sec_type = sec_opd;
4448
    }
4449
 
4450
  if (htab->sfpr == NULL
4451
      && !create_linkage_sections (htab->elf.dynobj, info))
4452
    return FALSE;
4453
 
4454
  rel_end = relocs + sec->reloc_count;
4455
  for (rel = relocs; rel < rel_end; rel++)
4456
    {
4457
      unsigned long r_symndx;
4458
      struct elf_link_hash_entry *h;
4459
      enum elf_ppc64_reloc_type r_type;
4460
      int tls_type = 0;
4461
      struct _ppc64_elf_section_data *ppc64_sec;
4462
 
4463
      r_symndx = ELF64_R_SYM (rel->r_info);
4464
      if (r_symndx < symtab_hdr->sh_info)
4465
        h = NULL;
4466
      else
4467
        {
4468
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4469
          while (h->root.type == bfd_link_hash_indirect
4470
                 || h->root.type == bfd_link_hash_warning)
4471
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
4472
        }
4473
 
4474
      r_type = ELF64_R_TYPE (rel->r_info);
4475
      switch (r_type)
4476
        {
4477
        case R_PPC64_GOT_TLSLD16:
4478
        case R_PPC64_GOT_TLSLD16_LO:
4479
        case R_PPC64_GOT_TLSLD16_HI:
4480
        case R_PPC64_GOT_TLSLD16_HA:
4481
          tls_type = TLS_TLS | TLS_LD;
4482
          goto dogottls;
4483
 
4484
        case R_PPC64_GOT_TLSGD16:
4485
        case R_PPC64_GOT_TLSGD16_LO:
4486
        case R_PPC64_GOT_TLSGD16_HI:
4487
        case R_PPC64_GOT_TLSGD16_HA:
4488
          tls_type = TLS_TLS | TLS_GD;
4489
          goto dogottls;
4490
 
4491
        case R_PPC64_GOT_TPREL16_DS:
4492
        case R_PPC64_GOT_TPREL16_LO_DS:
4493
        case R_PPC64_GOT_TPREL16_HI:
4494
        case R_PPC64_GOT_TPREL16_HA:
4495
          if (info->shared)
4496
            info->flags |= DF_STATIC_TLS;
4497
          tls_type = TLS_TLS | TLS_TPREL;
4498
          goto dogottls;
4499
 
4500
        case R_PPC64_GOT_DTPREL16_DS:
4501
        case R_PPC64_GOT_DTPREL16_LO_DS:
4502
        case R_PPC64_GOT_DTPREL16_HI:
4503
        case R_PPC64_GOT_DTPREL16_HA:
4504
          tls_type = TLS_TLS | TLS_DTPREL;
4505
        dogottls:
4506
          sec->has_tls_reloc = 1;
4507
          /* Fall thru */
4508
 
4509
        case R_PPC64_GOT16:
4510
        case R_PPC64_GOT16_DS:
4511
        case R_PPC64_GOT16_HA:
4512
        case R_PPC64_GOT16_HI:
4513
        case R_PPC64_GOT16_LO:
4514
        case R_PPC64_GOT16_LO_DS:
4515
          /* This symbol requires a global offset table entry.  */
4516
          sec->has_toc_reloc = 1;
4517
          if (ppc64_elf_tdata (abfd)->got == NULL
4518
              && !create_got_section (abfd, info))
4519
            return FALSE;
4520
 
4521
          if (h != NULL)
4522
            {
4523
              struct ppc_link_hash_entry *eh;
4524
              struct got_entry *ent;
4525
 
4526
              eh = (struct ppc_link_hash_entry *) h;
4527
              for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
4528
                if (ent->addend == rel->r_addend
4529
                    && ent->owner == abfd
4530
                    && ent->tls_type == tls_type)
4531
                  break;
4532
              if (ent == NULL)
4533
                {
4534
                  bfd_size_type amt = sizeof (*ent);
4535
                  ent = bfd_alloc (abfd, amt);
4536
                  if (ent == NULL)
4537
                    return FALSE;
4538
                  ent->next = eh->elf.got.glist;
4539
                  ent->addend = rel->r_addend;
4540
                  ent->owner = abfd;
4541
                  ent->tls_type = tls_type;
4542
                  ent->got.refcount = 0;
4543
                  eh->elf.got.glist = ent;
4544
                }
4545
              ent->got.refcount += 1;
4546
              eh->tls_mask |= tls_type;
4547
            }
4548
          else
4549
            /* This is a global offset table entry for a local symbol.  */
4550
            if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
4551
                                        rel->r_addend, tls_type))
4552
              return FALSE;
4553
          break;
4554
 
4555
        case R_PPC64_PLT16_HA:
4556
        case R_PPC64_PLT16_HI:
4557
        case R_PPC64_PLT16_LO:
4558
        case R_PPC64_PLT32:
4559
        case R_PPC64_PLT64:
4560
          /* This symbol requires a procedure linkage table entry.  We
4561
             actually build the entry in adjust_dynamic_symbol,
4562
             because this might be a case of linking PIC code without
4563
             linking in any dynamic objects, in which case we don't
4564
             need to generate a procedure linkage table after all.  */
4565
          if (h == NULL)
4566
            {
4567
              /* It does not make sense to have a procedure linkage
4568
                 table entry for a local symbol.  */
4569
              bfd_set_error (bfd_error_bad_value);
4570
              return FALSE;
4571
            }
4572
          else
4573
            if (!update_plt_info (abfd, (struct ppc_link_hash_entry *) h,
4574
                                  rel->r_addend))
4575
              return FALSE;
4576
          break;
4577
 
4578
          /* The following relocations don't need to propagate the
4579
             relocation if linking a shared object since they are
4580
             section relative.  */
4581
        case R_PPC64_SECTOFF:
4582
        case R_PPC64_SECTOFF_LO:
4583
        case R_PPC64_SECTOFF_HI:
4584
        case R_PPC64_SECTOFF_HA:
4585
        case R_PPC64_SECTOFF_DS:
4586
        case R_PPC64_SECTOFF_LO_DS:
4587
        case R_PPC64_DTPREL16:
4588
        case R_PPC64_DTPREL16_LO:
4589
        case R_PPC64_DTPREL16_HI:
4590
        case R_PPC64_DTPREL16_HA:
4591
        case R_PPC64_DTPREL16_DS:
4592
        case R_PPC64_DTPREL16_LO_DS:
4593
        case R_PPC64_DTPREL16_HIGHER:
4594
        case R_PPC64_DTPREL16_HIGHERA:
4595
        case R_PPC64_DTPREL16_HIGHEST:
4596
        case R_PPC64_DTPREL16_HIGHESTA:
4597
          break;
4598
 
4599
          /* Nor do these.  */
4600
        case R_PPC64_TOC16:
4601
        case R_PPC64_TOC16_LO:
4602
        case R_PPC64_TOC16_HI:
4603
        case R_PPC64_TOC16_HA:
4604
        case R_PPC64_TOC16_DS:
4605
        case R_PPC64_TOC16_LO_DS:
4606
          sec->has_toc_reloc = 1;
4607
          break;
4608
 
4609
          /* This relocation describes the C++ object vtable hierarchy.
4610
             Reconstruct it for later use during GC.  */
4611
        case R_PPC64_GNU_VTINHERIT:
4612
          if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
4613
            return FALSE;
4614
          break;
4615
 
4616
          /* This relocation describes which C++ vtable entries are actually
4617
             used.  Record for later use during GC.  */
4618
        case R_PPC64_GNU_VTENTRY:
4619
          BFD_ASSERT (h != NULL);
4620
          if (h != NULL
4621
              && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
4622
            return FALSE;
4623
          break;
4624
 
4625
        case R_PPC64_REL14:
4626
        case R_PPC64_REL14_BRTAKEN:
4627
        case R_PPC64_REL14_BRNTAKEN:
4628
          {
4629
            asection *dest = NULL;
4630
 
4631
            /* Heuristic: If jumping outside our section, chances are
4632
               we are going to need a stub.  */
4633
            if (h != NULL)
4634
              {
4635
                /* If the sym is weak it may be overridden later, so
4636
                   don't assume we know where a weak sym lives.  */
4637
                if (h->root.type == bfd_link_hash_defined)
4638
                  dest = h->root.u.def.section;
4639
              }
4640
            else
4641
              dest = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
4642
                                                sec, r_symndx);
4643
            if (dest != sec)
4644
              ppc64_elf_section_data (sec)->has_14bit_branch = 1;
4645
          }
4646
          /* Fall through.  */
4647
 
4648
        case R_PPC64_REL24:
4649
          if (h != NULL)
4650
            {
4651
              /* We may need a .plt entry if the function this reloc
4652
                 refers to is in a shared lib.  */
4653
              if (!update_plt_info (abfd, (struct ppc_link_hash_entry *) h,
4654
                                    rel->r_addend))
4655
                return FALSE;
4656
              if (h == &htab->tls_get_addr->elf
4657
                  || h == &htab->tls_get_addr_fd->elf)
4658
                sec->has_tls_reloc = 1;
4659
              else if (htab->tls_get_addr == NULL
4660
                       && CONST_STRNEQ (h->root.root.string, ".__tls_get_addr")
4661
                       && (h->root.root.string[15] == 0
4662
                           || h->root.root.string[15] == '@'))
4663
                {
4664
                  htab->tls_get_addr = (struct ppc_link_hash_entry *) h;
4665
                  sec->has_tls_reloc = 1;
4666
                }
4667
              else if (htab->tls_get_addr_fd == NULL
4668
                       && CONST_STRNEQ (h->root.root.string, "__tls_get_addr")
4669
                       && (h->root.root.string[14] == 0
4670
                           || h->root.root.string[14] == '@'))
4671
                {
4672
                  htab->tls_get_addr_fd = (struct ppc_link_hash_entry *) h;
4673
                  sec->has_tls_reloc = 1;
4674
                }
4675
            }
4676
          break;
4677
 
4678
        case R_PPC64_TPREL64:
4679
          tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
4680
          if (info->shared)
4681
            info->flags |= DF_STATIC_TLS;
4682
          goto dotlstoc;
4683
 
4684
        case R_PPC64_DTPMOD64:
4685
          if (rel + 1 < rel_end
4686
              && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
4687
              && rel[1].r_offset == rel->r_offset + 8)
4688
            tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
4689
          else
4690
            tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
4691
          goto dotlstoc;
4692
 
4693
        case R_PPC64_DTPREL64:
4694
          tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
4695
          if (rel != relocs
4696
              && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
4697
              && rel[-1].r_offset == rel->r_offset - 8)
4698
            /* This is the second reloc of a dtpmod, dtprel pair.
4699
               Don't mark with TLS_DTPREL.  */
4700
            goto dodyn;
4701
 
4702
        dotlstoc:
4703
          sec->has_tls_reloc = 1;
4704
          if (h != NULL)
4705
            {
4706
              struct ppc_link_hash_entry *eh;
4707
              eh = (struct ppc_link_hash_entry *) h;
4708
              eh->tls_mask |= tls_type;
4709
            }
4710
          else
4711
            if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
4712
                                        rel->r_addend, tls_type))
4713
              return FALSE;
4714
 
4715
          ppc64_sec = ppc64_elf_section_data (sec);
4716
          if (ppc64_sec->sec_type != sec_toc)
4717
            {
4718
              /* One extra to simplify get_tls_mask.  */
4719
              bfd_size_type amt = sec->size * sizeof (unsigned) / 8 + 1;
4720
              ppc64_sec->u.t_symndx = bfd_zalloc (abfd, amt);
4721
              if (ppc64_sec->u.t_symndx == NULL)
4722
                return FALSE;
4723
              BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
4724
              ppc64_sec->sec_type = sec_toc;
4725
            }
4726
          BFD_ASSERT (rel->r_offset % 8 == 0);
4727
          ppc64_sec->u.t_symndx[rel->r_offset / 8] = r_symndx;
4728
 
4729
          /* Mark the second slot of a GD or LD entry.
4730
             -1 to indicate GD and -2 to indicate LD.  */
4731
          if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
4732
            ppc64_sec->u.t_symndx[rel->r_offset / 8 + 1] = -1;
4733
          else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
4734
            ppc64_sec->u.t_symndx[rel->r_offset / 8 + 1] = -2;
4735
          goto dodyn;
4736
 
4737
        case R_PPC64_TPREL16:
4738
        case R_PPC64_TPREL16_LO:
4739
        case R_PPC64_TPREL16_HI:
4740
        case R_PPC64_TPREL16_HA:
4741
        case R_PPC64_TPREL16_DS:
4742
        case R_PPC64_TPREL16_LO_DS:
4743
        case R_PPC64_TPREL16_HIGHER:
4744
        case R_PPC64_TPREL16_HIGHERA:
4745
        case R_PPC64_TPREL16_HIGHEST:
4746
        case R_PPC64_TPREL16_HIGHESTA:
4747
          if (info->shared)
4748
            {
4749
              info->flags |= DF_STATIC_TLS;
4750
              goto dodyn;
4751
            }
4752
          break;
4753
 
4754
        case R_PPC64_ADDR64:
4755
          if (opd_sym_map != NULL
4756
              && rel + 1 < rel_end
4757
              && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
4758
            {
4759
              if (h != NULL)
4760
                {
4761
                  if (h->root.root.string[0] == '.'
4762
                      && h->root.root.string[1] != 0
4763
                      && get_fdh ((struct ppc_link_hash_entry *) h, htab))
4764
                    ;
4765
                  else
4766
                    ((struct ppc_link_hash_entry *) h)->is_func = 1;
4767
                }
4768
              else
4769
                {
4770
                  asection *s;
4771
 
4772
                  s = bfd_section_from_r_symndx (abfd, &htab->sym_sec, sec,
4773
                                                 r_symndx);
4774
                  if (s == NULL)
4775
                    return FALSE;
4776
                  else if (s != sec)
4777
                    opd_sym_map[rel->r_offset / 8] = s;
4778
                }
4779
            }
4780
          /* Fall through.  */
4781
 
4782
        case R_PPC64_REL30:
4783
        case R_PPC64_REL32:
4784
        case R_PPC64_REL64:
4785
        case R_PPC64_ADDR14:
4786
        case R_PPC64_ADDR14_BRNTAKEN:
4787
        case R_PPC64_ADDR14_BRTAKEN:
4788
        case R_PPC64_ADDR16:
4789
        case R_PPC64_ADDR16_DS:
4790
        case R_PPC64_ADDR16_HA:
4791
        case R_PPC64_ADDR16_HI:
4792
        case R_PPC64_ADDR16_HIGHER:
4793
        case R_PPC64_ADDR16_HIGHERA:
4794
        case R_PPC64_ADDR16_HIGHEST:
4795
        case R_PPC64_ADDR16_HIGHESTA:
4796
        case R_PPC64_ADDR16_LO:
4797
        case R_PPC64_ADDR16_LO_DS:
4798
        case R_PPC64_ADDR24:
4799
        case R_PPC64_ADDR32:
4800
        case R_PPC64_UADDR16:
4801
        case R_PPC64_UADDR32:
4802
        case R_PPC64_UADDR64:
4803
        case R_PPC64_TOC:
4804
          if (h != NULL && !info->shared)
4805
            /* We may need a copy reloc.  */
4806
            h->non_got_ref = 1;
4807
 
4808
          /* Don't propagate .opd relocs.  */
4809
          if (NO_OPD_RELOCS && opd_sym_map != NULL)
4810
            break;
4811
 
4812
          /* If we are creating a shared library, and this is a reloc
4813
             against a global symbol, or a non PC relative reloc
4814
             against a local symbol, then we need to copy the reloc
4815
             into the shared library.  However, if we are linking with
4816
             -Bsymbolic, we do not need to copy a reloc against a
4817
             global symbol which is defined in an object we are
4818
             including in the link (i.e., DEF_REGULAR is set).  At
4819
             this point we have not seen all the input files, so it is
4820
             possible that DEF_REGULAR is not set now but will be set
4821
             later (it is never cleared).  In case of a weak definition,
4822
             DEF_REGULAR may be cleared later by a strong definition in
4823
             a shared library.  We account for that possibility below by
4824
             storing information in the dyn_relocs field of the hash
4825
             table entry.  A similar situation occurs when creating
4826
             shared libraries and symbol visibility changes render the
4827
             symbol local.
4828
 
4829
             If on the other hand, we are creating an executable, we
4830
             may need to keep relocations for symbols satisfied by a
4831
             dynamic library if we manage to avoid copy relocs for the
4832
             symbol.  */
4833
        dodyn:
4834
          if ((info->shared
4835
               && (MUST_BE_DYN_RELOC (r_type)
4836
                   || (h != NULL
4837
                       && (! info->symbolic
4838
                           || h->root.type == bfd_link_hash_defweak
4839
                           || !h->def_regular))))
4840
              || (ELIMINATE_COPY_RELOCS
4841
                  && !info->shared
4842
                  && h != NULL
4843
                  && (h->root.type == bfd_link_hash_defweak
4844
                      || !h->def_regular)))
4845
            {
4846
              struct ppc_dyn_relocs *p;
4847
              struct ppc_dyn_relocs **head;
4848
 
4849
              /* We must copy these reloc types into the output file.
4850
                 Create a reloc section in dynobj and make room for
4851
                 this reloc.  */
4852
              if (sreloc == NULL)
4853
                {
4854
                  const char *name;
4855
                  bfd *dynobj;
4856
 
4857
                  name = (bfd_elf_string_from_elf_section
4858
                          (abfd,
4859
                           elf_elfheader (abfd)->e_shstrndx,
4860
                           elf_section_data (sec)->rel_hdr.sh_name));
4861
                  if (name == NULL)
4862
                    return FALSE;
4863
 
4864
                  if (! CONST_STRNEQ (name, ".rela")
4865
                      || strcmp (bfd_get_section_name (abfd, sec),
4866
                                 name + 5) != 0)
4867
                    {
4868
                      (*_bfd_error_handler)
4869
                        (_("%B: bad relocation section name `%s\'"),
4870
                         abfd, name);
4871
                      bfd_set_error (bfd_error_bad_value);
4872
                    }
4873
 
4874
                  dynobj = htab->elf.dynobj;
4875
                  sreloc = bfd_get_section_by_name (dynobj, name);
4876
                  if (sreloc == NULL)
4877
                    {
4878
                      flagword flags;
4879
 
4880
                      flags = (SEC_HAS_CONTENTS | SEC_READONLY
4881
                               | SEC_IN_MEMORY | SEC_LINKER_CREATED
4882
                               | SEC_ALLOC | SEC_LOAD);
4883
                      sreloc = bfd_make_section_with_flags (dynobj,
4884
                                                            name,
4885
                                                            flags);
4886
                      if (sreloc == NULL
4887
                          || ! bfd_set_section_alignment (dynobj, sreloc, 3))
4888
                        return FALSE;
4889
                    }
4890
                  elf_section_data (sec)->sreloc = sreloc;
4891
                }
4892
 
4893
              /* If this is a global symbol, we count the number of
4894
                 relocations we need for this symbol.  */
4895
              if (h != NULL)
4896
                {
4897
                  head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
4898
                }
4899
              else
4900
                {
4901
                  /* Track dynamic relocs needed for local syms too.
4902
                     We really need local syms available to do this
4903
                     easily.  Oh well.  */
4904
 
4905
                  asection *s;
4906
                  void *vpp;
4907
 
4908
                  s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
4909
                                                 sec, r_symndx);
4910
                  if (s == NULL)
4911
                    return FALSE;
4912
 
4913
                  vpp = &elf_section_data (s)->local_dynrel;
4914
                  head = (struct ppc_dyn_relocs **) vpp;
4915
                }
4916
 
4917
              p = *head;
4918
              if (p == NULL || p->sec != sec)
4919
                {
4920
                  p = bfd_alloc (htab->elf.dynobj, sizeof *p);
4921
                  if (p == NULL)
4922
                    return FALSE;
4923
                  p->next = *head;
4924
                  *head = p;
4925
                  p->sec = sec;
4926
                  p->count = 0;
4927
                  p->pc_count = 0;
4928
                }
4929
 
4930
              p->count += 1;
4931
              if (!MUST_BE_DYN_RELOC (r_type))
4932
                p->pc_count += 1;
4933
            }
4934
          break;
4935
 
4936
        default:
4937
          break;
4938
        }
4939
    }
4940
 
4941
  return TRUE;
4942
}
4943
 
4944
/* OFFSET in OPD_SEC specifies a function descriptor.  Return the address
4945
   of the code entry point, and its section.  */
4946
 
4947
static bfd_vma
4948
opd_entry_value (asection *opd_sec,
4949
                 bfd_vma offset,
4950
                 asection **code_sec,
4951
                 bfd_vma *code_off)
4952
{
4953
  bfd *opd_bfd = opd_sec->owner;
4954
  Elf_Internal_Rela *relocs;
4955
  Elf_Internal_Rela *lo, *hi, *look;
4956
  bfd_vma val;
4957
 
4958
  /* No relocs implies we are linking a --just-symbols object.  */
4959
  if (opd_sec->reloc_count == 0)
4960
    {
4961
      bfd_vma val;
4962
 
4963
      if (!bfd_get_section_contents (opd_bfd, opd_sec, &val, offset, 8))
4964
        return (bfd_vma) -1;
4965
 
4966
      if (code_sec != NULL)
4967
        {
4968
          asection *sec, *likely = NULL;
4969
          for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
4970
            if (sec->vma <= val
4971
                && (sec->flags & SEC_LOAD) != 0
4972
                && (sec->flags & SEC_ALLOC) != 0)
4973
              likely = sec;
4974
          if (likely != NULL)
4975
            {
4976
              *code_sec = likely;
4977
              if (code_off != NULL)
4978
                *code_off = val - likely->vma;
4979
            }
4980
        }
4981
      return val;
4982
    }
4983
 
4984
  BFD_ASSERT (is_ppc64_elf (opd_bfd));
4985
 
4986
  relocs = ppc64_elf_tdata (opd_bfd)->opd_relocs;
4987
  if (relocs == NULL)
4988
    relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
4989
 
4990
  /* Go find the opd reloc at the sym address.  */
4991
  lo = relocs;
4992
  BFD_ASSERT (lo != NULL);
4993
  hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
4994
  val = (bfd_vma) -1;
4995
  while (lo < hi)
4996
    {
4997
      look = lo + (hi - lo) / 2;
4998
      if (look->r_offset < offset)
4999
        lo = look + 1;
5000
      else if (look->r_offset > offset)
5001
        hi = look;
5002
      else
5003
        {
5004
          Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd);
5005
 
5006
          if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
5007
              && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
5008
            {
5009
              unsigned long symndx = ELF64_R_SYM (look->r_info);
5010
              asection *sec;
5011
 
5012
              if (symndx < symtab_hdr->sh_info)
5013
                {
5014
                  Elf_Internal_Sym *sym;
5015
 
5016
                  sym = (Elf_Internal_Sym *) symtab_hdr->contents;
5017
                  if (sym == NULL)
5018
                    {
5019
                      sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
5020
                                                  symtab_hdr->sh_info,
5021
                                                  0, NULL, NULL, NULL);
5022
                      if (sym == NULL)
5023
                        break;
5024
                      symtab_hdr->contents = (bfd_byte *) sym;
5025
                    }
5026
 
5027
                  sym += symndx;
5028
                  val = sym->st_value;
5029
                  sec = NULL;
5030
                  if ((sym->st_shndx != SHN_UNDEF
5031
                       && sym->st_shndx < SHN_LORESERVE)
5032
                      || sym->st_shndx > SHN_HIRESERVE)
5033
                    sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
5034
                  BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
5035
                }
5036
              else
5037
                {
5038
                  struct elf_link_hash_entry **sym_hashes;
5039
                  struct elf_link_hash_entry *rh;
5040
 
5041
                  sym_hashes = elf_sym_hashes (opd_bfd);
5042
                  rh = sym_hashes[symndx - symtab_hdr->sh_info];
5043
                  while (rh->root.type == bfd_link_hash_indirect
5044
                         || rh->root.type == bfd_link_hash_warning)
5045
                    rh = ((struct elf_link_hash_entry *) rh->root.u.i.link);
5046
                  BFD_ASSERT (rh->root.type == bfd_link_hash_defined
5047
                              || rh->root.type == bfd_link_hash_defweak);
5048
                  val = rh->root.u.def.value;
5049
                  sec = rh->root.u.def.section;
5050
                }
5051
              val += look->r_addend;
5052
              if (code_off != NULL)
5053
                *code_off = val;
5054
              if (code_sec != NULL)
5055
                *code_sec = sec;
5056
              if (sec != NULL && sec->output_section != NULL)
5057
                val += sec->output_section->vma + sec->output_offset;
5058
            }
5059
          break;
5060
        }
5061
    }
5062
 
5063
  return val;
5064
}
5065
 
5066
/* Mark all our entry sym sections, both opd and code section.  */
5067
 
5068
static void
5069
ppc64_elf_gc_keep (struct bfd_link_info *info)
5070
{
5071
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
5072
  struct bfd_sym_chain *sym;
5073
 
5074
  for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
5075
    {
5076
      struct ppc_link_hash_entry *eh;
5077
      asection *sec;
5078
 
5079
      eh = (struct ppc_link_hash_entry *)
5080
        elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, FALSE);
5081
      if (eh == NULL)
5082
        continue;
5083
      if (eh->elf.root.type != bfd_link_hash_defined
5084
          && eh->elf.root.type != bfd_link_hash_defweak)
5085
        continue;
5086
 
5087
      if (eh->is_func_descriptor
5088
          && (eh->oh->elf.root.type == bfd_link_hash_defined
5089
              || eh->oh->elf.root.type == bfd_link_hash_defweak))
5090
        {
5091
          sec = eh->oh->elf.root.u.def.section;
5092
          sec->flags |= SEC_KEEP;
5093
        }
5094
      else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5095
               && opd_entry_value (eh->elf.root.u.def.section,
5096
                                   eh->elf.root.u.def.value,
5097
                                   &sec, NULL) != (bfd_vma) -1)
5098
        sec->flags |= SEC_KEEP;
5099
 
5100
      sec = eh->elf.root.u.def.section;
5101
      sec->flags |= SEC_KEEP;
5102
    }
5103
}
5104
 
5105
/* Mark sections containing dynamically referenced symbols.  When
5106
   building shared libraries, we must assume that any visible symbol is
5107
   referenced.  */
5108
 
5109
static bfd_boolean
5110
ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
5111
{
5112
  struct bfd_link_info *info = (struct bfd_link_info *) inf;
5113
  struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
5114
 
5115
  if (eh->elf.root.type == bfd_link_hash_warning)
5116
    eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
5117
 
5118
  /* Dynamic linking info is on the func descriptor sym.  */
5119
  if (eh->oh != NULL
5120
      && eh->oh->is_func_descriptor
5121
      && (eh->oh->elf.root.type == bfd_link_hash_defined
5122
          || eh->oh->elf.root.type == bfd_link_hash_defweak))
5123
    eh = eh->oh;
5124
 
5125
  if ((eh->elf.root.type == bfd_link_hash_defined
5126
       || eh->elf.root.type == bfd_link_hash_defweak)
5127
      && (eh->elf.ref_dynamic
5128
          || (!info->executable
5129
              && eh->elf.def_regular
5130
              && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
5131
              && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN)))
5132
    {
5133
      asection *code_sec;
5134
 
5135
      eh->elf.root.u.def.section->flags |= SEC_KEEP;
5136
 
5137
      /* Function descriptor syms cause the associated
5138
         function code sym section to be marked.  */
5139
      if (eh->is_func_descriptor
5140
          && (eh->oh->elf.root.type == bfd_link_hash_defined
5141
              || eh->oh->elf.root.type == bfd_link_hash_defweak))
5142
        eh->oh->elf.root.u.def.section->flags |= SEC_KEEP;
5143
      else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5144
               && opd_entry_value (eh->elf.root.u.def.section,
5145
                                   eh->elf.root.u.def.value,
5146
                                   &code_sec, NULL) != (bfd_vma) -1)
5147
        code_sec->flags |= SEC_KEEP;
5148
    }
5149
 
5150
  return TRUE;
5151
}
5152
 
5153
/* Return the section that should be marked against GC for a given
5154
   relocation.  */
5155
 
5156
static asection *
5157
ppc64_elf_gc_mark_hook (asection *sec,
5158
                        struct bfd_link_info *info ATTRIBUTE_UNUSED,
5159
                        Elf_Internal_Rela *rel,
5160
                        struct elf_link_hash_entry *h,
5161
                        Elf_Internal_Sym *sym)
5162
{
5163
  asection *rsec;
5164
 
5165
  /* Syms return NULL if we're marking .opd, so we avoid marking all
5166
     function sections, as all functions are referenced in .opd.  */
5167
  rsec = NULL;
5168
  if (get_opd_info (sec) != NULL)
5169
    return rsec;
5170
 
5171
  if (h != NULL)
5172
    {
5173
      enum elf_ppc64_reloc_type r_type;
5174
      struct ppc_link_hash_entry *eh;
5175
 
5176
      r_type = ELF64_R_TYPE (rel->r_info);
5177
      switch (r_type)
5178
        {
5179
        case R_PPC64_GNU_VTINHERIT:
5180
        case R_PPC64_GNU_VTENTRY:
5181
          break;
5182
 
5183
        default:
5184
          switch (h->root.type)
5185
            {
5186
            case bfd_link_hash_defined:
5187
            case bfd_link_hash_defweak:
5188
              eh = (struct ppc_link_hash_entry *) h;
5189
              if (eh->oh != NULL
5190
                  && eh->oh->is_func_descriptor
5191
                  && (eh->oh->elf.root.type == bfd_link_hash_defined
5192
                      || eh->oh->elf.root.type == bfd_link_hash_defweak))
5193
                eh = eh->oh;
5194
 
5195
              /* Function descriptor syms cause the associated
5196
                 function code sym section to be marked.  */
5197
              if (eh->is_func_descriptor
5198
                  && (eh->oh->elf.root.type == bfd_link_hash_defined
5199
                      || eh->oh->elf.root.type == bfd_link_hash_defweak))
5200
                {
5201
                  /* They also mark their opd section.  */
5202
                  eh->elf.root.u.def.section->gc_mark = 1;
5203
 
5204
                  rsec = eh->oh->elf.root.u.def.section;
5205
                }
5206
              else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5207
                       && opd_entry_value (eh->elf.root.u.def.section,
5208
                                           eh->elf.root.u.def.value,
5209
                                           &rsec, NULL) != (bfd_vma) -1)
5210
                eh->elf.root.u.def.section->gc_mark = 1;
5211
              else
5212
                rsec = h->root.u.def.section;
5213
              break;
5214
 
5215
            case bfd_link_hash_common:
5216
              rsec = h->root.u.c.p->section;
5217
              break;
5218
 
5219
            default:
5220
              break;
5221
            }
5222
        }
5223
    }
5224
  else
5225
    {
5226
      struct _opd_sec_data *opd;
5227
 
5228
      rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
5229
      opd = get_opd_info (rsec);
5230
      if (opd != NULL && opd->func_sec != NULL)
5231
        {
5232
          rsec->gc_mark = 1;
5233
 
5234
          rsec = opd->func_sec[(sym->st_value + rel->r_addend) / 8];
5235
        }
5236
    }
5237
 
5238
  return rsec;
5239
}
5240
 
5241
/* Update the .got, .plt. and dynamic reloc reference counts for the
5242
   section being removed.  */
5243
 
5244
static bfd_boolean
5245
ppc64_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
5246
                         asection *sec, const Elf_Internal_Rela *relocs)
5247
{
5248
  struct ppc_link_hash_table *htab;
5249
  Elf_Internal_Shdr *symtab_hdr;
5250
  struct elf_link_hash_entry **sym_hashes;
5251
  struct got_entry **local_got_ents;
5252
  const Elf_Internal_Rela *rel, *relend;
5253
 
5254
  if (info->relocatable)
5255
    return TRUE;
5256
 
5257
  if ((sec->flags & SEC_ALLOC) == 0)
5258
    return TRUE;
5259
 
5260
  elf_section_data (sec)->local_dynrel = NULL;
5261
 
5262
  htab = ppc_hash_table (info);
5263
  symtab_hdr = &elf_symtab_hdr (abfd);
5264
  sym_hashes = elf_sym_hashes (abfd);
5265
  local_got_ents = elf_local_got_ents (abfd);
5266
 
5267
  relend = relocs + sec->reloc_count;
5268
  for (rel = relocs; rel < relend; rel++)
5269
    {
5270
      unsigned long r_symndx;
5271
      enum elf_ppc64_reloc_type r_type;
5272
      struct elf_link_hash_entry *h = NULL;
5273
      char tls_type = 0;
5274
 
5275
      r_symndx = ELF64_R_SYM (rel->r_info);
5276
      r_type = ELF64_R_TYPE (rel->r_info);
5277
      if (r_symndx >= symtab_hdr->sh_info)
5278
        {
5279
          struct ppc_link_hash_entry *eh;
5280
          struct ppc_dyn_relocs **pp;
5281
          struct ppc_dyn_relocs *p;
5282
 
5283
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5284
          while (h->root.type == bfd_link_hash_indirect
5285
                 || h->root.type == bfd_link_hash_warning)
5286
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
5287
          eh = (struct ppc_link_hash_entry *) h;
5288
 
5289
          for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
5290
            if (p->sec == sec)
5291
              {
5292
                /* Everything must go for SEC.  */
5293
                *pp = p->next;
5294
                break;
5295
              }
5296
        }
5297
 
5298
      switch (r_type)
5299
        {
5300
        case R_PPC64_GOT_TLSLD16:
5301
        case R_PPC64_GOT_TLSLD16_LO:
5302
        case R_PPC64_GOT_TLSLD16_HI:
5303
        case R_PPC64_GOT_TLSLD16_HA:
5304
          tls_type = TLS_TLS | TLS_LD;
5305
          goto dogot;
5306
 
5307
        case R_PPC64_GOT_TLSGD16:
5308
        case R_PPC64_GOT_TLSGD16_LO:
5309
        case R_PPC64_GOT_TLSGD16_HI:
5310
        case R_PPC64_GOT_TLSGD16_HA:
5311
          tls_type = TLS_TLS | TLS_GD;
5312
          goto dogot;
5313
 
5314
        case R_PPC64_GOT_TPREL16_DS:
5315
        case R_PPC64_GOT_TPREL16_LO_DS:
5316
        case R_PPC64_GOT_TPREL16_HI:
5317
        case R_PPC64_GOT_TPREL16_HA:
5318
          tls_type = TLS_TLS | TLS_TPREL;
5319
          goto dogot;
5320
 
5321
        case R_PPC64_GOT_DTPREL16_DS:
5322
        case R_PPC64_GOT_DTPREL16_LO_DS:
5323
        case R_PPC64_GOT_DTPREL16_HI:
5324
        case R_PPC64_GOT_DTPREL16_HA:
5325
          tls_type = TLS_TLS | TLS_DTPREL;
5326
          goto dogot;
5327
 
5328
        case R_PPC64_GOT16:
5329
        case R_PPC64_GOT16_DS:
5330
        case R_PPC64_GOT16_HA:
5331
        case R_PPC64_GOT16_HI:
5332
        case R_PPC64_GOT16_LO:
5333
        case R_PPC64_GOT16_LO_DS:
5334
        dogot:
5335
          {
5336
            struct got_entry *ent;
5337
 
5338
            if (h != NULL)
5339
              ent = h->got.glist;
5340
            else
5341
              ent = local_got_ents[r_symndx];
5342
 
5343
            for (; ent != NULL; ent = ent->next)
5344
              if (ent->addend == rel->r_addend
5345
                  && ent->owner == abfd
5346
                  && ent->tls_type == tls_type)
5347
                break;
5348
            if (ent == NULL)
5349
              abort ();
5350
            if (ent->got.refcount > 0)
5351
              ent->got.refcount -= 1;
5352
          }
5353
          break;
5354
 
5355
        case R_PPC64_PLT16_HA:
5356
        case R_PPC64_PLT16_HI:
5357
        case R_PPC64_PLT16_LO:
5358
        case R_PPC64_PLT32:
5359
        case R_PPC64_PLT64:
5360
        case R_PPC64_REL14:
5361
        case R_PPC64_REL14_BRNTAKEN:
5362
        case R_PPC64_REL14_BRTAKEN:
5363
        case R_PPC64_REL24:
5364
          if (h != NULL)
5365
            {
5366
              struct plt_entry *ent;
5367
 
5368
              for (ent = h->plt.plist; ent != NULL; ent = ent->next)
5369
                if (ent->addend == rel->r_addend)
5370
                  break;
5371
              if (ent == NULL)
5372
                abort ();
5373
              if (ent->plt.refcount > 0)
5374
                ent->plt.refcount -= 1;
5375
            }
5376
          break;
5377
 
5378
        default:
5379
          break;
5380
        }
5381
    }
5382
  return TRUE;
5383
}
5384
 
5385
/* The maximum size of .sfpr.  */
5386
#define SFPR_MAX (218*4)
5387
 
5388
struct sfpr_def_parms
5389
{
5390
  const char name[12];
5391
  unsigned char lo, hi;
5392
  bfd_byte * (*write_ent) (bfd *, bfd_byte *, int);
5393
  bfd_byte * (*write_tail) (bfd *, bfd_byte *, int);
5394
};
5395
 
5396
/* Auto-generate _save*, _rest* functions in .sfpr.  */
5397
 
5398
static unsigned int
5399
sfpr_define (struct bfd_link_info *info, const struct sfpr_def_parms *parm)
5400
{
5401
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
5402
  unsigned int i;
5403
  size_t len = strlen (parm->name);
5404
  bfd_boolean writing = FALSE;
5405
  char sym[16];
5406
 
5407
  memcpy (sym, parm->name, len);
5408
  sym[len + 2] = 0;
5409
 
5410
  for (i = parm->lo; i <= parm->hi; i++)
5411
    {
5412
      struct elf_link_hash_entry *h;
5413
 
5414
      sym[len + 0] = i / 10 + '0';
5415
      sym[len + 1] = i % 10 + '0';
5416
      h = elf_link_hash_lookup (&htab->elf, sym, FALSE, FALSE, TRUE);
5417
      if (h != NULL
5418
          && !h->def_regular)
5419
        {
5420
          h->root.type = bfd_link_hash_defined;
5421
          h->root.u.def.section = htab->sfpr;
5422
          h->root.u.def.value = htab->sfpr->size;
5423
          h->type = STT_FUNC;
5424
          h->def_regular = 1;
5425
          _bfd_elf_link_hash_hide_symbol (info, h, TRUE);
5426
          writing = TRUE;
5427
          if (htab->sfpr->contents == NULL)
5428
            {
5429
              htab->sfpr->contents = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
5430
              if (htab->sfpr->contents == NULL)
5431
                return FALSE;
5432
            }
5433
        }
5434
      if (writing)
5435
        {
5436
          bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
5437
          if (i != parm->hi)
5438
            p = (*parm->write_ent) (htab->elf.dynobj, p, i);
5439
          else
5440
            p = (*parm->write_tail) (htab->elf.dynobj, p, i);
5441
          htab->sfpr->size = p - htab->sfpr->contents;
5442
        }
5443
    }
5444
 
5445
  return TRUE;
5446
}
5447
 
5448
static bfd_byte *
5449
savegpr0 (bfd *abfd, bfd_byte *p, int r)
5450
{
5451
  bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5452
  return p + 4;
5453
}
5454
 
5455
static bfd_byte *
5456
savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
5457
{
5458
  p = savegpr0 (abfd, p, r);
5459
  bfd_put_32 (abfd, STD_R0_0R1 + 16, p);
5460
  p = p + 4;
5461
  bfd_put_32 (abfd, BLR, p);
5462
  return p + 4;
5463
}
5464
 
5465
static bfd_byte *
5466
restgpr0 (bfd *abfd, bfd_byte *p, int r)
5467
{
5468
  bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5469
  return p + 4;
5470
}
5471
 
5472
static bfd_byte *
5473
restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
5474
{
5475
  bfd_put_32 (abfd, LD_R0_0R1 + 16, p);
5476
  p = p + 4;
5477
  p = restgpr0 (abfd, p, r);
5478
  bfd_put_32 (abfd, MTLR_R0, p);
5479
  p = p + 4;
5480
  if (r == 29)
5481
    {
5482
      p = restgpr0 (abfd, p, 30);
5483
      p = restgpr0 (abfd, p, 31);
5484
    }
5485
  bfd_put_32 (abfd, BLR, p);
5486
  return p + 4;
5487
}
5488
 
5489
static bfd_byte *
5490
savegpr1 (bfd *abfd, bfd_byte *p, int r)
5491
{
5492
  bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5493
  return p + 4;
5494
}
5495
 
5496
static bfd_byte *
5497
savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
5498
{
5499
  p = savegpr1 (abfd, p, r);
5500
  bfd_put_32 (abfd, BLR, p);
5501
  return p + 4;
5502
}
5503
 
5504
static bfd_byte *
5505
restgpr1 (bfd *abfd, bfd_byte *p, int r)
5506
{
5507
  bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5508
  return p + 4;
5509
}
5510
 
5511
static bfd_byte *
5512
restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
5513
{
5514
  p = restgpr1 (abfd, p, r);
5515
  bfd_put_32 (abfd, BLR, p);
5516
  return p + 4;
5517
}
5518
 
5519
static bfd_byte *
5520
savefpr (bfd *abfd, bfd_byte *p, int r)
5521
{
5522
  bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5523
  return p + 4;
5524
}
5525
 
5526
static bfd_byte *
5527
savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
5528
{
5529
  p = savefpr (abfd, p, r);
5530
  bfd_put_32 (abfd, STD_R0_0R1 + 16, p);
5531
  p = p + 4;
5532
  bfd_put_32 (abfd, BLR, p);
5533
  return p + 4;
5534
}
5535
 
5536
static bfd_byte *
5537
restfpr (bfd *abfd, bfd_byte *p, int r)
5538
{
5539
  bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5540
  return p + 4;
5541
}
5542
 
5543
static bfd_byte *
5544
restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
5545
{
5546
  bfd_put_32 (abfd, LD_R0_0R1 + 16, p);
5547
  p = p + 4;
5548
  p = restfpr (abfd, p, r);
5549
  bfd_put_32 (abfd, MTLR_R0, p);
5550
  p = p + 4;
5551
  if (r == 29)
5552
    {
5553
      p = restfpr (abfd, p, 30);
5554
      p = restfpr (abfd, p, 31);
5555
    }
5556
  bfd_put_32 (abfd, BLR, p);
5557
  return p + 4;
5558
}
5559
 
5560
static bfd_byte *
5561
savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
5562
{
5563
  p = savefpr (abfd, p, r);
5564
  bfd_put_32 (abfd, BLR, p);
5565
  return p + 4;
5566
}
5567
 
5568
static bfd_byte *
5569
restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
5570
{
5571
  p = restfpr (abfd, p, r);
5572
  bfd_put_32 (abfd, BLR, p);
5573
  return p + 4;
5574
}
5575
 
5576
static bfd_byte *
5577
savevr (bfd *abfd, bfd_byte *p, int r)
5578
{
5579
  bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
5580
  p = p + 4;
5581
  bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
5582
  return p + 4;
5583
}
5584
 
5585
static bfd_byte *
5586
savevr_tail (bfd *abfd, bfd_byte *p, int r)
5587
{
5588
  p = savevr (abfd, p, r);
5589
  bfd_put_32 (abfd, BLR, p);
5590
  return p + 4;
5591
}
5592
 
5593
static bfd_byte *
5594
restvr (bfd *abfd, bfd_byte *p, int r)
5595
{
5596
  bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
5597
  p = p + 4;
5598
  bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
5599
  return p + 4;
5600
}
5601
 
5602
static bfd_byte *
5603
restvr_tail (bfd *abfd, bfd_byte *p, int r)
5604
{
5605
  p = restvr (abfd, p, r);
5606
  bfd_put_32 (abfd, BLR, p);
5607
  return p + 4;
5608
}
5609
 
5610
/* Called via elf_link_hash_traverse to transfer dynamic linking
5611
   information on function code symbol entries to their corresponding
5612
   function descriptor symbol entries.  */
5613
 
5614
static bfd_boolean
5615
func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
5616
{
5617
  struct bfd_link_info *info;
5618
  struct ppc_link_hash_table *htab;
5619
  struct plt_entry *ent;
5620
  struct ppc_link_hash_entry *fh;
5621
  struct ppc_link_hash_entry *fdh;
5622
  bfd_boolean force_local;
5623
 
5624
  fh = (struct ppc_link_hash_entry *) h;
5625
  if (fh->elf.root.type == bfd_link_hash_indirect)
5626
    return TRUE;
5627
 
5628
  if (fh->elf.root.type == bfd_link_hash_warning)
5629
    fh = (struct ppc_link_hash_entry *) fh->elf.root.u.i.link;
5630
 
5631
  info = inf;
5632
  htab = ppc_hash_table (info);
5633
 
5634
  /* Resolve undefined references to dot-symbols as the value
5635
     in the function descriptor, if we have one in a regular object.
5636
     This is to satisfy cases like ".quad .foo".  Calls to functions
5637
     in dynamic objects are handled elsewhere.  */
5638
  if (fh->elf.root.type == bfd_link_hash_undefweak
5639
      && fh->was_undefined
5640
      && (fh->oh->elf.root.type == bfd_link_hash_defined
5641
          || fh->oh->elf.root.type == bfd_link_hash_defweak)
5642
      && get_opd_info (fh->oh->elf.root.u.def.section) != NULL
5643
      && opd_entry_value (fh->oh->elf.root.u.def.section,
5644
                          fh->oh->elf.root.u.def.value,
5645
                          &fh->elf.root.u.def.section,
5646
                          &fh->elf.root.u.def.value) != (bfd_vma) -1)
5647
    {
5648
      fh->elf.root.type = fh->oh->elf.root.type;
5649
      fh->elf.forced_local = 1;
5650
      fh->elf.def_regular = fh->oh->elf.def_regular;
5651
      fh->elf.def_dynamic = fh->oh->elf.def_dynamic;
5652
    }
5653
 
5654
  /* If this is a function code symbol, transfer dynamic linking
5655
     information to the function descriptor symbol.  */
5656
  if (!fh->is_func)
5657
    return TRUE;
5658
 
5659
  for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
5660
    if (ent->plt.refcount > 0)
5661
      break;
5662
  if (ent == NULL
5663
      || fh->elf.root.root.string[0] != '.'
5664
      || fh->elf.root.root.string[1] == '\0')
5665
    return TRUE;
5666
 
5667
  /* Find the corresponding function descriptor symbol.  Create it
5668
     as undefined if necessary.  */
5669
 
5670
  fdh = get_fdh (fh, htab);
5671
  if (fdh != NULL)
5672
    while (fdh->elf.root.type == bfd_link_hash_indirect
5673
           || fdh->elf.root.type == bfd_link_hash_warning)
5674
      fdh = (struct ppc_link_hash_entry *) fdh->elf.root.u.i.link;
5675
 
5676
  if (fdh == NULL
5677
      && info->shared
5678
      && (fh->elf.root.type == bfd_link_hash_undefined
5679
          || fh->elf.root.type == bfd_link_hash_undefweak))
5680
    {
5681
      fdh = make_fdh (info, fh);
5682
      if (fdh == NULL)
5683
        return FALSE;
5684
    }
5685
 
5686
  /* Fake function descriptors are made undefweak.  If the function
5687
     code symbol is strong undefined, make the fake sym the same.
5688
     If the function code symbol is defined, then force the fake
5689
     descriptor local;  We can't support overriding of symbols in a
5690
     shared library on a fake descriptor.  */
5691
 
5692
  if (fdh != NULL
5693
      && fdh->fake
5694
      && fdh->elf.root.type == bfd_link_hash_undefweak)
5695
    {
5696
      if (fh->elf.root.type == bfd_link_hash_undefined)
5697
        {
5698
          fdh->elf.root.type = bfd_link_hash_undefined;
5699
          bfd_link_add_undef (&htab->elf.root, &fdh->elf.root);
5700
        }
5701
      else if (fh->elf.root.type == bfd_link_hash_defined
5702
               || fh->elf.root.type == bfd_link_hash_defweak)
5703
        {
5704
          _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
5705
        }
5706
    }
5707
 
5708
  if (fdh != NULL
5709
      && !fdh->elf.forced_local
5710
      && (info->shared
5711
          || fdh->elf.def_dynamic
5712
          || fdh->elf.ref_dynamic
5713
          || (fdh->elf.root.type == bfd_link_hash_undefweak
5714
              && ELF_ST_VISIBILITY (fdh->elf.other) == STV_DEFAULT)))
5715
    {
5716
      if (fdh->elf.dynindx == -1)
5717
        if (! bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
5718
          return FALSE;
5719
      fdh->elf.ref_regular |= fh->elf.ref_regular;
5720
      fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
5721
      fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
5722
      fdh->elf.non_got_ref |= fh->elf.non_got_ref;
5723
      if (ELF_ST_VISIBILITY (fh->elf.other) == STV_DEFAULT)
5724
        {
5725
          move_plt_plist (fh, fdh);
5726
          fdh->elf.needs_plt = 1;
5727
        }
5728
      fdh->is_func_descriptor = 1;
5729
      fdh->oh = fh;
5730
      fh->oh = fdh;
5731
    }
5732
 
5733
  /* Now that the info is on the function descriptor, clear the
5734
     function code sym info.  Any function code syms for which we
5735
     don't have a definition in a regular file, we force local.
5736
     This prevents a shared library from exporting syms that have
5737
     been imported from another library.  Function code syms that
5738
     are really in the library we must leave global to prevent the
5739
     linker dragging in a definition from a static library.  */
5740
  force_local = (!fh->elf.def_regular
5741
                 || fdh == NULL
5742
                 || !fdh->elf.def_regular
5743
                 || fdh->elf.forced_local);
5744
  _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
5745
 
5746
  return TRUE;
5747
}
5748
 
5749
/* Called near the start of bfd_elf_size_dynamic_sections.  We use
5750
   this hook to a) provide some gcc support functions, and b) transfer
5751
   dynamic linking information gathered so far on function code symbol
5752
   entries, to their corresponding function descriptor symbol entries.  */
5753
 
5754
static bfd_boolean
5755
ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
5756
                            struct bfd_link_info *info)
5757
{
5758
  struct ppc_link_hash_table *htab;
5759
  unsigned int i;
5760
  const struct sfpr_def_parms funcs[] =
5761
    {
5762
      { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
5763
      { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
5764
      { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
5765
      { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
5766
      { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
5767
      { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
5768
      { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
5769
      { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
5770
      { "._savef", 14, 31, savefpr, savefpr1_tail },
5771
      { "._restf", 14, 31, restfpr, restfpr1_tail },
5772
      { "_savevr_", 20, 31, savevr, savevr_tail },
5773
      { "_restvr_", 20, 31, restvr, restvr_tail }
5774
    };
5775
 
5776
  htab = ppc_hash_table (info);
5777
  if (htab->sfpr == NULL)
5778
    /* We don't have any relocs.  */
5779
    return TRUE;
5780
 
5781
  /* Provide any missing _save* and _rest* functions.  */
5782
  htab->sfpr->size = 0;
5783
  for (i = 0; i < sizeof (funcs) / sizeof (funcs[0]); i++)
5784
    if (!sfpr_define (info, &funcs[i]))
5785
      return FALSE;
5786
 
5787
  elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
5788
 
5789
  if (htab->sfpr->size == 0)
5790
    htab->sfpr->flags |= SEC_EXCLUDE;
5791
 
5792
  return TRUE;
5793
}
5794
 
5795
/* Adjust a symbol defined by a dynamic object and referenced by a
5796
   regular object.  The current definition is in some section of the
5797
   dynamic object, but we're not including those sections.  We have to
5798
   change the definition to something the rest of the link can
5799
   understand.  */
5800
 
5801
static bfd_boolean
5802
ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
5803
                                 struct elf_link_hash_entry *h)
5804
{
5805
  struct ppc_link_hash_table *htab;
5806
  asection *s;
5807
 
5808
  htab = ppc_hash_table (info);
5809
 
5810
  /* Deal with function syms.  */
5811
  if (h->type == STT_FUNC
5812
      || h->needs_plt)
5813
    {
5814
      /* Clear procedure linkage table information for any symbol that
5815
         won't need a .plt entry.  */
5816
      struct plt_entry *ent;
5817
      for (ent = h->plt.plist; ent != NULL; ent = ent->next)
5818
        if (ent->plt.refcount > 0)
5819
          break;
5820
      if (ent == NULL
5821
          || SYMBOL_CALLS_LOCAL (info, h)
5822
          || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
5823
              && h->root.type == bfd_link_hash_undefweak))
5824
        {
5825
          h->plt.plist = NULL;
5826
          h->needs_plt = 0;
5827
        }
5828
    }
5829
  else
5830
    h->plt.plist = NULL;
5831
 
5832
  /* If this is a weak symbol, and there is a real definition, the
5833
     processor independent code will have arranged for us to see the
5834
     real definition first, and we can just use the same value.  */
5835
  if (h->u.weakdef != NULL)
5836
    {
5837
      BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
5838
                  || h->u.weakdef->root.type == bfd_link_hash_defweak);
5839
      h->root.u.def.section = h->u.weakdef->root.u.def.section;
5840
      h->root.u.def.value = h->u.weakdef->root.u.def.value;
5841
      if (ELIMINATE_COPY_RELOCS)
5842
        h->non_got_ref = h->u.weakdef->non_got_ref;
5843
      return TRUE;
5844
    }
5845
 
5846
  /* If we are creating a shared library, we must presume that the
5847
     only references to the symbol are via the global offset table.
5848
     For such cases we need not do anything here; the relocations will
5849
     be handled correctly by relocate_section.  */
5850
  if (info->shared)
5851
    return TRUE;
5852
 
5853
  /* If there are no references to this symbol that do not use the
5854
     GOT, we don't need to generate a copy reloc.  */
5855
  if (!h->non_got_ref)
5856
    return TRUE;
5857
 
5858
  /* Don't generate a copy reloc for symbols defined in the executable.  */
5859
  if (!h->def_dynamic || !h->ref_regular || h->def_regular)
5860
    return TRUE;
5861
 
5862
  if (ELIMINATE_COPY_RELOCS)
5863
    {
5864
      struct ppc_link_hash_entry * eh;
5865
      struct ppc_dyn_relocs *p;
5866
 
5867
      eh = (struct ppc_link_hash_entry *) h;
5868
      for (p = eh->dyn_relocs; p != NULL; p = p->next)
5869
        {
5870
          s = p->sec->output_section;
5871
          if (s != NULL && (s->flags & SEC_READONLY) != 0)
5872
            break;
5873
        }
5874
 
5875
      /* If we didn't find any dynamic relocs in read-only sections, then
5876
         we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
5877
      if (p == NULL)
5878
        {
5879
          h->non_got_ref = 0;
5880
          return TRUE;
5881
        }
5882
    }
5883
 
5884
  if (h->plt.plist != NULL)
5885
    {
5886
      /* We should never get here, but unfortunately there are versions
5887
         of gcc out there that improperly (for this ABI) put initialized
5888
         function pointers, vtable refs and suchlike in read-only
5889
         sections.  Allow them to proceed, but warn that this might
5890
         break at runtime.  */
5891
      (*_bfd_error_handler)
5892
        (_("copy reloc against `%s' requires lazy plt linking; "
5893
           "avoid setting LD_BIND_NOW=1 or upgrade gcc"),
5894
         h->root.root.string);
5895
    }
5896
 
5897
  /* This is a reference to a symbol defined by a dynamic object which
5898
     is not a function.  */
5899
 
5900
  if (h->size == 0)
5901
    {
5902
      (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
5903
                             h->root.root.string);
5904
      return TRUE;
5905
    }
5906
 
5907
  /* We must allocate the symbol in our .dynbss section, which will
5908
     become part of the .bss section of the executable.  There will be
5909
     an entry for this symbol in the .dynsym section.  The dynamic
5910
     object will contain position independent code, so all references
5911
     from the dynamic object to this symbol will go through the global
5912
     offset table.  The dynamic linker will use the .dynsym entry to
5913
     determine the address it must put in the global offset table, so
5914
     both the dynamic object and the regular object will refer to the
5915
     same memory location for the variable.  */
5916
 
5917
  /* We must generate a R_PPC64_COPY reloc to tell the dynamic linker
5918
     to copy the initial value out of the dynamic object and into the
5919
     runtime process image.  We need to remember the offset into the
5920
     .rela.bss section we are going to use.  */
5921
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
5922
    {
5923
      htab->relbss->size += sizeof (Elf64_External_Rela);
5924
      h->needs_copy = 1;
5925
    }
5926
 
5927
  s = htab->dynbss;
5928
 
5929
  return _bfd_elf_adjust_dynamic_copy (h, s);
5930
}
5931
 
5932
/* If given a function descriptor symbol, hide both the function code
5933
   sym and the descriptor.  */
5934
static void
5935
ppc64_elf_hide_symbol (struct bfd_link_info *info,
5936
                       struct elf_link_hash_entry *h,
5937
                       bfd_boolean force_local)
5938
{
5939
  struct ppc_link_hash_entry *eh;
5940
  _bfd_elf_link_hash_hide_symbol (info, h, force_local);
5941
 
5942
  eh = (struct ppc_link_hash_entry *) h;
5943
  if (eh->is_func_descriptor)
5944
    {
5945
      struct ppc_link_hash_entry *fh = eh->oh;
5946
 
5947
      if (fh == NULL)
5948
        {
5949
          const char *p, *q;
5950
          struct ppc_link_hash_table *htab;
5951
          char save;
5952
 
5953
          /* We aren't supposed to use alloca in BFD because on
5954
             systems which do not have alloca the version in libiberty
5955
             calls xmalloc, which might cause the program to crash
5956
             when it runs out of memory.  This function doesn't have a
5957
             return status, so there's no way to gracefully return an
5958
             error.  So cheat.  We know that string[-1] can be safely
5959
             accessed;  It's either a string in an ELF string table,
5960
             or allocated in an objalloc structure.  */
5961
 
5962
          p = eh->elf.root.root.string - 1;
5963
          save = *p;
5964
          *(char *) p = '.';
5965
          htab = ppc_hash_table (info);
5966
          fh = (struct ppc_link_hash_entry *)
5967
            elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
5968
          *(char *) p = save;
5969
 
5970
          /* Unfortunately, if it so happens that the string we were
5971
             looking for was allocated immediately before this string,
5972
             then we overwrote the string terminator.  That's the only
5973
             reason the lookup should fail.  */
5974
          if (fh == NULL)
5975
            {
5976
              q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
5977
              while (q >= eh->elf.root.root.string && *q == *p)
5978
                --q, --p;
5979
              if (q < eh->elf.root.root.string && *p == '.')
5980
                fh = (struct ppc_link_hash_entry *)
5981
                  elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
5982
            }
5983
          if (fh != NULL)
5984
            {
5985
              eh->oh = fh;
5986
              fh->oh = eh;
5987
            }
5988
        }
5989
      if (fh != NULL)
5990
        _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
5991
    }
5992
}
5993
 
5994
static bfd_boolean
5995
get_sym_h (struct elf_link_hash_entry **hp,
5996
           Elf_Internal_Sym **symp,
5997
           asection **symsecp,
5998
           char **tls_maskp,
5999
           Elf_Internal_Sym **locsymsp,
6000
           unsigned long r_symndx,
6001
           bfd *ibfd)
6002
{
6003
  Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
6004
 
6005
  if (r_symndx >= symtab_hdr->sh_info)
6006
    {
6007
      struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
6008
      struct elf_link_hash_entry *h;
6009
 
6010
      h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6011
      while (h->root.type == bfd_link_hash_indirect
6012
             || h->root.type == bfd_link_hash_warning)
6013
        h = (struct elf_link_hash_entry *) h->root.u.i.link;
6014
 
6015
      if (hp != NULL)
6016
        *hp = h;
6017
 
6018
      if (symp != NULL)
6019
        *symp = NULL;
6020
 
6021
      if (symsecp != NULL)
6022
        {
6023
          asection *symsec = NULL;
6024
          if (h->root.type == bfd_link_hash_defined
6025
              || h->root.type == bfd_link_hash_defweak)
6026
            symsec = h->root.u.def.section;
6027
          *symsecp = symsec;
6028
        }
6029
 
6030
      if (tls_maskp != NULL)
6031
        {
6032
          struct ppc_link_hash_entry *eh;
6033
 
6034
          eh = (struct ppc_link_hash_entry *) h;
6035
          *tls_maskp = &eh->tls_mask;
6036
        }
6037
    }
6038
  else
6039
    {
6040
      Elf_Internal_Sym *sym;
6041
      Elf_Internal_Sym *locsyms = *locsymsp;
6042
 
6043
      if (locsyms == NULL)
6044
        {
6045
          locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
6046
          if (locsyms == NULL)
6047
            locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
6048
                                            symtab_hdr->sh_info,
6049
                                            0, NULL, NULL, NULL);
6050
          if (locsyms == NULL)
6051
            return FALSE;
6052
          *locsymsp = locsyms;
6053
        }
6054
      sym = locsyms + r_symndx;
6055
 
6056
      if (hp != NULL)
6057
        *hp = NULL;
6058
 
6059
      if (symp != NULL)
6060
        *symp = sym;
6061
 
6062
      if (symsecp != NULL)
6063
        {
6064
          asection *symsec = NULL;
6065
          if ((sym->st_shndx != SHN_UNDEF
6066
               && sym->st_shndx < SHN_LORESERVE)
6067
              || sym->st_shndx > SHN_HIRESERVE)
6068
            symsec = bfd_section_from_elf_index (ibfd, sym->st_shndx);
6069
          *symsecp = symsec;
6070
        }
6071
 
6072
      if (tls_maskp != NULL)
6073
        {
6074
          struct got_entry **lgot_ents;
6075
          char *tls_mask;
6076
 
6077
          tls_mask = NULL;
6078
          lgot_ents = elf_local_got_ents (ibfd);
6079
          if (lgot_ents != NULL)
6080
            {
6081
              char *lgot_masks = (char *) (lgot_ents + symtab_hdr->sh_info);
6082
              tls_mask = &lgot_masks[r_symndx];
6083
            }
6084
          *tls_maskp = tls_mask;
6085
        }
6086
    }
6087
  return TRUE;
6088
}
6089
 
6090
/* Returns TLS_MASKP for the given REL symbol.  Function return is 0 on
6091
   error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
6092
   type suitable for optimization, and 1 otherwise.  */
6093
 
6094
static int
6095
get_tls_mask (char **tls_maskp, unsigned long *toc_symndx,
6096
              Elf_Internal_Sym **locsymsp,
6097
              const Elf_Internal_Rela *rel, bfd *ibfd)
6098
{
6099
  unsigned long r_symndx;
6100
  int next_r;
6101
  struct elf_link_hash_entry *h;
6102
  Elf_Internal_Sym *sym;
6103
  asection *sec;
6104
  bfd_vma off;
6105
 
6106
  r_symndx = ELF64_R_SYM (rel->r_info);
6107
  if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
6108
    return 0;
6109
 
6110
  if ((*tls_maskp != NULL && **tls_maskp != 0)
6111
      || sec == NULL
6112
      || ppc64_elf_section_data (sec)->sec_type != sec_toc)
6113
    return 1;
6114
 
6115
  /* Look inside a TOC section too.  */
6116
  if (h != NULL)
6117
    {
6118
      BFD_ASSERT (h->root.type == bfd_link_hash_defined);
6119
      off = h->root.u.def.value;
6120
    }
6121
  else
6122
    off = sym->st_value;
6123
  off += rel->r_addend;
6124
  BFD_ASSERT (off % 8 == 0);
6125
  r_symndx = ppc64_elf_section_data (sec)->u.t_symndx[off / 8];
6126
  next_r = ppc64_elf_section_data (sec)->u.t_symndx[off / 8 + 1];
6127
  if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
6128
    return 0;
6129
  if (toc_symndx != NULL)
6130
    *toc_symndx = r_symndx;
6131
  if ((h == NULL
6132
       || ((h->root.type == bfd_link_hash_defined
6133
            || h->root.type == bfd_link_hash_defweak)
6134
           && !h->def_dynamic))
6135
      && (next_r == -1 || next_r == -2))
6136
    return 1 - next_r;
6137
  return 1;
6138
}
6139
 
6140
/* Adjust all global syms defined in opd sections.  In gcc generated
6141
   code for the old ABI, these will already have been done.  */
6142
 
6143
static bfd_boolean
6144
adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
6145
{
6146
  struct ppc_link_hash_entry *eh;
6147
  asection *sym_sec;
6148
  struct _opd_sec_data *opd;
6149
 
6150
  if (h->root.type == bfd_link_hash_indirect)
6151
    return TRUE;
6152
 
6153
  if (h->root.type == bfd_link_hash_warning)
6154
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
6155
 
6156
  if (h->root.type != bfd_link_hash_defined
6157
      && h->root.type != bfd_link_hash_defweak)
6158
    return TRUE;
6159
 
6160
  eh = (struct ppc_link_hash_entry *) h;
6161
  if (eh->adjust_done)
6162
    return TRUE;
6163
 
6164
  sym_sec = eh->elf.root.u.def.section;
6165
  opd = get_opd_info (sym_sec);
6166
  if (opd != NULL && opd->adjust != NULL)
6167
    {
6168
      long adjust = opd->adjust[eh->elf.root.u.def.value / 8];
6169
      if (adjust == -1)
6170
        {
6171
          /* This entry has been deleted.  */
6172
          asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
6173
          if (dsec == NULL)
6174
            {
6175
              for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
6176
                if (elf_discarded_section (dsec))
6177
                  {
6178
                    ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
6179
                    break;
6180
                  }
6181
            }
6182
          eh->elf.root.u.def.value = 0;
6183
          eh->elf.root.u.def.section = dsec;
6184
        }
6185
      else
6186
        eh->elf.root.u.def.value += adjust;
6187
      eh->adjust_done = 1;
6188
    }
6189
  return TRUE;
6190
}
6191
 
6192
/* Handles decrementing dynamic reloc counts for the reloc specified by
6193
   R_INFO in section SEC.  If LOCAL_SYMS is NULL, then H and SYM_SEC
6194
   have already been determined.  */
6195
 
6196
static bfd_boolean
6197
dec_dynrel_count (bfd_vma r_info,
6198
                  asection *sec,
6199
                  struct bfd_link_info *info,
6200
                  Elf_Internal_Sym **local_syms,
6201
                  struct elf_link_hash_entry *h,
6202
                  asection *sym_sec)
6203
{
6204
  enum elf_ppc64_reloc_type r_type;
6205
  struct ppc_dyn_relocs *p;
6206
  struct ppc_dyn_relocs **pp;
6207
 
6208
  /* Can this reloc be dynamic?  This switch, and later tests here
6209
     should be kept in sync with the code in check_relocs.  */
6210
  r_type = ELF64_R_TYPE (r_info);
6211
  switch (r_type)
6212
    {
6213
    default:
6214
      return TRUE;
6215
 
6216
    case R_PPC64_TPREL16:
6217
    case R_PPC64_TPREL16_LO:
6218
    case R_PPC64_TPREL16_HI:
6219
    case R_PPC64_TPREL16_HA:
6220
    case R_PPC64_TPREL16_DS:
6221
    case R_PPC64_TPREL16_LO_DS:
6222
    case R_PPC64_TPREL16_HIGHER:
6223
    case R_PPC64_TPREL16_HIGHERA:
6224
    case R_PPC64_TPREL16_HIGHEST:
6225
    case R_PPC64_TPREL16_HIGHESTA:
6226
      if (!info->shared)
6227
        return TRUE;
6228
 
6229
    case R_PPC64_TPREL64:
6230
    case R_PPC64_DTPMOD64:
6231
    case R_PPC64_DTPREL64:
6232
    case R_PPC64_ADDR64:
6233
    case R_PPC64_REL30:
6234
    case R_PPC64_REL32:
6235
    case R_PPC64_REL64:
6236
    case R_PPC64_ADDR14:
6237
    case R_PPC64_ADDR14_BRNTAKEN:
6238
    case R_PPC64_ADDR14_BRTAKEN:
6239
    case R_PPC64_ADDR16:
6240
    case R_PPC64_ADDR16_DS:
6241
    case R_PPC64_ADDR16_HA:
6242
    case R_PPC64_ADDR16_HI:
6243
    case R_PPC64_ADDR16_HIGHER:
6244
    case R_PPC64_ADDR16_HIGHERA:
6245
    case R_PPC64_ADDR16_HIGHEST:
6246
    case R_PPC64_ADDR16_HIGHESTA:
6247
    case R_PPC64_ADDR16_LO:
6248
    case R_PPC64_ADDR16_LO_DS:
6249
    case R_PPC64_ADDR24:
6250
    case R_PPC64_ADDR32:
6251
    case R_PPC64_UADDR16:
6252
    case R_PPC64_UADDR32:
6253
    case R_PPC64_UADDR64:
6254
    case R_PPC64_TOC:
6255
      break;
6256
    }
6257
 
6258
  if (local_syms != NULL)
6259
    {
6260
      unsigned long r_symndx;
6261
      Elf_Internal_Sym *sym;
6262
      bfd *ibfd = sec->owner;
6263
 
6264
      r_symndx = ELF64_R_SYM (r_info);
6265
      if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
6266
        return FALSE;
6267
    }
6268
 
6269
  if ((info->shared
6270
       && (MUST_BE_DYN_RELOC (r_type)
6271
           || (h != NULL
6272
               && (!info->symbolic
6273
                   || h->root.type == bfd_link_hash_defweak
6274
                   || !h->def_regular))))
6275
      || (ELIMINATE_COPY_RELOCS
6276
          && !info->shared
6277
          && h != NULL
6278
          && (h->root.type == bfd_link_hash_defweak
6279
              || !h->def_regular)))
6280
    ;
6281
  else
6282
    return TRUE;
6283
 
6284
  if (h != NULL)
6285
    pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
6286
  else
6287
    {
6288
      if (sym_sec != NULL)
6289
        {
6290
          void *vpp = &elf_section_data (sym_sec)->local_dynrel;
6291
          pp = (struct ppc_dyn_relocs **) vpp;
6292
        }
6293
      else
6294
        {
6295
          void *vpp = &elf_section_data (sec)->local_dynrel;
6296
          pp = (struct ppc_dyn_relocs **) vpp;
6297
        }
6298
 
6299
      /* elf_gc_sweep may have already removed all dyn relocs associated
6300
         with local syms for a given section.  Don't report a dynreloc
6301
         miscount.  */
6302
      if (*pp == NULL)
6303
        return TRUE;
6304
    }
6305
 
6306
  while ((p = *pp) != NULL)
6307
    {
6308
      if (p->sec == sec)
6309
        {
6310
          if (!MUST_BE_DYN_RELOC (r_type))
6311
            p->pc_count -= 1;
6312
          p->count -= 1;
6313
          if (p->count == 0)
6314
            *pp = p->next;
6315
          return TRUE;
6316
        }
6317
      pp = &p->next;
6318
    }
6319
 
6320
  (*_bfd_error_handler) (_("dynreloc miscount for %B, section %A"),
6321
                           sec->owner, sec);
6322
  bfd_set_error (bfd_error_bad_value);
6323
  return FALSE;
6324
}
6325
 
6326
/* Remove unused Official Procedure Descriptor entries.  Currently we
6327
   only remove those associated with functions in discarded link-once
6328
   sections, or weakly defined functions that have been overridden.  It
6329
   would be possible to remove many more entries for statically linked
6330
   applications.  */
6331
 
6332
bfd_boolean
6333
ppc64_elf_edit_opd (bfd *obfd, struct bfd_link_info *info,
6334
                    bfd_boolean non_overlapping)
6335
{
6336
  bfd *ibfd;
6337
  bfd_boolean some_edited = FALSE;
6338
  asection *need_pad = NULL;
6339
 
6340
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
6341
    {
6342
      asection *sec;
6343
      Elf_Internal_Rela *relstart, *rel, *relend;
6344
      Elf_Internal_Shdr *symtab_hdr;
6345
      Elf_Internal_Sym *local_syms;
6346
      struct elf_link_hash_entry **sym_hashes;
6347
      bfd_vma offset;
6348
      struct _opd_sec_data *opd;
6349
      bfd_boolean need_edit, add_aux_fields;
6350
      bfd_size_type cnt_16b = 0;
6351
 
6352
      sec = bfd_get_section_by_name (ibfd, ".opd");
6353
      if (sec == NULL || sec->size == 0)
6354
        continue;
6355
 
6356
      if (sec->sec_info_type == ELF_INFO_TYPE_JUST_SYMS)
6357
        continue;
6358
 
6359
      if (sec->output_section == bfd_abs_section_ptr)
6360
        continue;
6361
 
6362
      /* Look through the section relocs.  */
6363
      if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
6364
        continue;
6365
 
6366
      local_syms = NULL;
6367
      symtab_hdr = &elf_symtab_hdr (ibfd);
6368
      sym_hashes = elf_sym_hashes (ibfd);
6369
 
6370
      /* Read the relocations.  */
6371
      relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
6372
                                            info->keep_memory);
6373
      if (relstart == NULL)
6374
        return FALSE;
6375
 
6376
      /* First run through the relocs to check they are sane, and to
6377
         determine whether we need to edit this opd section.  */
6378
      need_edit = FALSE;
6379
      need_pad = sec;
6380
      offset = 0;
6381
      relend = relstart + sec->reloc_count;
6382
      for (rel = relstart; rel < relend; )
6383
        {
6384
          enum elf_ppc64_reloc_type r_type;
6385
          unsigned long r_symndx;
6386
          asection *sym_sec;
6387
          struct elf_link_hash_entry *h;
6388
          Elf_Internal_Sym *sym;
6389
 
6390
          /* .opd contains a regular array of 16 or 24 byte entries.  We're
6391
             only interested in the reloc pointing to a function entry
6392
             point.  */
6393
          if (rel->r_offset != offset
6394
              || rel + 1 >= relend
6395
              || (rel + 1)->r_offset != offset + 8)
6396
            {
6397
              /* If someone messes with .opd alignment then after a
6398
                 "ld -r" we might have padding in the middle of .opd.
6399
                 Also, there's nothing to prevent someone putting
6400
                 something silly in .opd with the assembler.  No .opd
6401
                 optimization for them!  */
6402
            broken_opd:
6403
              (*_bfd_error_handler)
6404
                (_("%B: .opd is not a regular array of opd entries"), ibfd);
6405
              need_edit = FALSE;
6406
              break;
6407
            }
6408
 
6409
          if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
6410
              || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
6411
            {
6412
              (*_bfd_error_handler)
6413
                (_("%B: unexpected reloc type %u in .opd section"),
6414
                 ibfd, r_type);
6415
              need_edit = FALSE;
6416
              break;
6417
            }
6418
 
6419
          r_symndx = ELF64_R_SYM (rel->r_info);
6420
          if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
6421
                          r_symndx, ibfd))
6422
            goto error_ret;
6423
 
6424
          if (sym_sec == NULL || sym_sec->owner == NULL)
6425
            {
6426
              const char *sym_name;
6427
              if (h != NULL)
6428
                sym_name = h->root.root.string;
6429
              else
6430
                sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
6431
                                             sym_sec);
6432
 
6433
              (*_bfd_error_handler)
6434
                (_("%B: undefined sym `%s' in .opd section"),
6435
                 ibfd, sym_name);
6436
              need_edit = FALSE;
6437
              break;
6438
            }
6439
 
6440
          /* opd entries are always for functions defined in the
6441
             current input bfd.  If the symbol isn't defined in the
6442
             input bfd, then we won't be using the function in this
6443
             bfd;  It must be defined in a linkonce section in another
6444
             bfd, or is weak.  It's also possible that we are
6445
             discarding the function due to a linker script /DISCARD/,
6446
             which we test for via the output_section.  */
6447
          if (sym_sec->owner != ibfd
6448
              || sym_sec->output_section == bfd_abs_section_ptr)
6449
            need_edit = TRUE;
6450
 
6451
          rel += 2;
6452
          if (rel == relend
6453
              || (rel + 1 == relend && rel->r_offset == offset + 16))
6454
            {
6455
              if (sec->size == offset + 24)
6456
                {
6457
                  need_pad = NULL;
6458
                  break;
6459
                }
6460
              if (rel == relend && sec->size == offset + 16)
6461
                {
6462
                  cnt_16b++;
6463
                  break;
6464
                }
6465
              goto broken_opd;
6466
            }
6467
 
6468
          if (rel->r_offset == offset + 24)
6469
            offset += 24;
6470
          else if (rel->r_offset != offset + 16)
6471
            goto broken_opd;
6472
          else if (rel + 1 < relend
6473
                   && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
6474
                   && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
6475
            {
6476
              offset += 16;
6477
              cnt_16b++;
6478
            }
6479
          else if (rel + 2 < relend
6480
                   && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_ADDR64
6481
                   && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC)
6482
            {
6483
              offset += 24;
6484
              rel += 1;
6485
            }
6486
          else
6487
            goto broken_opd;
6488
        }
6489
 
6490
      add_aux_fields = non_overlapping && cnt_16b > 0;
6491
 
6492
      if (need_edit || add_aux_fields)
6493
        {
6494
          Elf_Internal_Rela *write_rel;
6495
          bfd_byte *rptr, *wptr;
6496
          bfd_byte *new_contents = NULL;
6497
          bfd_boolean skip;
6498
          long opd_ent_size;
6499
          bfd_size_type amt;
6500
 
6501
          amt = sec->size * sizeof (long) / 8;
6502
          opd = &ppc64_elf_section_data (sec)->u.opd;
6503
          opd->adjust = bfd_zalloc (obfd, amt);
6504
          if (opd->adjust == NULL)
6505
            return FALSE;
6506
          ppc64_elf_section_data (sec)->sec_type = sec_opd;
6507
 
6508
          /* This seems a waste of time as input .opd sections are all
6509
             zeros as generated by gcc, but I suppose there's no reason
6510
             this will always be so.  We might start putting something in
6511
             the third word of .opd entries.  */
6512
          if ((sec->flags & SEC_IN_MEMORY) == 0)
6513
            {
6514
              bfd_byte *loc;
6515
              if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
6516
                {
6517
                  if (loc != NULL)
6518
                    free (loc);
6519
                error_ret:
6520
                  if (local_syms != NULL
6521
                      && symtab_hdr->contents != (unsigned char *) local_syms)
6522
                    free (local_syms);
6523
                  if (elf_section_data (sec)->relocs != relstart)
6524
                    free (relstart);
6525
                  return FALSE;
6526
                }
6527
              sec->contents = loc;
6528
              sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
6529
            }
6530
 
6531
          elf_section_data (sec)->relocs = relstart;
6532
 
6533
          new_contents = sec->contents;
6534
          if (add_aux_fields)
6535
            {
6536
              new_contents = bfd_malloc (sec->size + cnt_16b * 8);
6537
              if (new_contents == NULL)
6538
                return FALSE;
6539
              need_pad = FALSE;
6540
            }
6541
          wptr = new_contents;
6542
          rptr = sec->contents;
6543
 
6544
          write_rel = relstart;
6545
          skip = FALSE;
6546
          offset = 0;
6547
          opd_ent_size = 0;
6548
          for (rel = relstart; rel < relend; rel++)
6549
            {
6550
              unsigned long r_symndx;
6551
              asection *sym_sec;
6552
              struct elf_link_hash_entry *h;
6553
              Elf_Internal_Sym *sym;
6554
 
6555
              r_symndx = ELF64_R_SYM (rel->r_info);
6556
              if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
6557
                              r_symndx, ibfd))
6558
                goto error_ret;
6559
 
6560
              if (rel->r_offset == offset)
6561
                {
6562
                  struct ppc_link_hash_entry *fdh = NULL;
6563
 
6564
                  /* See if the .opd entry is full 24 byte or
6565
                     16 byte (with fd_aux entry overlapped with next
6566
                     fd_func).  */
6567
                  opd_ent_size = 24;
6568
                  if ((rel + 2 == relend && sec->size == offset + 16)
6569
                      || (rel + 3 < relend
6570
                          && rel[2].r_offset == offset + 16
6571
                          && rel[3].r_offset == offset + 24
6572
                          && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_ADDR64
6573
                          && ELF64_R_TYPE (rel[3].r_info) == R_PPC64_TOC))
6574
                    opd_ent_size = 16;
6575
 
6576
                  if (h != NULL
6577
                      && h->root.root.string[0] == '.')
6578
                    {
6579
                      fdh = get_fdh ((struct ppc_link_hash_entry *) h,
6580
                                     ppc_hash_table (info));
6581
                      if (fdh != NULL
6582
                          && fdh->elf.root.type != bfd_link_hash_defined
6583
                          && fdh->elf.root.type != bfd_link_hash_defweak)
6584
                        fdh = NULL;
6585
                    }
6586
 
6587
                  skip = (sym_sec->owner != ibfd
6588
                          || sym_sec->output_section == bfd_abs_section_ptr);
6589
                  if (skip)
6590
                    {
6591
                      if (fdh != NULL && sym_sec->owner == ibfd)
6592
                        {
6593
                          /* Arrange for the function descriptor sym
6594
                             to be dropped.  */
6595
                          fdh->elf.root.u.def.value = 0;
6596
                          fdh->elf.root.u.def.section = sym_sec;
6597
                        }
6598
                      opd->adjust[rel->r_offset / 8] = -1;
6599
                    }
6600
                  else
6601
                    {
6602
                      /* We'll be keeping this opd entry.  */
6603
 
6604
                      if (fdh != NULL)
6605
                        {
6606
                          /* Redefine the function descriptor symbol to
6607
                             this location in the opd section.  It is
6608
                             necessary to update the value here rather
6609
                             than using an array of adjustments as we do
6610
                             for local symbols, because various places
6611
                             in the generic ELF code use the value
6612
                             stored in u.def.value.  */
6613
                          fdh->elf.root.u.def.value = wptr - new_contents;
6614
                          fdh->adjust_done = 1;
6615
                        }
6616
 
6617
                      /* Local syms are a bit tricky.  We could
6618
                         tweak them as they can be cached, but
6619
                         we'd need to look through the local syms
6620
                         for the function descriptor sym which we
6621
                         don't have at the moment.  So keep an
6622
                         array of adjustments.  */
6623
                      opd->adjust[rel->r_offset / 8]
6624
                        = (wptr - new_contents) - (rptr - sec->contents);
6625
 
6626
                      if (wptr != rptr)
6627
                        memcpy (wptr, rptr, opd_ent_size);
6628
                      wptr += opd_ent_size;
6629
                      if (add_aux_fields && opd_ent_size == 16)
6630
                        {
6631
                          memset (wptr, '\0', 8);
6632
                          wptr += 8;
6633
                        }
6634
                    }
6635
                  rptr += opd_ent_size;
6636
                  offset += opd_ent_size;
6637
                }
6638
 
6639
              if (skip)
6640
                {
6641
                  if (!NO_OPD_RELOCS
6642
                      && !info->relocatable
6643
                      && !dec_dynrel_count (rel->r_info, sec, info,
6644
                                            NULL, h, sym_sec))
6645
                    goto error_ret;
6646
                }
6647
              else
6648
                {
6649
                  /* We need to adjust any reloc offsets to point to the
6650
                     new opd entries.  While we're at it, we may as well
6651
                     remove redundant relocs.  */
6652
                  rel->r_offset += opd->adjust[(offset - opd_ent_size) / 8];
6653
                  if (write_rel != rel)
6654
                    memcpy (write_rel, rel, sizeof (*rel));
6655
                  ++write_rel;
6656
                }
6657
            }
6658
 
6659
          sec->size = wptr - new_contents;
6660
          sec->reloc_count = write_rel - relstart;
6661
          if (add_aux_fields)
6662
            {
6663
              free (sec->contents);
6664
              sec->contents = new_contents;
6665
            }
6666
 
6667
          /* Fudge the header size too, as this is used later in
6668
             elf_bfd_final_link if we are emitting relocs.  */
6669
          elf_section_data (sec)->rel_hdr.sh_size
6670
            = sec->reloc_count * elf_section_data (sec)->rel_hdr.sh_entsize;
6671
          BFD_ASSERT (elf_section_data (sec)->rel_hdr2 == NULL);
6672
          some_edited = TRUE;
6673
        }
6674
      else if (elf_section_data (sec)->relocs != relstart)
6675
        free (relstart);
6676
 
6677
      if (local_syms != NULL
6678
          && symtab_hdr->contents != (unsigned char *) local_syms)
6679
        {
6680
          if (!info->keep_memory)
6681
            free (local_syms);
6682
          else
6683
            symtab_hdr->contents = (unsigned char *) local_syms;
6684
        }
6685
    }
6686
 
6687
  if (some_edited)
6688
    elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
6689
 
6690
  /* If we are doing a final link and the last .opd entry is just 16 byte
6691
     long, add a 8 byte padding after it.  */
6692
  if (need_pad != NULL && !info->relocatable)
6693
    {
6694
      bfd_byte *p;
6695
 
6696
      if ((need_pad->flags & SEC_IN_MEMORY) == 0)
6697
        {
6698
          BFD_ASSERT (need_pad->size > 0);
6699
 
6700
          p = bfd_malloc (need_pad->size + 8);
6701
          if (p == NULL)
6702
            return FALSE;
6703
 
6704
          if (! bfd_get_section_contents (need_pad->owner, need_pad,
6705
                                          p, 0, need_pad->size))
6706
            return FALSE;
6707
 
6708
          need_pad->contents = p;
6709
          need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
6710
        }
6711
      else
6712
        {
6713
          p = bfd_realloc (need_pad->contents, need_pad->size + 8);
6714
          if (p == NULL)
6715
            return FALSE;
6716
 
6717
          need_pad->contents = p;
6718
        }
6719
 
6720
      memset (need_pad->contents + need_pad->size, 0, 8);
6721
      need_pad->size += 8;
6722
    }
6723
 
6724
  return TRUE;
6725
}
6726
 
6727
/* Set htab->tls_get_addr and call the generic ELF tls_setup function.  */
6728
 
6729
asection *
6730
ppc64_elf_tls_setup (bfd *obfd, struct bfd_link_info *info)
6731
{
6732
  struct ppc_link_hash_table *htab;
6733
 
6734
  htab = ppc_hash_table (info);
6735
  if (htab->tls_get_addr != NULL)
6736
    {
6737
      struct ppc_link_hash_entry *h = htab->tls_get_addr;
6738
 
6739
      while (h->elf.root.type == bfd_link_hash_indirect
6740
             || h->elf.root.type == bfd_link_hash_warning)
6741
        h = (struct ppc_link_hash_entry *) h->elf.root.u.i.link;
6742
 
6743
      htab->tls_get_addr = h;
6744
 
6745
      if (htab->tls_get_addr_fd == NULL
6746
          && h->oh != NULL
6747
          && h->oh->is_func_descriptor
6748
          && (h->oh->elf.root.type == bfd_link_hash_defined
6749
              || h->oh->elf.root.type == bfd_link_hash_defweak))
6750
        htab->tls_get_addr_fd = h->oh;
6751
    }
6752
 
6753
  if (htab->tls_get_addr_fd != NULL)
6754
    {
6755
      struct ppc_link_hash_entry *h = htab->tls_get_addr_fd;
6756
 
6757
      while (h->elf.root.type == bfd_link_hash_indirect
6758
             || h->elf.root.type == bfd_link_hash_warning)
6759
        h = (struct ppc_link_hash_entry *) h->elf.root.u.i.link;
6760
 
6761
      htab->tls_get_addr_fd = h;
6762
    }
6763
 
6764
  return _bfd_elf_tls_setup (obfd, info);
6765
}
6766
 
6767
/* Run through all the TLS relocs looking for optimization
6768
   opportunities.  The linker has been hacked (see ppc64elf.em) to do
6769
   a preliminary section layout so that we know the TLS segment
6770
   offsets.  We can't optimize earlier because some optimizations need
6771
   to know the tp offset, and we need to optimize before allocating
6772
   dynamic relocations.  */
6773
 
6774
bfd_boolean
6775
ppc64_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
6776
{
6777
  bfd *ibfd;
6778
  asection *sec;
6779
  struct ppc_link_hash_table *htab;
6780
  int pass;
6781
 
6782
  if (info->relocatable || info->shared)
6783
    return TRUE;
6784
 
6785
  htab = ppc_hash_table (info);
6786
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
6787
    {
6788
      Elf_Internal_Sym *locsyms = NULL;
6789
      asection *toc = bfd_get_section_by_name (ibfd, ".toc");
6790
      unsigned char *toc_ref = NULL;
6791
 
6792
      /* Look at all the sections for this file.  Make two passes over
6793
         the relocs.  On the first pass, mark toc entries involved
6794
         with tls relocs, and check that tls relocs involved in
6795
         setting up a tls_get_addr call are indeed followed by such a
6796
         call.  If they are not, exclude them from the optimizations
6797
         done on the second pass.  */
6798
      for (pass = 0; pass < 2; ++pass)
6799
        for (sec = ibfd->sections; sec != NULL; sec = sec->next)
6800
          if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
6801
            {
6802
              Elf_Internal_Rela *relstart, *rel, *relend;
6803
 
6804
              /* Read the relocations.  */
6805
              relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
6806
                                                    info->keep_memory);
6807
              if (relstart == NULL)
6808
                return FALSE;
6809
 
6810
              relend = relstart + sec->reloc_count;
6811
              for (rel = relstart; rel < relend; rel++)
6812
                {
6813
                  enum elf_ppc64_reloc_type r_type;
6814
                  unsigned long r_symndx;
6815
                  struct elf_link_hash_entry *h;
6816
                  Elf_Internal_Sym *sym;
6817
                  asection *sym_sec;
6818
                  char *tls_mask;
6819
                  char tls_set, tls_clear, tls_type = 0;
6820
                  bfd_vma value;
6821
                  bfd_boolean ok_tprel, is_local;
6822
                  long toc_ref_index = 0;
6823
                  int expecting_tls_get_addr = 0;
6824
 
6825
                  r_symndx = ELF64_R_SYM (rel->r_info);
6826
                  if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
6827
                                  r_symndx, ibfd))
6828
                    {
6829
                    err_free_rel:
6830
                      if (elf_section_data (sec)->relocs != relstart)
6831
                        free (relstart);
6832
                      if (toc_ref != NULL)
6833
                        free (toc_ref);
6834
                      if (locsyms != NULL
6835
                          && (elf_symtab_hdr (ibfd).contents
6836
                              != (unsigned char *) locsyms))
6837
                        free (locsyms);
6838
                      return FALSE;
6839
                    }
6840
 
6841
                  if (h != NULL)
6842
                    {
6843
                      if (h->root.type != bfd_link_hash_defined
6844
                          && h->root.type != bfd_link_hash_defweak)
6845
                        continue;
6846
                      value = h->root.u.def.value;
6847
                    }
6848
                  else
6849
                    /* Symbols referenced by TLS relocs must be of type
6850
                       STT_TLS.  So no need for .opd local sym adjust.  */
6851
                    value = sym->st_value;
6852
 
6853
                  ok_tprel = FALSE;
6854
                  is_local = FALSE;
6855
                  if (h == NULL
6856
                      || !h->def_dynamic)
6857
                    {
6858
                      is_local = TRUE;
6859
                      value += sym_sec->output_offset;
6860
                      value += sym_sec->output_section->vma;
6861
                      value -= htab->elf.tls_sec->vma;
6862
                      ok_tprel = (value + TP_OFFSET + ((bfd_vma) 1 << 31)
6863
                                  < (bfd_vma) 1 << 32);
6864
                    }
6865
 
6866
                  r_type = ELF64_R_TYPE (rel->r_info);
6867
                  switch (r_type)
6868
                    {
6869
                    case R_PPC64_GOT_TLSLD16:
6870
                    case R_PPC64_GOT_TLSLD16_LO:
6871
                      expecting_tls_get_addr = 1;
6872
                      /* Fall thru */
6873
 
6874
                    case R_PPC64_GOT_TLSLD16_HI:
6875
                    case R_PPC64_GOT_TLSLD16_HA:
6876
                      /* These relocs should never be against a symbol
6877
                         defined in a shared lib.  Leave them alone if
6878
                         that turns out to be the case.  */
6879
                      if (!is_local)
6880
                        continue;
6881
 
6882
                      /* LD -> LE */
6883
                      tls_set = 0;
6884
                      tls_clear = TLS_LD;
6885
                      tls_type = TLS_TLS | TLS_LD;
6886
                      break;
6887
 
6888
                    case R_PPC64_GOT_TLSGD16:
6889
                    case R_PPC64_GOT_TLSGD16_LO:
6890
                      expecting_tls_get_addr = 1;
6891
                      /* Fall thru */
6892
 
6893
                    case R_PPC64_GOT_TLSGD16_HI:
6894
                    case R_PPC64_GOT_TLSGD16_HA:
6895
                      if (ok_tprel)
6896
                        /* GD -> LE */
6897
                        tls_set = 0;
6898
                      else
6899
                        /* GD -> IE */
6900
                        tls_set = TLS_TLS | TLS_TPRELGD;
6901
                      tls_clear = TLS_GD;
6902
                      tls_type = TLS_TLS | TLS_GD;
6903
                      break;
6904
 
6905
                    case R_PPC64_GOT_TPREL16_DS:
6906
                    case R_PPC64_GOT_TPREL16_LO_DS:
6907
                    case R_PPC64_GOT_TPREL16_HI:
6908
                    case R_PPC64_GOT_TPREL16_HA:
6909
                      if (ok_tprel)
6910
                        {
6911
                          /* IE -> LE */
6912
                          tls_set = 0;
6913
                          tls_clear = TLS_TPREL;
6914
                          tls_type = TLS_TLS | TLS_TPREL;
6915
                          break;
6916
                        }
6917
                      continue;
6918
 
6919
                    case R_PPC64_TOC16:
6920
                    case R_PPC64_TOC16_LO:
6921
                    case R_PPC64_TLS:
6922
                      if (sym_sec == NULL || sym_sec != toc)
6923
                        continue;
6924
 
6925
                      /* Mark this toc entry as referenced by a TLS
6926
                         code sequence.  We can do that now in the
6927
                         case of R_PPC64_TLS, and after checking for
6928
                         tls_get_addr for the TOC16 relocs.  */
6929
                      if (toc_ref == NULL)
6930
                        {
6931
                          toc_ref = bfd_zmalloc (toc->size / 8);
6932
                          if (toc_ref == NULL)
6933
                            goto err_free_rel;
6934
                        }
6935
                      if (h != NULL)
6936
                        value = h->root.u.def.value;
6937
                      else
6938
                        value = sym->st_value;
6939
                      value += rel->r_addend;
6940
                      BFD_ASSERT (value < toc->size && value % 8 == 0);
6941
                      toc_ref_index = value / 8;
6942
                      if (r_type == R_PPC64_TLS)
6943
                        {
6944
                          toc_ref[toc_ref_index] = 1;
6945
                          continue;
6946
                        }
6947
 
6948
                      if (pass != 0 && toc_ref[toc_ref_index] == 0)
6949
                        continue;
6950
 
6951
                      tls_set = 0;
6952
                      tls_clear = 0;
6953
                      expecting_tls_get_addr = 2;
6954
                      break;
6955
 
6956
                    case R_PPC64_TPREL64:
6957
                      if (pass == 0
6958
                          || sec != toc
6959
                          || toc_ref == NULL
6960
                          || !toc_ref[rel->r_offset / 8])
6961
                        continue;
6962
                      if (ok_tprel)
6963
                        {
6964
                          /* IE -> LE */
6965
                          tls_set = TLS_EXPLICIT;
6966
                          tls_clear = TLS_TPREL;
6967
                          break;
6968
                        }
6969
                      continue;
6970
 
6971
                    case R_PPC64_DTPMOD64:
6972
                      if (pass == 0
6973
                          || sec != toc
6974
                          || toc_ref == NULL
6975
                          || !toc_ref[rel->r_offset / 8])
6976
                        continue;
6977
                      if (rel + 1 < relend
6978
                          && (rel[1].r_info
6979
                              == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
6980
                          && rel[1].r_offset == rel->r_offset + 8)
6981
                        {
6982
                          if (ok_tprel)
6983
                            /* GD -> LE */
6984
                            tls_set = TLS_EXPLICIT | TLS_GD;
6985
                          else
6986
                            /* GD -> IE */
6987
                            tls_set = TLS_EXPLICIT | TLS_GD | TLS_TPRELGD;
6988
                          tls_clear = TLS_GD;
6989
                        }
6990
                      else
6991
                        {
6992
                          if (!is_local)
6993
                            continue;
6994
 
6995
                          /* LD -> LE */
6996
                          tls_set = TLS_EXPLICIT;
6997
                          tls_clear = TLS_LD;
6998
                        }
6999
                      break;
7000
 
7001
                    default:
7002
                      continue;
7003
                    }
7004
 
7005
                  if (pass == 0)
7006
                    {
7007
                      if (!expecting_tls_get_addr)
7008
                        continue;
7009
 
7010
                      if (rel + 1 < relend)
7011
                        {
7012
                          Elf_Internal_Shdr *symtab_hdr;
7013
                          enum elf_ppc64_reloc_type r_type2;
7014
                          unsigned long r_symndx2;
7015
                          struct elf_link_hash_entry *h2;
7016
 
7017
                          symtab_hdr = &elf_symtab_hdr (ibfd);
7018
 
7019
                          /* The next instruction should be a call to
7020
                             __tls_get_addr.  Peek at the reloc to be sure.  */
7021
                          r_type2 = ELF64_R_TYPE (rel[1].r_info);
7022
                          r_symndx2 = ELF64_R_SYM (rel[1].r_info);
7023
                          if (r_symndx2 >= symtab_hdr->sh_info
7024
                              && (r_type2 == R_PPC64_REL14
7025
                                  || r_type2 == R_PPC64_REL14_BRTAKEN
7026
                                  || r_type2 == R_PPC64_REL14_BRNTAKEN
7027
                                  || r_type2 == R_PPC64_REL24))
7028
                            {
7029
                              struct elf_link_hash_entry **sym_hashes;
7030
 
7031
                              sym_hashes = elf_sym_hashes (ibfd);
7032
 
7033
                              h2 = sym_hashes[r_symndx2 - symtab_hdr->sh_info];
7034
                              while (h2->root.type == bfd_link_hash_indirect
7035
                                     || h2->root.type == bfd_link_hash_warning)
7036
                                h2 = ((struct elf_link_hash_entry *)
7037
                                      h2->root.u.i.link);
7038
                              if (h2 != NULL
7039
                                  && (h2 == &htab->tls_get_addr->elf
7040
                                      || h2 == &htab->tls_get_addr_fd->elf))
7041
                                {
7042
                                  if (expecting_tls_get_addr == 2)
7043
                                    {
7044
                                      /* Check for toc tls entries.  */
7045
                                      char *toc_tls;
7046
                                      int retval;
7047
 
7048
                                      retval = get_tls_mask (&toc_tls, NULL,
7049
                                                             &locsyms,
7050
                                                             rel, ibfd);
7051
                                      if (retval == 0)
7052
                                        goto err_free_rel;
7053
                                      if (retval > 1 && toc_tls != NULL)
7054
                                        toc_ref[toc_ref_index] = 1;
7055
                                    }
7056
                                  continue;
7057
                                }
7058
                            }
7059
                        }
7060
 
7061
                      if (expecting_tls_get_addr != 1)
7062
                        continue;
7063
 
7064
                      /* Uh oh, we didn't find the expected call.  We
7065
                         could just mark this symbol to exclude it
7066
                         from tls optimization but it's safer to skip
7067
                         the entire section.  */
7068
                      sec->has_tls_reloc = 0;
7069
                      break;
7070
                    }
7071
 
7072
                  if (expecting_tls_get_addr && htab->tls_get_addr != NULL)
7073
                    {
7074
                      struct plt_entry *ent;
7075
                      for (ent = htab->tls_get_addr->elf.plt.plist;
7076
                           ent != NULL;
7077
                           ent = ent->next)
7078
                        if (ent->addend == 0)
7079
                          {
7080
                            if (ent->plt.refcount > 0)
7081
                              {
7082
                                ent->plt.refcount -= 1;
7083
                                expecting_tls_get_addr = 0;
7084
                              }
7085
                            break;
7086
                          }
7087
                    }
7088
 
7089
                  if (expecting_tls_get_addr && htab->tls_get_addr_fd != NULL)
7090
                    {
7091
                      struct plt_entry *ent;
7092
                      for (ent = htab->tls_get_addr_fd->elf.plt.plist;
7093
                           ent != NULL;
7094
                           ent = ent->next)
7095
                        if (ent->addend == 0)
7096
                          {
7097
                            if (ent->plt.refcount > 0)
7098
                              ent->plt.refcount -= 1;
7099
                            break;
7100
                          }
7101
                    }
7102
 
7103
                  if (tls_clear == 0)
7104
                    continue;
7105
 
7106
                  if ((tls_set & TLS_EXPLICIT) == 0)
7107
                    {
7108
                      struct got_entry *ent;
7109
 
7110
                      /* Adjust got entry for this reloc.  */
7111
                      if (h != NULL)
7112
                        ent = h->got.glist;
7113
                      else
7114
                        ent = elf_local_got_ents (ibfd)[r_symndx];
7115
 
7116
                      for (; ent != NULL; ent = ent->next)
7117
                        if (ent->addend == rel->r_addend
7118
                            && ent->owner == ibfd
7119
                            && ent->tls_type == tls_type)
7120
                          break;
7121
                      if (ent == NULL)
7122
                        abort ();
7123
 
7124
                      if (tls_set == 0)
7125
                        {
7126
                          /* We managed to get rid of a got entry.  */
7127
                          if (ent->got.refcount > 0)
7128
                            ent->got.refcount -= 1;
7129
                        }
7130
                    }
7131
                  else
7132
                    {
7133
                      /* If we got rid of a DTPMOD/DTPREL reloc pair then
7134
                         we'll lose one or two dyn relocs.  */
7135
                      if (!dec_dynrel_count (rel->r_info, sec, info,
7136
                                             NULL, h, sym_sec))
7137
                        return FALSE;
7138
 
7139
                      if (tls_set == (TLS_EXPLICIT | TLS_GD))
7140
                        {
7141
                          if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
7142
                                                 NULL, h, sym_sec))
7143
                            return FALSE;
7144
                        }
7145
                    }
7146
 
7147
                  *tls_mask |= tls_set;
7148
                  *tls_mask &= ~tls_clear;
7149
                }
7150
 
7151
              if (elf_section_data (sec)->relocs != relstart)
7152
                free (relstart);
7153
            }
7154
 
7155
        if (toc_ref != NULL)
7156
          free (toc_ref);
7157
 
7158
        if (locsyms != NULL
7159
            && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
7160
          {
7161
            if (!info->keep_memory)
7162
              free (locsyms);
7163
            else
7164
              elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
7165
          }
7166
      }
7167
  return TRUE;
7168
}
7169
 
7170
/* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
7171
   the values of any global symbols in a toc section that has been
7172
   edited.  Globals in toc sections should be a rarity, so this function
7173
   sets a flag if any are found in toc sections other than the one just
7174
   edited, so that futher hash table traversals can be avoided.  */
7175
 
7176
struct adjust_toc_info
7177
{
7178
  asection *toc;
7179
  unsigned long *skip;
7180
  bfd_boolean global_toc_syms;
7181
};
7182
 
7183
static bfd_boolean
7184
adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
7185
{
7186
  struct ppc_link_hash_entry *eh;
7187
  struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
7188
 
7189
  if (h->root.type == bfd_link_hash_indirect)
7190
    return TRUE;
7191
 
7192
  if (h->root.type == bfd_link_hash_warning)
7193
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
7194
 
7195
  if (h->root.type != bfd_link_hash_defined
7196
      && h->root.type != bfd_link_hash_defweak)
7197
    return TRUE;
7198
 
7199
  eh = (struct ppc_link_hash_entry *) h;
7200
  if (eh->adjust_done)
7201
    return TRUE;
7202
 
7203
  if (eh->elf.root.u.def.section == toc_inf->toc)
7204
    {
7205
      unsigned long skip = toc_inf->skip[eh->elf.root.u.def.value >> 3];
7206
      if (skip != (unsigned long) -1)
7207
        eh->elf.root.u.def.value -= skip;
7208
      else
7209
        {
7210
          (*_bfd_error_handler)
7211
            (_("%s defined in removed toc entry"), eh->elf.root.root.string);
7212
          eh->elf.root.u.def.section = &bfd_abs_section;
7213
          eh->elf.root.u.def.value = 0;
7214
        }
7215
      eh->adjust_done = 1;
7216
    }
7217
  else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
7218
    toc_inf->global_toc_syms = TRUE;
7219
 
7220
  return TRUE;
7221
}
7222
 
7223
/* Examine all relocs referencing .toc sections in order to remove
7224
   unused .toc entries.  */
7225
 
7226
bfd_boolean
7227
ppc64_elf_edit_toc (bfd *obfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
7228
{
7229
  bfd *ibfd;
7230
  struct adjust_toc_info toc_inf;
7231
 
7232
  toc_inf.global_toc_syms = TRUE;
7233
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
7234
    {
7235
      asection *toc, *sec;
7236
      Elf_Internal_Shdr *symtab_hdr;
7237
      Elf_Internal_Sym *local_syms;
7238
      struct elf_link_hash_entry **sym_hashes;
7239
      Elf_Internal_Rela *relstart, *rel;
7240
      unsigned long *skip, *drop;
7241
      unsigned char *used;
7242
      unsigned char *keep, last, some_unused;
7243
 
7244
      toc = bfd_get_section_by_name (ibfd, ".toc");
7245
      if (toc == NULL
7246
          || toc->size == 0
7247
          || toc->sec_info_type == ELF_INFO_TYPE_JUST_SYMS
7248
          || elf_discarded_section (toc))
7249
        continue;
7250
 
7251
      local_syms = NULL;
7252
      symtab_hdr = &elf_symtab_hdr (ibfd);
7253
      sym_hashes = elf_sym_hashes (ibfd);
7254
 
7255
      /* Look at sections dropped from the final link.  */
7256
      skip = NULL;
7257
      relstart = NULL;
7258
      for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7259
        {
7260
          if (sec->reloc_count == 0
7261
              || !elf_discarded_section (sec)
7262
              || get_opd_info (sec)
7263
              || (sec->flags & SEC_ALLOC) == 0
7264
              || (sec->flags & SEC_DEBUGGING) != 0)
7265
            continue;
7266
 
7267
          relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
7268
          if (relstart == NULL)
7269
            goto error_ret;
7270
 
7271
          /* Run through the relocs to see which toc entries might be
7272
             unused.  */
7273
          for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
7274
            {
7275
              enum elf_ppc64_reloc_type r_type;
7276
              unsigned long r_symndx;
7277
              asection *sym_sec;
7278
              struct elf_link_hash_entry *h;
7279
              Elf_Internal_Sym *sym;
7280
              bfd_vma val;
7281
 
7282
              r_type = ELF64_R_TYPE (rel->r_info);
7283
              switch (r_type)
7284
                {
7285
                default:
7286
                  continue;
7287
 
7288
                case R_PPC64_TOC16:
7289
                case R_PPC64_TOC16_LO:
7290
                case R_PPC64_TOC16_HI:
7291
                case R_PPC64_TOC16_HA:
7292
                case R_PPC64_TOC16_DS:
7293
                case R_PPC64_TOC16_LO_DS:
7294
                  break;
7295
                }
7296
 
7297
              r_symndx = ELF64_R_SYM (rel->r_info);
7298
              if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7299
                              r_symndx, ibfd))
7300
                goto error_ret;
7301
 
7302
              if (sym_sec != toc)
7303
                continue;
7304
 
7305
              if (h != NULL)
7306
                val = h->root.u.def.value;
7307
              else
7308
                val = sym->st_value;
7309
              val += rel->r_addend;
7310
 
7311
              if (val >= toc->size)
7312
                continue;
7313
 
7314
              /* Anything in the toc ought to be aligned to 8 bytes.
7315
                 If not, don't mark as unused.  */
7316
              if (val & 7)
7317
                continue;
7318
 
7319
              if (skip == NULL)
7320
                {
7321
                  skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 7) / 8);
7322
                  if (skip == NULL)
7323
                    goto error_ret;
7324
                }
7325
 
7326
              skip[val >> 3] = 1;
7327
            }
7328
 
7329
          if (elf_section_data (sec)->relocs != relstart)
7330
            free (relstart);
7331
        }
7332
 
7333
      if (skip == NULL)
7334
        continue;
7335
 
7336
      used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
7337
      if (used == NULL)
7338
        {
7339
        error_ret:
7340
          if (local_syms != NULL
7341
              && symtab_hdr->contents != (unsigned char *) local_syms)
7342
            free (local_syms);
7343
          if (sec != NULL
7344
              && relstart != NULL
7345
              && elf_section_data (sec)->relocs != relstart)
7346
            free (relstart);
7347
          if (skip != NULL)
7348
            free (skip);
7349
          return FALSE;
7350
        }
7351
 
7352
      /* Now check all kept sections that might reference the toc.
7353
         Check the toc itself last.  */
7354
      for (sec = (ibfd->sections == toc && toc->next ? toc->next
7355
                  : ibfd->sections);
7356
           sec != NULL;
7357
           sec = (sec == toc ? NULL
7358
                  : sec->next == NULL ? toc
7359
                  : sec->next == toc && toc->next ? toc->next
7360
                  : sec->next))
7361
        {
7362
          int repeat;
7363
 
7364
          if (sec->reloc_count == 0
7365
              || elf_discarded_section (sec)
7366
              || get_opd_info (sec)
7367
              || (sec->flags & SEC_ALLOC) == 0
7368
              || (sec->flags & SEC_DEBUGGING) != 0)
7369
            continue;
7370
 
7371
          relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, TRUE);
7372
          if (relstart == NULL)
7373
            goto error_ret;
7374
 
7375
          /* Mark toc entries referenced as used.  */
7376
          repeat = 0;
7377
          do
7378
            for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
7379
              {
7380
                enum elf_ppc64_reloc_type r_type;
7381
                unsigned long r_symndx;
7382
                asection *sym_sec;
7383
                struct elf_link_hash_entry *h;
7384
                Elf_Internal_Sym *sym;
7385
                bfd_vma val;
7386
 
7387
                r_type = ELF64_R_TYPE (rel->r_info);
7388
                switch (r_type)
7389
                  {
7390
                  case R_PPC64_TOC16:
7391
                  case R_PPC64_TOC16_LO:
7392
                  case R_PPC64_TOC16_HI:
7393
                  case R_PPC64_TOC16_HA:
7394
                  case R_PPC64_TOC16_DS:
7395
                  case R_PPC64_TOC16_LO_DS:
7396
                    /* In case we're taking addresses of toc entries.  */
7397
                  case R_PPC64_ADDR64:
7398
                    break;
7399
 
7400
                  default:
7401
                    continue;
7402
                  }
7403
 
7404
                r_symndx = ELF64_R_SYM (rel->r_info);
7405
                if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7406
                                r_symndx, ibfd))
7407
                  {
7408
                    free (used);
7409
                    goto error_ret;
7410
                  }
7411
 
7412
                if (sym_sec != toc)
7413
                  continue;
7414
 
7415
                if (h != NULL)
7416
                  val = h->root.u.def.value;
7417
                else
7418
                  val = sym->st_value;
7419
                val += rel->r_addend;
7420
 
7421
                if (val >= toc->size)
7422
                  continue;
7423
 
7424
                /* For the toc section, we only mark as used if
7425
                   this entry itself isn't unused.  */
7426
                if (sec == toc
7427
                    && !used[val >> 3]
7428
                    && (used[rel->r_offset >> 3]
7429
                        || !skip[rel->r_offset >> 3]))
7430
                  /* Do all the relocs again, to catch reference
7431
                     chains.  */
7432
                  repeat = 1;
7433
 
7434
                used[val >> 3] = 1;
7435
              }
7436
          while (repeat);
7437
        }
7438
 
7439
      /* Merge the used and skip arrays.  Assume that TOC
7440
         doublewords not appearing as either used or unused belong
7441
         to to an entry more than one doubleword in size.  */
7442
      for (drop = skip, keep = used, last = 0, some_unused = 0;
7443
           drop < skip + (toc->size + 7) / 8;
7444
           ++drop, ++keep)
7445
        {
7446
          if (*keep)
7447
            {
7448
              *drop = 0;
7449
              last = 0;
7450
            }
7451
          else if (*drop)
7452
            {
7453
              some_unused = 1;
7454
              last = 1;
7455
            }
7456
          else
7457
            *drop = last;
7458
        }
7459
 
7460
      free (used);
7461
 
7462
      if (some_unused)
7463
        {
7464
          bfd_byte *contents, *src;
7465
          unsigned long off;
7466
 
7467
          /* Shuffle the toc contents, and at the same time convert the
7468
             skip array from booleans into offsets.  */
7469
          if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
7470
            goto error_ret;
7471
 
7472
          elf_section_data (toc)->this_hdr.contents = contents;
7473
 
7474
          for (src = contents, off = 0, drop = skip;
7475
               src < contents + toc->size;
7476
               src += 8, ++drop)
7477
            {
7478
              if (*drop)
7479
                {
7480
                  *drop = (unsigned long) -1;
7481
                  off += 8;
7482
                }
7483
              else if (off != 0)
7484
                {
7485
                  *drop = off;
7486
                  memcpy (src - off, src, 8);
7487
                }
7488
            }
7489
          toc->rawsize = toc->size;
7490
          toc->size = src - contents - off;
7491
 
7492
          if (toc->reloc_count != 0)
7493
            {
7494
              Elf_Internal_Rela *wrel;
7495
              bfd_size_type sz;
7496
 
7497
              /* Read toc relocs.  */
7498
              relstart = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
7499
                                                    TRUE);
7500
              if (relstart == NULL)
7501
                goto error_ret;
7502
 
7503
              /* Remove unused toc relocs, and adjust those we keep.  */
7504
              wrel = relstart;
7505
              for (rel = relstart; rel < relstart + toc->reloc_count; ++rel)
7506
                if (skip[rel->r_offset >> 3] != (unsigned long) -1)
7507
                  {
7508
                    wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
7509
                    wrel->r_info = rel->r_info;
7510
                    wrel->r_addend = rel->r_addend;
7511
                    ++wrel;
7512
                  }
7513
                else if (!dec_dynrel_count (rel->r_info, toc, info,
7514
                                            &local_syms, NULL, NULL))
7515
                  goto error_ret;
7516
 
7517
              toc->reloc_count = wrel - relstart;
7518
              sz = elf_section_data (toc)->rel_hdr.sh_entsize;
7519
              elf_section_data (toc)->rel_hdr.sh_size = toc->reloc_count * sz;
7520
              BFD_ASSERT (elf_section_data (toc)->rel_hdr2 == NULL);
7521
            }
7522
 
7523
          /* Adjust addends for relocs against the toc section sym.  */
7524
          for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7525
            {
7526
              if (sec->reloc_count == 0
7527
                  || elf_discarded_section (sec))
7528
                continue;
7529
 
7530
              relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7531
                                                    TRUE);
7532
              if (relstart == NULL)
7533
                goto error_ret;
7534
 
7535
              for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
7536
                {
7537
                  enum elf_ppc64_reloc_type r_type;
7538
                  unsigned long r_symndx;
7539
                  asection *sym_sec;
7540
                  struct elf_link_hash_entry *h;
7541
                  Elf_Internal_Sym *sym;
7542
 
7543
                  r_type = ELF64_R_TYPE (rel->r_info);
7544
                  switch (r_type)
7545
                    {
7546
                    default:
7547
                      continue;
7548
 
7549
                    case R_PPC64_TOC16:
7550
                    case R_PPC64_TOC16_LO:
7551
                    case R_PPC64_TOC16_HI:
7552
                    case R_PPC64_TOC16_HA:
7553
                    case R_PPC64_TOC16_DS:
7554
                    case R_PPC64_TOC16_LO_DS:
7555
                    case R_PPC64_ADDR64:
7556
                      break;
7557
                    }
7558
 
7559
                  r_symndx = ELF64_R_SYM (rel->r_info);
7560
                  if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7561
                                  r_symndx, ibfd))
7562
                    goto error_ret;
7563
 
7564
                  if (sym_sec != toc || h != NULL || sym->st_value != 0)
7565
                    continue;
7566
 
7567
                  rel->r_addend -= skip[rel->r_addend >> 3];
7568
                }
7569
            }
7570
 
7571
          /* We shouldn't have local or global symbols defined in the TOC,
7572
             but handle them anyway.  */
7573
          if (local_syms != NULL)
7574
            {
7575
              Elf_Internal_Sym *sym;
7576
 
7577
              for (sym = local_syms;
7578
                   sym < local_syms + symtab_hdr->sh_info;
7579
                   ++sym)
7580
                if (sym->st_shndx != SHN_UNDEF
7581
                    && (sym->st_shndx < SHN_LORESERVE
7582
                        || sym->st_shndx > SHN_HIRESERVE)
7583
                    && sym->st_value != 0
7584
                    && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
7585
                  {
7586
                    if (skip[sym->st_value >> 3] != (unsigned long) -1)
7587
                      sym->st_value -= skip[sym->st_value >> 3];
7588
                    else
7589
                      {
7590
                        (*_bfd_error_handler)
7591
                          (_("%s defined in removed toc entry"),
7592
                           bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7593
                                             NULL));
7594
                        sym->st_value = 0;
7595
                        sym->st_shndx = SHN_ABS;
7596
                      }
7597
                    symtab_hdr->contents = (unsigned char *) local_syms;
7598
                  }
7599
            }
7600
 
7601
          /* Finally, adjust any global syms defined in the toc.  */
7602
          if (toc_inf.global_toc_syms)
7603
            {
7604
              toc_inf.toc = toc;
7605
              toc_inf.skip = skip;
7606
              toc_inf.global_toc_syms = FALSE;
7607
              elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
7608
                                      &toc_inf);
7609
            }
7610
        }
7611
 
7612
      if (local_syms != NULL
7613
          && symtab_hdr->contents != (unsigned char *) local_syms)
7614
        {
7615
          if (!info->keep_memory)
7616
            free (local_syms);
7617
          else
7618
            symtab_hdr->contents = (unsigned char *) local_syms;
7619
        }
7620
      free (skip);
7621
    }
7622
 
7623
  return TRUE;
7624
}
7625
 
7626
/* Allocate space in .plt, .got and associated reloc sections for
7627
   dynamic relocs.  */
7628
 
7629
static bfd_boolean
7630
allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
7631
{
7632
  struct bfd_link_info *info;
7633
  struct ppc_link_hash_table *htab;
7634
  asection *s;
7635
  struct ppc_link_hash_entry *eh;
7636
  struct ppc_dyn_relocs *p;
7637
  struct got_entry *gent;
7638
 
7639
  if (h->root.type == bfd_link_hash_indirect)
7640
    return TRUE;
7641
 
7642
  if (h->root.type == bfd_link_hash_warning)
7643
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
7644
 
7645
  info = (struct bfd_link_info *) inf;
7646
  htab = ppc_hash_table (info);
7647
 
7648
  if (htab->elf.dynamic_sections_created
7649
      && h->dynindx != -1
7650
      && WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
7651
    {
7652
      struct plt_entry *pent;
7653
      bfd_boolean doneone = FALSE;
7654
      for (pent = h->plt.plist; pent != NULL; pent = pent->next)
7655
        if (pent->plt.refcount > 0)
7656
          {
7657
            /* If this is the first .plt entry, make room for the special
7658
               first entry.  */
7659
            s = htab->plt;
7660
            if (s->size == 0)
7661
              s->size += PLT_INITIAL_ENTRY_SIZE;
7662
 
7663
            pent->plt.offset = s->size;
7664
 
7665
            /* Make room for this entry.  */
7666
            s->size += PLT_ENTRY_SIZE;
7667
 
7668
            /* Make room for the .glink code.  */
7669
            s = htab->glink;
7670
            if (s->size == 0)
7671
              s->size += GLINK_CALL_STUB_SIZE;
7672
            /* We need bigger stubs past index 32767.  */
7673
            if (s->size >= GLINK_CALL_STUB_SIZE + 32768*2*4)
7674
              s->size += 4;
7675
            s->size += 2*4;
7676
 
7677
            /* We also need to make an entry in the .rela.plt section.  */
7678
            s = htab->relplt;
7679
            s->size += sizeof (Elf64_External_Rela);
7680
            doneone = TRUE;
7681
          }
7682
        else
7683
          pent->plt.offset = (bfd_vma) -1;
7684
      if (!doneone)
7685
        {
7686
          h->plt.plist = NULL;
7687
          h->needs_plt = 0;
7688
        }
7689
    }
7690
  else
7691
    {
7692
      h->plt.plist = NULL;
7693
      h->needs_plt = 0;
7694
    }
7695
 
7696
  eh = (struct ppc_link_hash_entry *) h;
7697
  /* Run through the TLS GD got entries first if we're changing them
7698
     to TPREL.  */
7699
  if ((eh->tls_mask & TLS_TPRELGD) != 0)
7700
    for (gent = h->got.glist; gent != NULL; gent = gent->next)
7701
      if (gent->got.refcount > 0
7702
          && (gent->tls_type & TLS_GD) != 0)
7703
        {
7704
          /* This was a GD entry that has been converted to TPREL.  If
7705
             there happens to be a TPREL entry we can use that one.  */
7706
          struct got_entry *ent;
7707
          for (ent = h->got.glist; ent != NULL; ent = ent->next)
7708
            if (ent->got.refcount > 0
7709
                && (ent->tls_type & TLS_TPREL) != 0
7710
                && ent->addend == gent->addend
7711
                && ent->owner == gent->owner)
7712
              {
7713
                gent->got.refcount = 0;
7714
                break;
7715
              }
7716
 
7717
          /* If not, then we'll be using our own TPREL entry.  */
7718
          if (gent->got.refcount != 0)
7719
            gent->tls_type = TLS_TLS | TLS_TPREL;
7720
        }
7721
 
7722
  for (gent = h->got.glist; gent != NULL; gent = gent->next)
7723
    if (gent->got.refcount > 0)
7724
      {
7725
        bfd_boolean dyn;
7726
 
7727
        /* Make sure this symbol is output as a dynamic symbol.
7728
           Undefined weak syms won't yet be marked as dynamic,
7729
           nor will all TLS symbols.  */
7730
        if (h->dynindx == -1
7731
            && !h->forced_local)
7732
          {
7733
            if (! bfd_elf_link_record_dynamic_symbol (info, h))
7734
              return FALSE;
7735
          }
7736
 
7737
        if ((gent->tls_type & TLS_LD) != 0
7738
            && !h->def_dynamic)
7739
          {
7740
            ppc64_tlsld_got (gent->owner)->refcount += 1;
7741
            gent->got.offset = (bfd_vma) -1;
7742
            continue;
7743
          }
7744
 
7745
        if (!is_ppc64_elf (gent->owner))
7746
          continue;
7747
 
7748
        s = ppc64_elf_tdata (gent->owner)->got;
7749
        gent->got.offset = s->size;
7750
        s->size
7751
          += (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)) ? 16 : 8;
7752
        dyn = htab->elf.dynamic_sections_created;
7753
        if ((info->shared
7754
             || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
7755
            && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
7756
                || h->root.type != bfd_link_hash_undefweak))
7757
          ppc64_elf_tdata (gent->owner)->relgot->size
7758
            += (gent->tls_type & eh->tls_mask & TLS_GD
7759
                ? 2 * sizeof (Elf64_External_Rela)
7760
                : sizeof (Elf64_External_Rela));
7761
      }
7762
    else
7763
      gent->got.offset = (bfd_vma) -1;
7764
 
7765
  if (eh->dyn_relocs == NULL)
7766
    return TRUE;
7767
 
7768
  /* In the shared -Bsymbolic case, discard space allocated for
7769
     dynamic pc-relative relocs against symbols which turn out to be
7770
     defined in regular objects.  For the normal shared case, discard
7771
     space for relocs that have become local due to symbol visibility
7772
     changes.  */
7773
 
7774
  if (info->shared)
7775
    {
7776
      /* Relocs that use pc_count are those that appear on a call insn,
7777
         or certain REL relocs (see MUST_BE_DYN_RELOC) that can be
7778
         generated via assembly.  We want calls to protected symbols to
7779
         resolve directly to the function rather than going via the plt.
7780
         If people want function pointer comparisons to work as expected
7781
         then they should avoid writing weird assembly.  */
7782
      if (SYMBOL_CALLS_LOCAL (info, h))
7783
        {
7784
          struct ppc_dyn_relocs **pp;
7785
 
7786
          for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
7787
            {
7788
              p->count -= p->pc_count;
7789
              p->pc_count = 0;
7790
              if (p->count == 0)
7791
                *pp = p->next;
7792
              else
7793
                pp = &p->next;
7794
            }
7795
        }
7796
 
7797
      /* Also discard relocs on undefined weak syms with non-default
7798
         visibility.  */
7799
      if (eh->dyn_relocs != NULL
7800
          && h->root.type == bfd_link_hash_undefweak)
7801
        {
7802
          if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
7803
            eh->dyn_relocs = NULL;
7804
 
7805
          /* Make sure this symbol is output as a dynamic symbol.
7806
             Undefined weak syms won't yet be marked as dynamic.  */
7807
          else if (h->dynindx == -1
7808
                   && !h->forced_local)
7809
            {
7810
              if (! bfd_elf_link_record_dynamic_symbol (info, h))
7811
                return FALSE;
7812
            }
7813
        }
7814
    }
7815
  else if (ELIMINATE_COPY_RELOCS)
7816
    {
7817
      /* For the non-shared case, discard space for relocs against
7818
         symbols which turn out to need copy relocs or are not
7819
         dynamic.  */
7820
 
7821
      if (!h->non_got_ref
7822
          && h->def_dynamic
7823
          && !h->def_regular)
7824
        {
7825
          /* Make sure this symbol is output as a dynamic symbol.
7826
             Undefined weak syms won't yet be marked as dynamic.  */
7827
          if (h->dynindx == -1
7828
              && !h->forced_local)
7829
            {
7830
              if (! bfd_elf_link_record_dynamic_symbol (info, h))
7831
                return FALSE;
7832
            }
7833
 
7834
          /* If that succeeded, we know we'll be keeping all the
7835
             relocs.  */
7836
          if (h->dynindx != -1)
7837
            goto keep;
7838
        }
7839
 
7840
      eh->dyn_relocs = NULL;
7841
 
7842
    keep: ;
7843
    }
7844
 
7845
  /* Finally, allocate space.  */
7846
  for (p = eh->dyn_relocs; p != NULL; p = p->next)
7847
    {
7848
      asection *sreloc = elf_section_data (p->sec)->sreloc;
7849
      sreloc->size += p->count * sizeof (Elf64_External_Rela);
7850
    }
7851
 
7852
  return TRUE;
7853
}
7854
 
7855
/* Find any dynamic relocs that apply to read-only sections.  */
7856
 
7857
static bfd_boolean
7858
readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
7859
{
7860
  struct ppc_link_hash_entry *eh;
7861
  struct ppc_dyn_relocs *p;
7862
 
7863
  if (h->root.type == bfd_link_hash_warning)
7864
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
7865
 
7866
  eh = (struct ppc_link_hash_entry *) h;
7867
  for (p = eh->dyn_relocs; p != NULL; p = p->next)
7868
    {
7869
      asection *s = p->sec->output_section;
7870
 
7871
      if (s != NULL && (s->flags & SEC_READONLY) != 0)
7872
        {
7873
          struct bfd_link_info *info = inf;
7874
 
7875
          info->flags |= DF_TEXTREL;
7876
 
7877
          /* Not an error, just cut short the traversal.  */
7878
          return FALSE;
7879
        }
7880
    }
7881
  return TRUE;
7882
}
7883
 
7884
/* Set the sizes of the dynamic sections.  */
7885
 
7886
static bfd_boolean
7887
ppc64_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
7888
                                 struct bfd_link_info *info)
7889
{
7890
  struct ppc_link_hash_table *htab;
7891
  bfd *dynobj;
7892
  asection *s;
7893
  bfd_boolean relocs;
7894
  bfd *ibfd;
7895
 
7896
  htab = ppc_hash_table (info);
7897
  dynobj = htab->elf.dynobj;
7898
  if (dynobj == NULL)
7899
    abort ();
7900
 
7901
  if (htab->elf.dynamic_sections_created)
7902
    {
7903
      /* Set the contents of the .interp section to the interpreter.  */
7904
      if (info->executable)
7905
        {
7906
          s = bfd_get_section_by_name (dynobj, ".interp");
7907
          if (s == NULL)
7908
            abort ();
7909
          s->size = sizeof ELF_DYNAMIC_INTERPRETER;
7910
          s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
7911
        }
7912
    }
7913
 
7914
  /* Set up .got offsets for local syms, and space for local dynamic
7915
     relocs.  */
7916
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
7917
    {
7918
      struct got_entry **lgot_ents;
7919
      struct got_entry **end_lgot_ents;
7920
      char *lgot_masks;
7921
      bfd_size_type locsymcount;
7922
      Elf_Internal_Shdr *symtab_hdr;
7923
      asection *srel;
7924
 
7925
      if (!is_ppc64_elf (ibfd))
7926
        continue;
7927
 
7928
      for (s = ibfd->sections; s != NULL; s = s->next)
7929
        {
7930
          struct ppc_dyn_relocs *p;
7931
 
7932
          for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
7933
            {
7934
              if (!bfd_is_abs_section (p->sec)
7935
                  && bfd_is_abs_section (p->sec->output_section))
7936
                {
7937
                  /* Input section has been discarded, either because
7938
                     it is a copy of a linkonce section or due to
7939
                     linker script /DISCARD/, so we'll be discarding
7940
                     the relocs too.  */
7941
                }
7942
              else if (p->count != 0)
7943
                {
7944
                  srel = elf_section_data (p->sec)->sreloc;
7945
                  srel->size += p->count * sizeof (Elf64_External_Rela);
7946
                  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
7947
                    info->flags |= DF_TEXTREL;
7948
                }
7949
            }
7950
        }
7951
 
7952
      lgot_ents = elf_local_got_ents (ibfd);
7953
      if (!lgot_ents)
7954
        continue;
7955
 
7956
      symtab_hdr = &elf_symtab_hdr (ibfd);
7957
      locsymcount = symtab_hdr->sh_info;
7958
      end_lgot_ents = lgot_ents + locsymcount;
7959
      lgot_masks = (char *) end_lgot_ents;
7960
      s = ppc64_elf_tdata (ibfd)->got;
7961
      srel = ppc64_elf_tdata (ibfd)->relgot;
7962
      for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
7963
        {
7964
          struct got_entry *ent;
7965
 
7966
          for (ent = *lgot_ents; ent != NULL; ent = ent->next)
7967
            if (ent->got.refcount > 0)
7968
              {
7969
                if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
7970
                  {
7971
                    ppc64_tlsld_got (ibfd)->refcount += 1;
7972
                    ent->got.offset = (bfd_vma) -1;
7973
                  }
7974
                else
7975
                  {
7976
                    ent->got.offset = s->size;
7977
                    if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
7978
                      {
7979
                        s->size += 16;
7980
                        if (info->shared)
7981
                          srel->size += 2 * sizeof (Elf64_External_Rela);
7982
                      }
7983
                    else
7984
                      {
7985
                        s->size += 8;
7986
                        if (info->shared)
7987
                          srel->size += sizeof (Elf64_External_Rela);
7988
                      }
7989
                  }
7990
              }
7991
            else
7992
              ent->got.offset = (bfd_vma) -1;
7993
        }
7994
    }
7995
 
7996
  /* Allocate global sym .plt and .got entries, and space for global
7997
     sym dynamic relocs.  */
7998
  elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
7999
 
8000
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
8001
    {
8002
      if (!is_ppc64_elf (ibfd))
8003
        continue;
8004
 
8005
      if (ppc64_tlsld_got (ibfd)->refcount > 0)
8006
        {
8007
          s = ppc64_elf_tdata (ibfd)->got;
8008
          ppc64_tlsld_got (ibfd)->offset = s->size;
8009
          s->size += 16;
8010
          if (info->shared)
8011
            {
8012
              asection *srel = ppc64_elf_tdata (ibfd)->relgot;
8013
              srel->size += sizeof (Elf64_External_Rela);
8014
            }
8015
        }
8016
      else
8017
        ppc64_tlsld_got (ibfd)->offset = (bfd_vma) -1;
8018
    }
8019
 
8020
  /* We now have determined the sizes of the various dynamic sections.
8021
     Allocate memory for them.  */
8022
  relocs = FALSE;
8023
  for (s = dynobj->sections; s != NULL; s = s->next)
8024
    {
8025
      if ((s->flags & SEC_LINKER_CREATED) == 0)
8026
        continue;
8027
 
8028
      if (s == htab->brlt || s == htab->relbrlt)
8029
        /* These haven't been allocated yet;  don't strip.  */
8030
        continue;
8031
      else if (s == htab->got
8032
               || s == htab->plt
8033
               || s == htab->glink
8034
               || s == htab->dynbss)
8035
        {
8036
          /* Strip this section if we don't need it; see the
8037
             comment below.  */
8038
        }
8039
      else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
8040
        {
8041
          if (s->size != 0)
8042
            {
8043
              if (s != htab->relplt)
8044
                relocs = TRUE;
8045
 
8046
              /* We use the reloc_count field as a counter if we need
8047
                 to copy relocs into the output file.  */
8048
              s->reloc_count = 0;
8049
            }
8050
        }
8051
      else
8052
        {
8053
          /* It's not one of our sections, so don't allocate space.  */
8054
          continue;
8055
        }
8056
 
8057
      if (s->size == 0)
8058
        {
8059
          /* If we don't need this section, strip it from the
8060
             output file.  This is mostly to handle .rela.bss and
8061
             .rela.plt.  We must create both sections in
8062
             create_dynamic_sections, because they must be created
8063
             before the linker maps input sections to output
8064
             sections.  The linker does that before
8065
             adjust_dynamic_symbol is called, and it is that
8066
             function which decides whether anything needs to go
8067
             into these sections.  */
8068
          s->flags |= SEC_EXCLUDE;
8069
          continue;
8070
        }
8071
 
8072
      if ((s->flags & SEC_HAS_CONTENTS) == 0)
8073
        continue;
8074
 
8075
      /* Allocate memory for the section contents.  We use bfd_zalloc
8076
         here in case unused entries are not reclaimed before the
8077
         section's contents are written out.  This should not happen,
8078
         but this way if it does we get a R_PPC64_NONE reloc in .rela
8079
         sections instead of garbage.
8080
         We also rely on the section contents being zero when writing
8081
         the GOT.  */
8082
      s->contents = bfd_zalloc (dynobj, s->size);
8083
      if (s->contents == NULL)
8084
        return FALSE;
8085
    }
8086
 
8087
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
8088
    {
8089
      if (!is_ppc64_elf (ibfd))
8090
        continue;
8091
 
8092
      s = ppc64_elf_tdata (ibfd)->got;
8093
      if (s != NULL && s != htab->got)
8094
        {
8095
          if (s->size == 0)
8096
            s->flags |= SEC_EXCLUDE;
8097
          else
8098
            {
8099
              s->contents = bfd_zalloc (ibfd, s->size);
8100
              if (s->contents == NULL)
8101
                return FALSE;
8102
            }
8103
        }
8104
      s = ppc64_elf_tdata (ibfd)->relgot;
8105
      if (s != NULL)
8106
        {
8107
          if (s->size == 0)
8108
            s->flags |= SEC_EXCLUDE;
8109
          else
8110
            {
8111
              s->contents = bfd_zalloc (ibfd, s->size);
8112
              if (s->contents == NULL)
8113
                return FALSE;
8114
              relocs = TRUE;
8115
              s->reloc_count = 0;
8116
            }
8117
        }
8118
    }
8119
 
8120
  if (htab->elf.dynamic_sections_created)
8121
    {
8122
      /* Add some entries to the .dynamic section.  We fill in the
8123
         values later, in ppc64_elf_finish_dynamic_sections, but we
8124
         must add the entries now so that we get the correct size for
8125
         the .dynamic section.  The DT_DEBUG entry is filled in by the
8126
         dynamic linker and used by the debugger.  */
8127
#define add_dynamic_entry(TAG, VAL) \
8128
  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
8129
 
8130
      if (info->executable)
8131
        {
8132
          if (!add_dynamic_entry (DT_DEBUG, 0))
8133
            return FALSE;
8134
        }
8135
 
8136
      if (htab->plt != NULL && htab->plt->size != 0)
8137
        {
8138
          if (!add_dynamic_entry (DT_PLTGOT, 0)
8139
              || !add_dynamic_entry (DT_PLTRELSZ, 0)
8140
              || !add_dynamic_entry (DT_PLTREL, DT_RELA)
8141
              || !add_dynamic_entry (DT_JMPREL, 0)
8142
              || !add_dynamic_entry (DT_PPC64_GLINK, 0))
8143
            return FALSE;
8144
        }
8145
 
8146
      if (NO_OPD_RELOCS)
8147
        {
8148
          if (!add_dynamic_entry (DT_PPC64_OPD, 0)
8149
              || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
8150
            return FALSE;
8151
        }
8152
 
8153
      if (relocs)
8154
        {
8155
          if (!add_dynamic_entry (DT_RELA, 0)
8156
              || !add_dynamic_entry (DT_RELASZ, 0)
8157
              || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
8158
            return FALSE;
8159
 
8160
          /* If any dynamic relocs apply to a read-only section,
8161
             then we need a DT_TEXTREL entry.  */
8162
          if ((info->flags & DF_TEXTREL) == 0)
8163
            elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, info);
8164
 
8165
          if ((info->flags & DF_TEXTREL) != 0)
8166
            {
8167
              if (!add_dynamic_entry (DT_TEXTREL, 0))
8168
                return FALSE;
8169
            }
8170
        }
8171
    }
8172
#undef add_dynamic_entry
8173
 
8174
  return TRUE;
8175
}
8176
 
8177
/* Determine the type of stub needed, if any, for a call.  */
8178
 
8179
static inline enum ppc_stub_type
8180
ppc_type_of_stub (asection *input_sec,
8181
                  const Elf_Internal_Rela *rel,
8182
                  struct ppc_link_hash_entry **hash,
8183
                  bfd_vma destination)
8184
{
8185
  struct ppc_link_hash_entry *h = *hash;
8186
  bfd_vma location;
8187
  bfd_vma branch_offset;
8188
  bfd_vma max_branch_offset;
8189
  enum elf_ppc64_reloc_type r_type;
8190
 
8191
  if (h != NULL)
8192
    {
8193
      struct ppc_link_hash_entry *fdh = h;
8194
      if (fdh->oh != NULL
8195
          && fdh->oh->is_func_descriptor)
8196
        fdh = fdh->oh;
8197
 
8198
      if (fdh->elf.dynindx != -1)
8199
        {
8200
          struct plt_entry *ent;
8201
 
8202
          for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
8203
            if (ent->addend == rel->r_addend
8204
                && ent->plt.offset != (bfd_vma) -1)
8205
              {
8206
                *hash = fdh;
8207
                return ppc_stub_plt_call;
8208
              }
8209
        }
8210
 
8211
      /* Here, we know we don't have a plt entry.  If we don't have a
8212
         either a defined function descriptor or a defined entry symbol
8213
         in a regular object file, then it is pointless trying to make
8214
         any other type of stub.  */
8215
      if (!((fdh->elf.root.type == bfd_link_hash_defined
8216
            || fdh->elf.root.type == bfd_link_hash_defweak)
8217
            && fdh->elf.root.u.def.section->output_section != NULL)
8218
          && !((h->elf.root.type == bfd_link_hash_defined
8219
                || h->elf.root.type == bfd_link_hash_defweak)
8220
               && h->elf.root.u.def.section->output_section != NULL))
8221
        return ppc_stub_none;
8222
    }
8223
 
8224
  /* Determine where the call point is.  */
8225
  location = (input_sec->output_offset
8226
              + input_sec->output_section->vma
8227
              + rel->r_offset);
8228
 
8229
  branch_offset = destination - location;
8230
  r_type = ELF64_R_TYPE (rel->r_info);
8231
 
8232
  /* Determine if a long branch stub is needed.  */
8233
  max_branch_offset = 1 << 25;
8234
  if (r_type != R_PPC64_REL24)
8235
    max_branch_offset = 1 << 15;
8236
 
8237
  if (branch_offset + max_branch_offset >= 2 * max_branch_offset)
8238
    /* We need a stub.  Figure out whether a long_branch or plt_branch
8239
       is needed later.  */
8240
    return ppc_stub_long_branch;
8241
 
8242
  return ppc_stub_none;
8243
}
8244
 
8245
/* Build a .plt call stub.  */
8246
 
8247
static inline bfd_byte *
8248
build_plt_stub (bfd *obfd, bfd_byte *p, int offset)
8249
{
8250
#define PPC_LO(v) ((v) & 0xffff)
8251
#define PPC_HI(v) (((v) >> 16) & 0xffff)
8252
#define PPC_HA(v) PPC_HI ((v) + 0x8000)
8253
 
8254
  if (PPC_HA (offset) != 0)
8255
    {
8256
      bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p),     p += 4;
8257
      bfd_put_32 (obfd, STD_R2_40R1, p),                        p += 4;
8258
      bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset), p),      p += 4;
8259
      if (PPC_HA (offset + 16) != PPC_HA (offset))
8260
        {
8261
          bfd_put_32 (obfd, ADDI_R12_R12 | PPC_LO (offset), p), p += 4;
8262
          offset = 0;
8263
        }
8264
      bfd_put_32 (obfd, MTCTR_R11, p),                          p += 4;
8265
      bfd_put_32 (obfd, LD_R2_0R12 | PPC_LO (offset + 8), p),   p += 4;
8266
      bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset + 16), p), p += 4;
8267
      bfd_put_32 (obfd, BCTR, p),                               p += 4;
8268
    }
8269
  else
8270
    {
8271
      bfd_put_32 (obfd, STD_R2_40R1, p),                        p += 4;
8272
      bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset), p),       p += 4;
8273
      if (PPC_HA (offset + 16) != PPC_HA (offset))
8274
        {
8275
          bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p),   p += 4;
8276
          offset = 0;
8277
        }
8278
      bfd_put_32 (obfd, MTCTR_R11, p),                          p += 4;
8279
      bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p),  p += 4;
8280
      bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p),    p += 4;
8281
      bfd_put_32 (obfd, BCTR, p),                               p += 4;
8282
    }
8283
  return p;
8284
}
8285
 
8286
static bfd_boolean
8287
ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
8288
{
8289
  struct ppc_stub_hash_entry *stub_entry;
8290
  struct ppc_branch_hash_entry *br_entry;
8291
  struct bfd_link_info *info;
8292
  struct ppc_link_hash_table *htab;
8293
  bfd_byte *loc;
8294
  bfd_byte *p;
8295
  unsigned int indx;
8296
  struct plt_entry *ent;
8297
  bfd_vma dest, off;
8298
  int size;
8299
 
8300
  /* Massage our args to the form they really have.  */
8301
  stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
8302
  info = in_arg;
8303
 
8304
  htab = ppc_hash_table (info);
8305
 
8306
  /* Make a note of the offset within the stubs for this entry.  */
8307
  stub_entry->stub_offset = stub_entry->stub_sec->size;
8308
  loc = stub_entry->stub_sec->contents + stub_entry->stub_offset;
8309
 
8310
  htab->stub_count[stub_entry->stub_type - 1] += 1;
8311
  switch (stub_entry->stub_type)
8312
    {
8313
    case ppc_stub_long_branch:
8314
    case ppc_stub_long_branch_r2off:
8315
      /* Branches are relative.  This is where we are going to.  */
8316
      off = dest = (stub_entry->target_value
8317
                    + stub_entry->target_section->output_offset
8318
                    + stub_entry->target_section->output_section->vma);
8319
 
8320
      /* And this is where we are coming from.  */
8321
      off -= (stub_entry->stub_offset
8322
              + stub_entry->stub_sec->output_offset
8323
              + stub_entry->stub_sec->output_section->vma);
8324
 
8325
      size = 4;
8326
      if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
8327
        {
8328
          bfd_vma r2off;
8329
 
8330
          r2off = (htab->stub_group[stub_entry->target_section->id].toc_off
8331
                   - htab->stub_group[stub_entry->id_sec->id].toc_off);
8332
          bfd_put_32 (htab->stub_bfd, STD_R2_40R1, loc);
8333
          loc += 4;
8334
          size = 12;
8335
          if (PPC_HA (r2off) != 0)
8336
            {
8337
              size = 16;
8338
              bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
8339
              loc += 4;
8340
            }
8341
          bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
8342
          loc += 4;
8343
          off -= size - 4;
8344
        }
8345
      bfd_put_32 (htab->stub_bfd, B_DOT | (off & 0x3fffffc), loc);
8346
 
8347
      if (off + (1 << 25) >= (bfd_vma) (1 << 26))
8348
        {
8349
          (*_bfd_error_handler) (_("long branch stub `%s' offset overflow"),
8350
                                 stub_entry->root.string);
8351
          htab->stub_error = TRUE;
8352
          return FALSE;
8353
        }
8354
 
8355
      if (info->emitrelocations)
8356
        {
8357
          Elf_Internal_Rela *relocs, *r;
8358
          struct bfd_elf_section_data *elfsec_data;
8359
 
8360
          elfsec_data = elf_section_data (stub_entry->stub_sec);
8361
          relocs = elfsec_data->relocs;
8362
          if (relocs == NULL)
8363
            {
8364
              bfd_size_type relsize;
8365
              relsize = stub_entry->stub_sec->reloc_count * sizeof (*relocs);
8366
              relocs = bfd_alloc (htab->stub_bfd, relsize);
8367
              if (relocs == NULL)
8368
                return FALSE;
8369
              elfsec_data->relocs = relocs;
8370
              elfsec_data->rel_hdr.sh_size = (stub_entry->stub_sec->reloc_count
8371
                                              * sizeof (Elf64_External_Rela));
8372
              elfsec_data->rel_hdr.sh_entsize = sizeof (Elf64_External_Rela);
8373
              stub_entry->stub_sec->reloc_count = 0;
8374
            }
8375
          r = relocs + stub_entry->stub_sec->reloc_count;
8376
          stub_entry->stub_sec->reloc_count += 1;
8377
          r->r_offset = loc - stub_entry->stub_sec->contents;
8378
          r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
8379
          r->r_addend = dest;
8380
          if (stub_entry->h != NULL)
8381
            {
8382
              struct elf_link_hash_entry **hashes;
8383
              unsigned long symndx;
8384
              struct ppc_link_hash_entry *h;
8385
 
8386
              hashes = elf_sym_hashes (htab->stub_bfd);
8387
              if (hashes == NULL)
8388
                {
8389
                  bfd_size_type hsize;
8390
 
8391
                  hsize = (htab->stub_globals + 1) * sizeof (*hashes);
8392
                  hashes = bfd_zalloc (htab->stub_bfd, hsize);
8393
                  if (hashes == NULL)
8394
                    return FALSE;
8395
                  elf_sym_hashes (htab->stub_bfd) = hashes;
8396
                  htab->stub_globals = 1;
8397
                }
8398
              symndx = htab->stub_globals++;
8399
              h = stub_entry->h;
8400
              hashes[symndx] = &h->elf;
8401
              r->r_info = ELF64_R_INFO (symndx, R_PPC64_REL24);
8402
              if (h->oh != NULL && h->oh->is_func)
8403
                h = h->oh;
8404
              if (h->elf.root.u.def.section != stub_entry->target_section)
8405
                /* H is an opd symbol.  The addend must be zero.  */
8406
                r->r_addend = 0;
8407
              else
8408
                {
8409
                  off = (h->elf.root.u.def.value
8410
                         + h->elf.root.u.def.section->output_offset
8411
                         + h->elf.root.u.def.section->output_section->vma);
8412
                  r->r_addend -= off;
8413
                }
8414
            }
8415
        }
8416
      break;
8417
 
8418
    case ppc_stub_plt_branch:
8419
    case ppc_stub_plt_branch_r2off:
8420
      br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
8421
                                         stub_entry->root.string + 9,
8422
                                         FALSE, FALSE);
8423
      if (br_entry == NULL)
8424
        {
8425
          (*_bfd_error_handler) (_("can't find branch stub `%s'"),
8426
                                 stub_entry->root.string);
8427
          htab->stub_error = TRUE;
8428
          return FALSE;
8429
        }
8430
 
8431
      off = (stub_entry->target_value
8432
             + stub_entry->target_section->output_offset
8433
             + stub_entry->target_section->output_section->vma);
8434
 
8435
      bfd_put_64 (htab->brlt->owner, off,
8436
                  htab->brlt->contents + br_entry->offset);
8437
 
8438
      if (br_entry->iter == htab->stub_iteration)
8439
        {
8440
          br_entry->iter = 0;
8441
 
8442
          if (htab->relbrlt != NULL)
8443
            {
8444
              /* Create a reloc for the branch lookup table entry.  */
8445
              Elf_Internal_Rela rela;
8446
              bfd_byte *rl;
8447
 
8448
              rela.r_offset = (br_entry->offset
8449
                               + htab->brlt->output_offset
8450
                               + htab->brlt->output_section->vma);
8451
              rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
8452
              rela.r_addend = off;
8453
 
8454
              rl = htab->relbrlt->contents;
8455
              rl += (htab->relbrlt->reloc_count++
8456
                     * sizeof (Elf64_External_Rela));
8457
              bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
8458
            }
8459
          else if (info->emitrelocations)
8460
            {
8461
              Elf_Internal_Rela *relocs, *r;
8462
              struct bfd_elf_section_data *elfsec_data;
8463
 
8464
              elfsec_data = elf_section_data (htab->brlt);
8465
              relocs = elfsec_data->relocs;
8466
              if (relocs == NULL)
8467
                {
8468
                  bfd_size_type relsize;
8469
                  relsize = htab->brlt->reloc_count * sizeof (*relocs);
8470
                  relocs = bfd_alloc (htab->brlt->owner, relsize);
8471
                  if (relocs == NULL)
8472
                    return FALSE;
8473
                  elfsec_data->relocs = relocs;
8474
                  elfsec_data->rel_hdr.sh_size
8475
                    = (stub_entry->stub_sec->reloc_count
8476
                       * sizeof (Elf64_External_Rela));
8477
                  elfsec_data->rel_hdr.sh_entsize
8478
                    = sizeof (Elf64_External_Rela);
8479
                  htab->brlt->reloc_count = 0;
8480
                }
8481
              r = relocs + htab->brlt->reloc_count;
8482
              htab->brlt->reloc_count += 1;
8483
              r->r_offset = (br_entry->offset
8484
                             + htab->brlt->output_offset
8485
                             + htab->brlt->output_section->vma);
8486
              r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
8487
              r->r_addend = off;
8488
            }
8489
        }
8490
 
8491
      off = (br_entry->offset
8492
             + htab->brlt->output_offset
8493
             + htab->brlt->output_section->vma
8494
             - elf_gp (htab->brlt->output_section->owner)
8495
             - htab->stub_group[stub_entry->id_sec->id].toc_off);
8496
 
8497
      if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
8498
        {
8499
          (*_bfd_error_handler)
8500
            (_("linkage table error against `%s'"),
8501
             stub_entry->root.string);
8502
          bfd_set_error (bfd_error_bad_value);
8503
          htab->stub_error = TRUE;
8504
          return FALSE;
8505
        }
8506
 
8507
      indx = off;
8508
      if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
8509
        {
8510
          if (PPC_HA (indx) != 0)
8511
            {
8512
              size = 16;
8513
              bfd_put_32 (htab->stub_bfd, ADDIS_R12_R2 | PPC_HA (indx), loc);
8514
              loc += 4;
8515
              bfd_put_32 (htab->stub_bfd, LD_R11_0R12 | PPC_LO (indx), loc);
8516
            }
8517
          else
8518
            {
8519
              size = 12;
8520
              bfd_put_32 (htab->stub_bfd, LD_R11_0R2 | PPC_LO (indx), loc);
8521
            }
8522
        }
8523
      else
8524
        {
8525
          bfd_vma r2off;
8526
 
8527
          r2off = (htab->stub_group[stub_entry->target_section->id].toc_off
8528
                   - htab->stub_group[stub_entry->id_sec->id].toc_off);
8529
          bfd_put_32 (htab->stub_bfd, STD_R2_40R1, loc);
8530
          loc += 4;
8531
          size = 20;
8532
          if (PPC_HA (indx) != 0)
8533
            {
8534
              size += 4;
8535
              bfd_put_32 (htab->stub_bfd, ADDIS_R12_R2 | PPC_HA (indx), loc);
8536
              loc += 4;
8537
              bfd_put_32 (htab->stub_bfd, LD_R11_0R12 | PPC_LO (indx), loc);
8538
              loc += 4;
8539
            }
8540
          else
8541
            {
8542
              bfd_put_32 (htab->stub_bfd, LD_R11_0R2 | PPC_LO (indx), loc);
8543
              loc += 4;
8544
            }
8545
 
8546
          if (PPC_HA (r2off) != 0)
8547
            {
8548
              size += 4;
8549
              bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
8550
              loc += 4;
8551
            }
8552
          bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
8553
        }
8554
      loc += 4;
8555
      bfd_put_32 (htab->stub_bfd, MTCTR_R11, loc);
8556
      loc += 4;
8557
      bfd_put_32 (htab->stub_bfd, BCTR, loc);
8558
      break;
8559
 
8560
    case ppc_stub_plt_call:
8561
      /* Do the best we can for shared libraries built without
8562
         exporting ".foo" for each "foo".  This can happen when symbol
8563
         versioning scripts strip all bar a subset of symbols.  */
8564
      if (stub_entry->h->oh != NULL
8565
          && stub_entry->h->oh->elf.root.type != bfd_link_hash_defined
8566
          && stub_entry->h->oh->elf.root.type != bfd_link_hash_defweak)
8567
        {
8568
          /* Point the symbol at the stub.  There may be multiple stubs,
8569
             we don't really care;  The main thing is to make this sym
8570
             defined somewhere.  Maybe defining the symbol in the stub
8571
             section is a silly idea.  If we didn't do this, htab->top_id
8572
             could disappear.  */
8573
          stub_entry->h->oh->elf.root.type = bfd_link_hash_defined;
8574
          stub_entry->h->oh->elf.root.u.def.section = stub_entry->stub_sec;
8575
          stub_entry->h->oh->elf.root.u.def.value = stub_entry->stub_offset;
8576
        }
8577
 
8578
      /* Now build the stub.  */
8579
      off = (bfd_vma) -1;
8580
      for (ent = stub_entry->h->elf.plt.plist; ent != NULL; ent = ent->next)
8581
        if (ent->addend == stub_entry->addend)
8582
          {
8583
            off = ent->plt.offset;
8584
            break;
8585
          }
8586
      if (off >= (bfd_vma) -2)
8587
        abort ();
8588
 
8589
      off &= ~ (bfd_vma) 1;
8590
      off += (htab->plt->output_offset
8591
              + htab->plt->output_section->vma
8592
              - elf_gp (htab->plt->output_section->owner)
8593
              - htab->stub_group[stub_entry->id_sec->id].toc_off);
8594
 
8595
      if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
8596
        {
8597
          (*_bfd_error_handler)
8598
            (_("linkage table error against `%s'"),
8599
             stub_entry->h->elf.root.root.string);
8600
          bfd_set_error (bfd_error_bad_value);
8601
          htab->stub_error = TRUE;
8602
          return FALSE;
8603
        }
8604
 
8605
      p = build_plt_stub (htab->stub_bfd, loc, off);
8606
      size = p - loc;
8607
      break;
8608
 
8609
    default:
8610
      BFD_FAIL ();
8611
      return FALSE;
8612
    }
8613
 
8614
  stub_entry->stub_sec->size += size;
8615
 
8616
  if (htab->emit_stub_syms)
8617
    {
8618
      struct elf_link_hash_entry *h;
8619
      size_t len1, len2;
8620
      char *name;
8621
      const char *const stub_str[] = { "long_branch",
8622
                                       "long_branch_r2off",
8623
                                       "plt_branch",
8624
                                       "plt_branch_r2off",
8625
                                       "plt_call" };
8626
 
8627
      len1 = strlen (stub_str[stub_entry->stub_type - 1]);
8628
      len2 = strlen (stub_entry->root.string);
8629
      name = bfd_malloc (len1 + len2 + 2);
8630
      if (name == NULL)
8631
        return FALSE;
8632
      memcpy (name, stub_entry->root.string, 9);
8633
      memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
8634
      memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
8635
      h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
8636
      if (h == NULL)
8637
        return FALSE;
8638
      if (h->root.type == bfd_link_hash_new)
8639
        {
8640
          h->root.type = bfd_link_hash_defined;
8641
          h->root.u.def.section = stub_entry->stub_sec;
8642
          h->root.u.def.value = stub_entry->stub_offset;
8643
          h->ref_regular = 1;
8644
          h->def_regular = 1;
8645
          h->ref_regular_nonweak = 1;
8646
          h->forced_local = 1;
8647
          h->non_elf = 0;
8648
        }
8649
    }
8650
 
8651
  return TRUE;
8652
}
8653
 
8654
/* As above, but don't actually build the stub.  Just bump offset so
8655
   we know stub section sizes, and select plt_branch stubs where
8656
   long_branch stubs won't do.  */
8657
 
8658
static bfd_boolean
8659
ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
8660
{
8661
  struct ppc_stub_hash_entry *stub_entry;
8662
  struct bfd_link_info *info;
8663
  struct ppc_link_hash_table *htab;
8664
  bfd_vma off;
8665
  int size;
8666
 
8667
  /* Massage our args to the form they really have.  */
8668
  stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
8669
  info = in_arg;
8670
 
8671
  htab = ppc_hash_table (info);
8672
 
8673
  if (stub_entry->stub_type == ppc_stub_plt_call)
8674
    {
8675
      struct plt_entry *ent;
8676
      off = (bfd_vma) -1;
8677
      for (ent = stub_entry->h->elf.plt.plist; ent != NULL; ent = ent->next)
8678
        if (ent->addend == stub_entry->addend)
8679
          {
8680
            off = ent->plt.offset & ~(bfd_vma) 1;
8681
            break;
8682
          }
8683
      if (off >= (bfd_vma) -2)
8684
        abort ();
8685
      off += (htab->plt->output_offset
8686
              + htab->plt->output_section->vma
8687
              - elf_gp (htab->plt->output_section->owner)
8688
              - htab->stub_group[stub_entry->id_sec->id].toc_off);
8689
 
8690
      size = PLT_CALL_STUB_SIZE;
8691
      if (PPC_HA (off) == 0)
8692
        size -= 4;
8693
      if (PPC_HA (off + 16) != PPC_HA (off))
8694
        size += 4;
8695
    }
8696
  else
8697
    {
8698
      /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
8699
         variants.  */
8700
      bfd_vma r2off = 0;
8701
 
8702
      off = (stub_entry->target_value
8703
             + stub_entry->target_section->output_offset
8704
             + stub_entry->target_section->output_section->vma);
8705
      off -= (stub_entry->stub_sec->size
8706
              + stub_entry->stub_sec->output_offset
8707
              + stub_entry->stub_sec->output_section->vma);
8708
 
8709
      /* Reset the stub type from the plt variant in case we now
8710
         can reach with a shorter stub.  */
8711
      if (stub_entry->stub_type >= ppc_stub_plt_branch)
8712
        stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
8713
 
8714
      size = 4;
8715
      if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
8716
        {
8717
          r2off = (htab->stub_group[stub_entry->target_section->id].toc_off
8718
                   - htab->stub_group[stub_entry->id_sec->id].toc_off);
8719
          size = 12;
8720
          if (PPC_HA (r2off) != 0)
8721
            size = 16;
8722
          off -= size - 4;
8723
        }
8724
 
8725
      /* If the branch offset if too big, use a ppc_stub_plt_branch.  */
8726
      if (off + (1 << 25) >= (bfd_vma) (1 << 26))
8727
        {
8728
          struct ppc_branch_hash_entry *br_entry;
8729
          unsigned int indx;
8730
 
8731
          br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
8732
                                             stub_entry->root.string + 9,
8733
                                             TRUE, FALSE);
8734
          if (br_entry == NULL)
8735
            {
8736
              (*_bfd_error_handler) (_("can't build branch stub `%s'"),
8737
                                     stub_entry->root.string);
8738
              htab->stub_error = TRUE;
8739
              return FALSE;
8740
            }
8741
 
8742
          if (br_entry->iter != htab->stub_iteration)
8743
            {
8744
              br_entry->iter = htab->stub_iteration;
8745
              br_entry->offset = htab->brlt->size;
8746
              htab->brlt->size += 8;
8747
 
8748
              if (htab->relbrlt != NULL)
8749
                htab->relbrlt->size += sizeof (Elf64_External_Rela);
8750
              else if (info->emitrelocations)
8751
                {
8752
                  htab->brlt->reloc_count += 1;
8753
                  htab->brlt->flags |= SEC_RELOC;
8754
                }
8755
            }
8756
 
8757
          stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
8758
          off = (br_entry->offset
8759
                 + htab->brlt->output_offset
8760
                 + htab->brlt->output_section->vma
8761
                 - elf_gp (htab->brlt->output_section->owner)
8762
                 - htab->stub_group[stub_entry->id_sec->id].toc_off);
8763
 
8764
          indx = off;
8765
          if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
8766
            {
8767
              size = 12;
8768
              if (PPC_HA (indx) != 0)
8769
                size = 16;
8770
            }
8771
          else
8772
            {
8773
              size = 20;
8774
              if (PPC_HA (indx) != 0)
8775
                size += 4;
8776
 
8777
              if (PPC_HA (r2off) != 0)
8778
                size += 4;
8779
            }
8780
        }
8781
      else if (info->emitrelocations)
8782
        {
8783
          stub_entry->stub_sec->reloc_count += 1;
8784
          stub_entry->stub_sec->flags |= SEC_RELOC;
8785
        }
8786
    }
8787
 
8788
  stub_entry->stub_sec->size += size;
8789
  return TRUE;
8790
}
8791
 
8792
/* Set up various things so that we can make a list of input sections
8793
   for each output section included in the link.  Returns -1 on error,
8794
 
8795
 
8796
int
8797
ppc64_elf_setup_section_lists (bfd *output_bfd,
8798
                               struct bfd_link_info *info,
8799
                               int no_multi_toc)
8800
{
8801
  bfd *input_bfd;
8802
  int top_id, top_index, id;
8803
  asection *section;
8804
  asection **input_list;
8805
  bfd_size_type amt;
8806
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
8807
 
8808
  htab->no_multi_toc = no_multi_toc;
8809
 
8810
  if (htab->brlt == NULL)
8811
    return 0;
8812
 
8813
  /* Find the top input section id.  */
8814
  for (input_bfd = info->input_bfds, top_id = 3;
8815
       input_bfd != NULL;
8816
       input_bfd = input_bfd->link_next)
8817
    {
8818
      for (section = input_bfd->sections;
8819
           section != NULL;
8820
           section = section->next)
8821
        {
8822
          if (top_id < section->id)
8823
            top_id = section->id;
8824
        }
8825
    }
8826
 
8827
  htab->top_id = top_id;
8828
  amt = sizeof (struct map_stub) * (top_id + 1);
8829
  htab->stub_group = bfd_zmalloc (amt);
8830
  if (htab->stub_group == NULL)
8831
    return -1;
8832
 
8833
  /* Set toc_off for com, und, abs and ind sections.  */
8834
  for (id = 0; id < 3; id++)
8835
    htab->stub_group[id].toc_off = TOC_BASE_OFF;
8836
 
8837
  elf_gp (output_bfd) = htab->toc_curr = ppc64_elf_toc (output_bfd);
8838
 
8839
  /* We can't use output_bfd->section_count here to find the top output
8840
     section index as some sections may have been removed, and
8841
     strip_excluded_output_sections doesn't renumber the indices.  */
8842
  for (section = output_bfd->sections, top_index = 0;
8843
       section != NULL;
8844
       section = section->next)
8845
    {
8846
      if (top_index < section->index)
8847
        top_index = section->index;
8848
    }
8849
 
8850
  htab->top_index = top_index;
8851
  amt = sizeof (asection *) * (top_index + 1);
8852
  input_list = bfd_zmalloc (amt);
8853
  htab->input_list = input_list;
8854
  if (input_list == NULL)
8855
    return -1;
8856
 
8857
  return 1;
8858
}
8859
 
8860
/* The linker repeatedly calls this function for each TOC input section
8861
   and linker generated GOT section.  Group input bfds such that the toc
8862
   within a group is less than 64k in size.  Will break with cute linker
8863
   scripts that play games with dot in the output toc section.  */
8864
 
8865
void
8866
ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
8867
{
8868
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
8869
 
8870
  if (!htab->no_multi_toc)
8871
    {
8872
      bfd_vma addr = isec->output_offset + isec->output_section->vma;
8873
      bfd_vma off = addr - htab->toc_curr;
8874
 
8875
      if (off + isec->size > 0x10000)
8876
        htab->toc_curr = addr;
8877
 
8878
      elf_gp (isec->owner) = (htab->toc_curr
8879
                              - elf_gp (isec->output_section->owner)
8880
                              + TOC_BASE_OFF);
8881
    }
8882
}
8883
 
8884
/* Called after the last call to the above function.  */
8885
 
8886
void
8887
ppc64_elf_reinit_toc (bfd *output_bfd, struct bfd_link_info *info)
8888
{
8889
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
8890
 
8891
  htab->multi_toc_needed = htab->toc_curr != elf_gp (output_bfd);
8892
 
8893
  /* toc_curr tracks the TOC offset used for code sections below in
8894
     ppc64_elf_next_input_section.  Start off at 0x8000.  */
8895
  htab->toc_curr = TOC_BASE_OFF;
8896
}
8897
 
8898
/* No toc references were found in ISEC.  If the code in ISEC makes no
8899
   calls, then there's no need to use toc adjusting stubs when branching
8900
   into ISEC.  Actually, indirect calls from ISEC are OK as they will
8901
   load r2.  Returns -1 on error, 0 for no stub needed, 1 for stub
8902
   needed, and 2 if a cyclical call-graph was found but no other reason
8903
   for a stub was detected.  If called from the top level, a return of
8904
   2 means the same as a return of 0.  */
8905
 
8906
static int
8907
toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
8908
{
8909
  Elf_Internal_Rela *relstart, *rel;
8910
  Elf_Internal_Sym *local_syms;
8911
  int ret;
8912
  struct ppc_link_hash_table *htab;
8913
 
8914
  /* We know none of our code bearing sections will need toc stubs.  */
8915
  if ((isec->flags & SEC_LINKER_CREATED) != 0)
8916
    return 0;
8917
 
8918
  if (isec->size == 0)
8919
    return 0;
8920
 
8921
  if (isec->output_section == NULL)
8922
    return 0;
8923
 
8924
  if (isec->reloc_count == 0)
8925
    return 0;
8926
 
8927
  relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
8928
                                        info->keep_memory);
8929
  if (relstart == NULL)
8930
    return -1;
8931
 
8932
  /* Look for branches to outside of this section.  */
8933
  local_syms = NULL;
8934
  ret = 0;
8935
  htab = ppc_hash_table (info);
8936
  for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
8937
    {
8938
      enum elf_ppc64_reloc_type r_type;
8939
      unsigned long r_symndx;
8940
      struct elf_link_hash_entry *h;
8941
      Elf_Internal_Sym *sym;
8942
      asection *sym_sec;
8943
      struct _opd_sec_data *opd;
8944
      bfd_vma sym_value;
8945
      bfd_vma dest;
8946
 
8947
      r_type = ELF64_R_TYPE (rel->r_info);
8948
      if (r_type != R_PPC64_REL24
8949
          && r_type != R_PPC64_REL14
8950
          && r_type != R_PPC64_REL14_BRTAKEN
8951
          && r_type != R_PPC64_REL14_BRNTAKEN)
8952
        continue;
8953
 
8954
      r_symndx = ELF64_R_SYM (rel->r_info);
8955
      if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
8956
                      isec->owner))
8957
        {
8958
          ret = -1;
8959
          break;
8960
        }
8961
 
8962
      /* Calls to dynamic lib functions go through a plt call stub
8963
         that uses r2.  Branches to undefined symbols might be a call
8964
         using old-style dot symbols that can be satisfied by a plt
8965
         call into a new-style dynamic library.  */
8966
      if (sym_sec == NULL)
8967
        {
8968
          struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
8969
          if (eh != NULL
8970
              && eh->oh != NULL
8971
              && eh->oh->elf.plt.plist != NULL)
8972
            {
8973
              ret = 1;
8974
              break;
8975
            }
8976
 
8977
          /* Ignore other undefined symbols.  */
8978
          continue;
8979
        }
8980
 
8981
      /* Assume branches to other sections not included in the link need
8982
         stubs too, to cover -R and absolute syms.  */
8983
      if (sym_sec->output_section == NULL)
8984
        {
8985
          ret = 1;
8986
          break;
8987
        }
8988
 
8989
      if (h == NULL)
8990
        sym_value = sym->st_value;
8991
      else
8992
        {
8993
          if (h->root.type != bfd_link_hash_defined
8994
              && h->root.type != bfd_link_hash_defweak)
8995
            abort ();
8996
          sym_value = h->root.u.def.value;
8997
        }
8998
      sym_value += rel->r_addend;
8999
 
9000
      /* If this branch reloc uses an opd sym, find the code section.  */
9001
      opd = get_opd_info (sym_sec);
9002
      if (opd != NULL)
9003
        {
9004
          if (h == NULL && opd->adjust != NULL)
9005
            {
9006
              long adjust;
9007
 
9008
              adjust = opd->adjust[sym->st_value / 8];
9009
              if (adjust == -1)
9010
                /* Assume deleted functions won't ever be called.  */
9011
                continue;
9012
              sym_value += adjust;
9013
            }
9014
 
9015
          dest = opd_entry_value (sym_sec, sym_value, &sym_sec, NULL);
9016
          if (dest == (bfd_vma) -1)
9017
            continue;
9018
        }
9019
      else
9020
        dest = (sym_value
9021
                + sym_sec->output_offset
9022
                + sym_sec->output_section->vma);
9023
 
9024
      /* Ignore branch to self.  */
9025
      if (sym_sec == isec)
9026
        continue;
9027
 
9028
      /* If the called function uses the toc, we need a stub.  */
9029
      if (sym_sec->has_toc_reloc
9030
          || sym_sec->makes_toc_func_call)
9031
        {
9032
          ret = 1;
9033
          break;
9034
        }
9035
 
9036
      /* Assume any branch that needs a long branch stub might in fact
9037
         need a plt_branch stub.  A plt_branch stub uses r2.  */
9038
      else if (dest - (isec->output_offset
9039
                       + isec->output_section->vma
9040
                       + rel->r_offset) + (1 << 25) >= (2 << 25))
9041
        {
9042
          ret = 1;
9043
          break;
9044
        }
9045
 
9046
      /* If calling back to a section in the process of being tested, we
9047
         can't say for sure that no toc adjusting stubs are needed, so
9048
         don't return zero.  */
9049
      else if (sym_sec->call_check_in_progress)
9050
        ret = 2;
9051
 
9052
      /* Branches to another section that itself doesn't have any TOC
9053
         references are OK.  Recursively call ourselves to check.  */
9054
      else if (sym_sec->id <= htab->top_id
9055
               && htab->stub_group[sym_sec->id].toc_off == 0)
9056
        {
9057
          int recur;
9058
 
9059
          /* Mark current section as indeterminate, so that other
9060
             sections that call back to current won't be marked as
9061
             known.  */
9062
          isec->call_check_in_progress = 1;
9063
          recur = toc_adjusting_stub_needed (info, sym_sec);
9064
          isec->call_check_in_progress = 0;
9065
 
9066
          if (recur < 0)
9067
            {
9068
              /* An error.  Exit.  */
9069
              ret = -1;
9070
              break;
9071
            }
9072
          else if (recur <= 1)
9073
            {
9074
              /* Known result.  Mark as checked and set section flag.  */
9075
              htab->stub_group[sym_sec->id].toc_off = 1;
9076
              if (recur != 0)
9077
                {
9078
                  sym_sec->makes_toc_func_call = 1;
9079
                  ret = 1;
9080
                  break;
9081
                }
9082
            }
9083
          else
9084
            {
9085
              /* Unknown result.  Continue checking.  */
9086
              ret = 2;
9087
            }
9088
        }
9089
    }
9090
 
9091
  if (local_syms != NULL
9092
      && (elf_symtab_hdr (isec->owner).contents != (unsigned char *) local_syms))
9093
    free (local_syms);
9094
  if (elf_section_data (isec)->relocs != relstart)
9095
    free (relstart);
9096
 
9097
  return ret;
9098
}
9099
 
9100
/* The linker repeatedly calls this function for each input section,
9101
   in the order that input sections are linked into output sections.
9102
   Build lists of input sections to determine groupings between which
9103
   we may insert linker stubs.  */
9104
 
9105
bfd_boolean
9106
ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
9107
{
9108
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
9109
 
9110
  if ((isec->output_section->flags & SEC_CODE) != 0
9111
      && isec->output_section->index <= htab->top_index)
9112
    {
9113
      asection **list = htab->input_list + isec->output_section->index;
9114
      /* Steal the link_sec pointer for our list.  */
9115
#define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
9116
      /* This happens to make the list in reverse order,
9117
         which is what we want.  */
9118
      PREV_SEC (isec) = *list;
9119
      *list = isec;
9120
    }
9121
 
9122
  if (htab->multi_toc_needed)
9123
    {
9124
      /* If a code section has a function that uses the TOC then we need
9125
         to use the right TOC (obviously).  Also, make sure that .opd gets
9126
         the correct TOC value for R_PPC64_TOC relocs that don't have or
9127
         can't find their function symbol (shouldn't ever happen now).
9128
         Also specially treat .fixup for the linux kernel.  .fixup
9129
         contains branches, but only back to the function that hit an
9130
         exception.  */
9131
      if (isec->has_toc_reloc
9132
          || (isec->flags & SEC_CODE) == 0
9133
          || strcmp (isec->name, ".fixup") == 0)
9134
        {
9135
          if (elf_gp (isec->owner) != 0)
9136
            htab->toc_curr = elf_gp (isec->owner);
9137
        }
9138
      else if (htab->stub_group[isec->id].toc_off == 0)
9139
        {
9140
          int ret = toc_adjusting_stub_needed (info, isec);
9141
          if (ret < 0)
9142
            return FALSE;
9143
          else
9144
            isec->makes_toc_func_call = ret & 1;
9145
        }
9146
    }
9147
 
9148
  /* Functions that don't use the TOC can belong in any TOC group.
9149
     Use the last TOC base.  This happens to make _init and _fini
9150
     pasting work.  */
9151
  htab->stub_group[isec->id].toc_off = htab->toc_curr;
9152
  return TRUE;
9153
}
9154
 
9155
/* See whether we can group stub sections together.  Grouping stub
9156
   sections may result in fewer stubs.  More importantly, we need to
9157
   put all .init* and .fini* stubs at the beginning of the .init or
9158
   .fini output sections respectively, because glibc splits the
9159
   _init and _fini functions into multiple parts.  Putting a stub in
9160
   the middle of a function is not a good idea.  */
9161
 
9162
static void
9163
group_sections (struct ppc_link_hash_table *htab,
9164
                bfd_size_type stub_group_size,
9165
                bfd_boolean stubs_always_before_branch)
9166
{
9167
  asection **list;
9168
  bfd_size_type stub14_group_size;
9169
  bfd_boolean suppress_size_errors;
9170
 
9171
  suppress_size_errors = FALSE;
9172
  stub14_group_size = stub_group_size;
9173
  if (stub_group_size == 1)
9174
    {
9175
      /* Default values.  */
9176
      if (stubs_always_before_branch)
9177
        {
9178
          stub_group_size = 0x1e00000;
9179
          stub14_group_size = 0x7800;
9180
        }
9181
      else
9182
        {
9183
          stub_group_size = 0x1c00000;
9184
          stub14_group_size = 0x7000;
9185
        }
9186
      suppress_size_errors = TRUE;
9187
    }
9188
 
9189
  list = htab->input_list + htab->top_index;
9190
  do
9191
    {
9192
      asection *tail = *list;
9193
      while (tail != NULL)
9194
        {
9195
          asection *curr;
9196
          asection *prev;
9197
          bfd_size_type total;
9198
          bfd_boolean big_sec;
9199
          bfd_vma curr_toc;
9200
 
9201
          curr = tail;
9202
          total = tail->size;
9203
          big_sec = total > (ppc64_elf_section_data (tail)->has_14bit_branch
9204
                             ? stub14_group_size : stub_group_size);
9205
          if (big_sec && !suppress_size_errors)
9206
            (*_bfd_error_handler) (_("%B section %A exceeds stub group size"),
9207
                                     tail->owner, tail);
9208
          curr_toc = htab->stub_group[tail->id].toc_off;
9209
 
9210
          while ((prev = PREV_SEC (curr)) != NULL
9211
                 && ((total += curr->output_offset - prev->output_offset)
9212
                     < (ppc64_elf_section_data (prev)->has_14bit_branch
9213
                        ? stub14_group_size : stub_group_size))
9214
                 && htab->stub_group[prev->id].toc_off == curr_toc)
9215
            curr = prev;
9216
 
9217
          /* OK, the size from the start of CURR to the end is less
9218
             than stub_group_size and thus can be handled by one stub
9219
             section.  (or the tail section is itself larger than
9220
             stub_group_size, in which case we may be toast.)  We
9221
             should really be keeping track of the total size of stubs
9222
             added here, as stubs contribute to the final output
9223
             section size.  That's a little tricky, and this way will
9224
             only break if stubs added make the total size more than
9225
             2^25, ie. for the default stub_group_size, if stubs total
9226
             more than 2097152 bytes, or nearly 75000 plt call stubs.  */
9227
          do
9228
            {
9229
              prev = PREV_SEC (tail);
9230
              /* Set up this stub group.  */
9231
              htab->stub_group[tail->id].link_sec = curr;
9232
            }
9233
          while (tail != curr && (tail = prev) != NULL);
9234
 
9235
          /* But wait, there's more!  Input sections up to stub_group_size
9236
             bytes before the stub section can be handled by it too.
9237
             Don't do this if we have a really large section after the
9238
             stubs, as adding more stubs increases the chance that
9239
             branches may not reach into the stub section.  */
9240
          if (!stubs_always_before_branch && !big_sec)
9241
            {
9242
              total = 0;
9243
              while (prev != NULL
9244
                     && ((total += tail->output_offset - prev->output_offset)
9245
                         < (ppc64_elf_section_data (prev)->has_14bit_branch
9246
                            ? stub14_group_size : stub_group_size))
9247
                     && htab->stub_group[prev->id].toc_off == curr_toc)
9248
                {
9249
                  tail = prev;
9250
                  prev = PREV_SEC (tail);
9251
                  htab->stub_group[tail->id].link_sec = curr;
9252
                }
9253
            }
9254
          tail = prev;
9255
        }
9256
    }
9257
  while (list-- != htab->input_list);
9258
  free (htab->input_list);
9259
#undef PREV_SEC
9260
}
9261
 
9262
/* Determine and set the size of the stub section for a final link.
9263
 
9264
   The basic idea here is to examine all the relocations looking for
9265
   PC-relative calls to a target that is unreachable with a "bl"
9266
   instruction.  */
9267
 
9268
bfd_boolean
9269
ppc64_elf_size_stubs (bfd *output_bfd,
9270
                      struct bfd_link_info *info,
9271
                      bfd_signed_vma group_size,
9272
                      asection *(*add_stub_section) (const char *, asection *),
9273
                      void (*layout_sections_again) (void))
9274
{
9275
  bfd_size_type stub_group_size;
9276
  bfd_boolean stubs_always_before_branch;
9277
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
9278
 
9279
  /* Stash our params away.  */
9280
  htab->add_stub_section = add_stub_section;
9281
  htab->layout_sections_again = layout_sections_again;
9282
  stubs_always_before_branch = group_size < 0;
9283
  if (group_size < 0)
9284
    stub_group_size = -group_size;
9285
  else
9286
    stub_group_size = group_size;
9287
 
9288
  group_sections (htab, stub_group_size, stubs_always_before_branch);
9289
 
9290
  while (1)
9291
    {
9292
      bfd *input_bfd;
9293
      unsigned int bfd_indx;
9294
      asection *stub_sec;
9295
 
9296
      htab->stub_iteration += 1;
9297
 
9298
      for (input_bfd = info->input_bfds, bfd_indx = 0;
9299
           input_bfd != NULL;
9300
           input_bfd = input_bfd->link_next, bfd_indx++)
9301
        {
9302
          Elf_Internal_Shdr *symtab_hdr;
9303
          asection *section;
9304
          Elf_Internal_Sym *local_syms = NULL;
9305
 
9306
          if (!is_ppc64_elf (input_bfd))
9307
            continue;
9308
 
9309
          /* We'll need the symbol table in a second.  */
9310
          symtab_hdr = &elf_symtab_hdr (input_bfd);
9311
          if (symtab_hdr->sh_info == 0)
9312
            continue;
9313
 
9314
          /* Walk over each section attached to the input bfd.  */
9315
          for (section = input_bfd->sections;
9316
               section != NULL;
9317
               section = section->next)
9318
            {
9319
              Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
9320
 
9321
              /* If there aren't any relocs, then there's nothing more
9322
                 to do.  */
9323
              if ((section->flags & SEC_RELOC) == 0
9324
                  || (section->flags & SEC_ALLOC) == 0
9325
                  || (section->flags & SEC_LOAD) == 0
9326
                  || (section->flags & SEC_CODE) == 0
9327
                  || section->reloc_count == 0)
9328
                continue;
9329
 
9330
              /* If this section is a link-once section that will be
9331
                 discarded, then don't create any stubs.  */
9332
              if (section->output_section == NULL
9333
                  || section->output_section->owner != output_bfd)
9334
                continue;
9335
 
9336
              /* Get the relocs.  */
9337
              internal_relocs
9338
                = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
9339
                                             info->keep_memory);
9340
              if (internal_relocs == NULL)
9341
                goto error_ret_free_local;
9342
 
9343
              /* Now examine each relocation.  */
9344
              irela = internal_relocs;
9345
              irelaend = irela + section->reloc_count;
9346
              for (; irela < irelaend; irela++)
9347
                {
9348
                  enum elf_ppc64_reloc_type r_type;
9349
                  unsigned int r_indx;
9350
                  enum ppc_stub_type stub_type;
9351
                  struct ppc_stub_hash_entry *stub_entry;
9352
                  asection *sym_sec, *code_sec;
9353
                  bfd_vma sym_value;
9354
                  bfd_vma destination;
9355
                  bfd_boolean ok_dest;
9356
                  struct ppc_link_hash_entry *hash;
9357
                  struct ppc_link_hash_entry *fdh;
9358
                  struct elf_link_hash_entry *h;
9359
                  Elf_Internal_Sym *sym;
9360
                  char *stub_name;
9361
                  const asection *id_sec;
9362
                  struct _opd_sec_data *opd;
9363
 
9364
                  r_type = ELF64_R_TYPE (irela->r_info);
9365
                  r_indx = ELF64_R_SYM (irela->r_info);
9366
 
9367
                  if (r_type >= R_PPC64_max)
9368
                    {
9369
                      bfd_set_error (bfd_error_bad_value);
9370
                      goto error_ret_free_internal;
9371
                    }
9372
 
9373
                  /* Only look for stubs on branch instructions.  */
9374
                  if (r_type != R_PPC64_REL24
9375
                      && r_type != R_PPC64_REL14
9376
                      && r_type != R_PPC64_REL14_BRTAKEN
9377
                      && r_type != R_PPC64_REL14_BRNTAKEN)
9378
                    continue;
9379
 
9380
                  /* Now determine the call target, its name, value,
9381
                     section.  */
9382
                  if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9383
                                  r_indx, input_bfd))
9384
                    goto error_ret_free_internal;
9385
                  hash = (struct ppc_link_hash_entry *) h;
9386
 
9387
                  ok_dest = FALSE;
9388
                  fdh = NULL;
9389
                  sym_value = 0;
9390
                  if (hash == NULL)
9391
                    {
9392
                      sym_value = sym->st_value;
9393
                      ok_dest = TRUE;
9394
                    }
9395
                  else if (hash->elf.root.type == bfd_link_hash_defined
9396
                           || hash->elf.root.type == bfd_link_hash_defweak)
9397
                    {
9398
                      sym_value = hash->elf.root.u.def.value;
9399
                      if (sym_sec->output_section != NULL)
9400
                        ok_dest = TRUE;
9401
                    }
9402
                  else if (hash->elf.root.type == bfd_link_hash_undefweak
9403
                           || hash->elf.root.type == bfd_link_hash_undefined)
9404
                    {
9405
                      /* Recognise an old ABI func code entry sym, and
9406
                         use the func descriptor sym instead if it is
9407
                         defined.  */
9408
                      if (hash->elf.root.root.string[0] == '.'
9409
                          && (fdh = get_fdh (hash, htab)) != NULL)
9410
                        {
9411
                          if (fdh->elf.root.type == bfd_link_hash_defined
9412
                              || fdh->elf.root.type == bfd_link_hash_defweak)
9413
                            {
9414
                              sym_sec = fdh->elf.root.u.def.section;
9415
                              sym_value = fdh->elf.root.u.def.value;
9416
                              if (sym_sec->output_section != NULL)
9417
                                ok_dest = TRUE;
9418
                            }
9419
                          else
9420
                            fdh = NULL;
9421
                        }
9422
                    }
9423
                  else
9424
                    {
9425
                      bfd_set_error (bfd_error_bad_value);
9426
                      goto error_ret_free_internal;
9427
                    }
9428
 
9429
                  destination = 0;
9430
                  if (ok_dest)
9431
                    {
9432
                      sym_value += irela->r_addend;
9433
                      destination = (sym_value
9434
                                     + sym_sec->output_offset
9435
                                     + sym_sec->output_section->vma);
9436
                    }
9437
 
9438
                  code_sec = sym_sec;
9439
                  opd = get_opd_info (sym_sec);
9440
                  if (opd != NULL)
9441
                    {
9442
                      bfd_vma dest;
9443
 
9444
                      if (hash == NULL && opd->adjust != NULL)
9445
                        {
9446
                          long adjust = opd->adjust[sym_value / 8];
9447
                          if (adjust == -1)
9448
                            continue;
9449
                          sym_value += adjust;
9450
                        }
9451
                      dest = opd_entry_value (sym_sec, sym_value,
9452
                                              &code_sec, &sym_value);
9453
                      if (dest != (bfd_vma) -1)
9454
                        {
9455
                          destination = dest;
9456
                          if (fdh != NULL)
9457
                            {
9458
                              /* Fixup old ABI sym to point at code
9459
                                 entry.  */
9460
                              hash->elf.root.type = bfd_link_hash_defweak;
9461
                              hash->elf.root.u.def.section = code_sec;
9462
                              hash->elf.root.u.def.value = sym_value;
9463
                            }
9464
                        }
9465
                    }
9466
 
9467
                  /* Determine what (if any) linker stub is needed.  */
9468
                  stub_type = ppc_type_of_stub (section, irela, &hash,
9469
                                                destination);
9470
 
9471
                  if (stub_type != ppc_stub_plt_call)
9472
                    {
9473
                      /* Check whether we need a TOC adjusting stub.
9474
                         Since the linker pastes together pieces from
9475
                         different object files when creating the
9476
                         _init and _fini functions, it may be that a
9477
                         call to what looks like a local sym is in
9478
                         fact a call needing a TOC adjustment.  */
9479
                      if (code_sec != NULL
9480
                          && code_sec->output_section != NULL
9481
                          && (htab->stub_group[code_sec->id].toc_off
9482
                              != htab->stub_group[section->id].toc_off)
9483
                          && (code_sec->has_toc_reloc
9484
                              || code_sec->makes_toc_func_call))
9485
                        stub_type = ppc_stub_long_branch_r2off;
9486
                    }
9487
 
9488
                  if (stub_type == ppc_stub_none)
9489
                    continue;
9490
 
9491
                  /* __tls_get_addr calls might be eliminated.  */
9492
                  if (stub_type != ppc_stub_plt_call
9493
                      && hash != NULL
9494
                      && (hash == htab->tls_get_addr
9495
                          || hash == htab->tls_get_addr_fd)
9496
                      && section->has_tls_reloc
9497
                      && irela != internal_relocs)
9498
                    {
9499
                      /* Get tls info.  */
9500
                      char *tls_mask;
9501
 
9502
                      if (!get_tls_mask (&tls_mask, NULL, &local_syms,
9503
                                         irela - 1, input_bfd))
9504
                        goto error_ret_free_internal;
9505
                      if (*tls_mask != 0)
9506
                        continue;
9507
                    }
9508
 
9509
                  /* Support for grouping stub sections.  */
9510
                  id_sec = htab->stub_group[section->id].link_sec;
9511
 
9512
                  /* Get the name of this stub.  */
9513
                  stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
9514
                  if (!stub_name)
9515
                    goto error_ret_free_internal;
9516
 
9517
                  stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
9518
                                                     stub_name, FALSE, FALSE);
9519
                  if (stub_entry != NULL)
9520
                    {
9521
                      /* The proper stub has already been created.  */
9522
                      free (stub_name);
9523
                      continue;
9524
                    }
9525
 
9526
                  stub_entry = ppc_add_stub (stub_name, section, htab);
9527
                  if (stub_entry == NULL)
9528
                    {
9529
                      free (stub_name);
9530
                    error_ret_free_internal:
9531
                      if (elf_section_data (section)->relocs == NULL)
9532
                        free (internal_relocs);
9533
                    error_ret_free_local:
9534
                      if (local_syms != NULL
9535
                          && (symtab_hdr->contents
9536
                              != (unsigned char *) local_syms))
9537
                        free (local_syms);
9538
                      return FALSE;
9539
                    }
9540
 
9541
                  stub_entry->stub_type = stub_type;
9542
                  stub_entry->target_value = sym_value;
9543
                  stub_entry->target_section = code_sec;
9544
                  stub_entry->h = hash;
9545
                  stub_entry->addend = irela->r_addend;
9546
 
9547
                  if (stub_entry->h != NULL)
9548
                    htab->stub_globals += 1;
9549
                }
9550
 
9551
              /* We're done with the internal relocs, free them.  */
9552
              if (elf_section_data (section)->relocs != internal_relocs)
9553
                free (internal_relocs);
9554
            }
9555
 
9556
          if (local_syms != NULL
9557
              && symtab_hdr->contents != (unsigned char *) local_syms)
9558
            {
9559
              if (!info->keep_memory)
9560
                free (local_syms);
9561
              else
9562
                symtab_hdr->contents = (unsigned char *) local_syms;
9563
            }
9564
        }
9565
 
9566
      /* We may have added some stubs.  Find out the new size of the
9567
         stub sections.  */
9568
      for (stub_sec = htab->stub_bfd->sections;
9569
           stub_sec != NULL;
9570
           stub_sec = stub_sec->next)
9571
        if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
9572
          {
9573
            stub_sec->rawsize = stub_sec->size;
9574
            stub_sec->size = 0;
9575
            stub_sec->reloc_count = 0;
9576
            stub_sec->flags &= ~SEC_RELOC;
9577
          }
9578
 
9579
      htab->brlt->size = 0;
9580
      htab->brlt->reloc_count = 0;
9581
      htab->brlt->flags &= ~SEC_RELOC;
9582
      if (htab->relbrlt != NULL)
9583
        htab->relbrlt->size = 0;
9584
 
9585
      bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
9586
 
9587
      for (stub_sec = htab->stub_bfd->sections;
9588
           stub_sec != NULL;
9589
           stub_sec = stub_sec->next)
9590
        if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
9591
            && stub_sec->rawsize != stub_sec->size)
9592
          break;
9593
 
9594
      /* Exit from this loop when no stubs have been added, and no stubs
9595
         have changed size.  */
9596
      if (stub_sec == NULL)
9597
        break;
9598
 
9599
      /* Ask the linker to do its stuff.  */
9600
      (*htab->layout_sections_again) ();
9601
    }
9602
 
9603
  /* It would be nice to strip htab->brlt from the output if the
9604
     section is empty, but it's too late.  If we strip sections here,
9605
     the dynamic symbol table is corrupted since the section symbol
9606
     for the stripped section isn't written.  */
9607
 
9608
  return TRUE;
9609
}
9610
 
9611
/* Called after we have determined section placement.  If sections
9612
   move, we'll be called again.  Provide a value for TOCstart.  */
9613
 
9614
bfd_vma
9615
ppc64_elf_toc (bfd *obfd)
9616
{
9617
  asection *s;
9618
  bfd_vma TOCstart;
9619
 
9620
  /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
9621
     order.  The TOC starts where the first of these sections starts.  */
9622
  s = bfd_get_section_by_name (obfd, ".got");
9623
  if (s == NULL)
9624
    s = bfd_get_section_by_name (obfd, ".toc");
9625
  if (s == NULL)
9626
    s = bfd_get_section_by_name (obfd, ".tocbss");
9627
  if (s == NULL)
9628
    s = bfd_get_section_by_name (obfd, ".plt");
9629
  if (s == NULL)
9630
    {
9631
      /* This may happen for
9632
         o  references to TOC base (SYM@toc / TOC[tc0]) without a
9633
         .toc directive
9634
         o  bad linker script
9635
         o --gc-sections and empty TOC sections
9636
 
9637
         FIXME: Warn user?  */
9638
 
9639
      /* Look for a likely section.  We probably won't even be
9640
         using TOCstart.  */
9641
      for (s = obfd->sections; s != NULL; s = s->next)
9642
        if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY))
9643
            == (SEC_ALLOC | SEC_SMALL_DATA))
9644
          break;
9645
      if (s == NULL)
9646
        for (s = obfd->sections; s != NULL; s = s->next)
9647
          if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA))
9648
              == (SEC_ALLOC | SEC_SMALL_DATA))
9649
            break;
9650
      if (s == NULL)
9651
        for (s = obfd->sections; s != NULL; s = s->next)
9652
          if ((s->flags & (SEC_ALLOC | SEC_READONLY)) == SEC_ALLOC)
9653
            break;
9654
      if (s == NULL)
9655
        for (s = obfd->sections; s != NULL; s = s->next)
9656
          if ((s->flags & SEC_ALLOC) == SEC_ALLOC)
9657
            break;
9658
    }
9659
 
9660
  TOCstart = 0;
9661
  if (s != NULL)
9662
    TOCstart = s->output_section->vma + s->output_offset;
9663
 
9664
  return TOCstart;
9665
}
9666
 
9667
/* Build all the stubs associated with the current output file.
9668
   The stubs are kept in a hash table attached to the main linker
9669
   hash table.  This function is called via gldelf64ppc_finish.  */
9670
 
9671
bfd_boolean
9672
ppc64_elf_build_stubs (bfd_boolean emit_stub_syms,
9673
                       struct bfd_link_info *info,
9674
                       char **stats)
9675
{
9676
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
9677
  asection *stub_sec;
9678
  bfd_byte *p;
9679
  int stub_sec_count = 0;
9680
 
9681
  htab->emit_stub_syms = emit_stub_syms;
9682
 
9683
  /* Allocate memory to hold the linker stubs.  */
9684
  for (stub_sec = htab->stub_bfd->sections;
9685
       stub_sec != NULL;
9686
       stub_sec = stub_sec->next)
9687
    if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
9688
        && stub_sec->size != 0)
9689
      {
9690
        stub_sec->contents = bfd_zalloc (htab->stub_bfd, stub_sec->size);
9691
        if (stub_sec->contents == NULL)
9692
          return FALSE;
9693
        /* We want to check that built size is the same as calculated
9694
           size.  rawsize is a convenient location to use.  */
9695
        stub_sec->rawsize = stub_sec->size;
9696
        stub_sec->size = 0;
9697
      }
9698
 
9699
  if (htab->glink != NULL && htab->glink->size != 0)
9700
    {
9701
      unsigned int indx;
9702
      bfd_vma plt0;
9703
 
9704
      /* Build the .glink plt call stub.  */
9705
      if (htab->emit_stub_syms)
9706
        {
9707
          struct elf_link_hash_entry *h;
9708
          h = elf_link_hash_lookup (&htab->elf, "__glink", TRUE, FALSE, FALSE);
9709
          if (h == NULL)
9710
            return FALSE;
9711
          if (h->root.type == bfd_link_hash_new)
9712
            {
9713
              h->root.type = bfd_link_hash_defined;
9714
              h->root.u.def.section = htab->glink;
9715
              h->root.u.def.value = 8;
9716
              h->ref_regular = 1;
9717
              h->def_regular = 1;
9718
              h->ref_regular_nonweak = 1;
9719
              h->forced_local = 1;
9720
              h->non_elf = 0;
9721
            }
9722
        }
9723
      p = htab->glink->contents;
9724
      plt0 = (htab->plt->output_section->vma
9725
              + htab->plt->output_offset
9726
              - (htab->glink->output_section->vma
9727
                 + htab->glink->output_offset
9728
                 + 16));
9729
      bfd_put_64 (htab->glink->owner, plt0, p);
9730
      p += 8;
9731
      bfd_put_32 (htab->glink->owner, MFLR_R12, p);
9732
      p += 4;
9733
      bfd_put_32 (htab->glink->owner, BCL_20_31, p);
9734
      p += 4;
9735
      bfd_put_32 (htab->glink->owner, MFLR_R11, p);
9736
      p += 4;
9737
      bfd_put_32 (htab->glink->owner, LD_R2_M16R11, p);
9738
      p += 4;
9739
      bfd_put_32 (htab->glink->owner, MTLR_R12, p);
9740
      p += 4;
9741
      bfd_put_32 (htab->glink->owner, ADD_R12_R2_R11, p);
9742
      p += 4;
9743
      bfd_put_32 (htab->glink->owner, LD_R11_0R12, p);
9744
      p += 4;
9745
      bfd_put_32 (htab->glink->owner, LD_R2_0R12 | 8, p);
9746
      p += 4;
9747
      bfd_put_32 (htab->glink->owner, MTCTR_R11, p);
9748
      p += 4;
9749
      bfd_put_32 (htab->glink->owner, LD_R11_0R12 | 16, p);
9750
      p += 4;
9751
      bfd_put_32 (htab->glink->owner, BCTR, p);
9752
      p += 4;
9753
      while (p - htab->glink->contents < GLINK_CALL_STUB_SIZE)
9754
        {
9755
          bfd_put_32 (htab->glink->owner, NOP, p);
9756
          p += 4;
9757
        }
9758
 
9759
      /* Build the .glink lazy link call stubs.  */
9760
      indx = 0;
9761
      while (p < htab->glink->contents + htab->glink->size)
9762
        {
9763
          if (indx < 0x8000)
9764
            {
9765
              bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
9766
              p += 4;
9767
            }
9768
          else
9769
            {
9770
              bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
9771
              p += 4;
9772
              bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx), p);
9773
              p += 4;
9774
            }
9775
          bfd_put_32 (htab->glink->owner,
9776
                      B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
9777
          indx++;
9778
          p += 4;
9779
        }
9780
      htab->glink->rawsize = p - htab->glink->contents;
9781
    }
9782
 
9783
  if (htab->brlt->size != 0)
9784
    {
9785
      htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
9786
                                         htab->brlt->size);
9787
      if (htab->brlt->contents == NULL)
9788
        return FALSE;
9789
    }
9790
  if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
9791
    {
9792
      htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
9793
                                            htab->relbrlt->size);
9794
      if (htab->relbrlt->contents == NULL)
9795
        return FALSE;
9796
    }
9797
 
9798
  /* Build the stubs as directed by the stub hash table.  */
9799
  bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
9800
 
9801
  if (htab->relbrlt != NULL)
9802
    htab->relbrlt->reloc_count = 0;
9803
 
9804
  for (stub_sec = htab->stub_bfd->sections;
9805
       stub_sec != NULL;
9806
       stub_sec = stub_sec->next)
9807
    if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
9808
      {
9809
        stub_sec_count += 1;
9810
        if (stub_sec->rawsize != stub_sec->size)
9811
          break;
9812
      }
9813
 
9814
  if (stub_sec != NULL
9815
      || htab->glink->rawsize != htab->glink->size)
9816
    {
9817
      htab->stub_error = TRUE;
9818
      (*_bfd_error_handler) (_("stubs don't match calculated size"));
9819
    }
9820
 
9821
  if (htab->stub_error)
9822
    return FALSE;
9823
 
9824
  if (stats != NULL)
9825
    {
9826
      *stats = bfd_malloc (500);
9827
      if (*stats == NULL)
9828
        return FALSE;
9829
 
9830
      sprintf (*stats, _("linker stubs in %u group%s\n"
9831
                         "  branch       %lu\n"
9832
                         "  toc adjust   %lu\n"
9833
                         "  long branch  %lu\n"
9834
                         "  long toc adj %lu\n"
9835
                         "  plt call     %lu"),
9836
               stub_sec_count,
9837
               stub_sec_count == 1 ? "" : "s",
9838
               htab->stub_count[ppc_stub_long_branch - 1],
9839
               htab->stub_count[ppc_stub_long_branch_r2off - 1],
9840
               htab->stub_count[ppc_stub_plt_branch - 1],
9841
               htab->stub_count[ppc_stub_plt_branch_r2off - 1],
9842
               htab->stub_count[ppc_stub_plt_call - 1]);
9843
    }
9844
  return TRUE;
9845
}
9846
 
9847
/* This function undoes the changes made by add_symbol_adjust.  */
9848
 
9849
static bfd_boolean
9850
undo_symbol_twiddle (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
9851
{
9852
  struct ppc_link_hash_entry *eh;
9853
 
9854
  if (h->root.type == bfd_link_hash_indirect)
9855
    return TRUE;
9856
 
9857
  if (h->root.type == bfd_link_hash_warning)
9858
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
9859
 
9860
  eh = (struct ppc_link_hash_entry *) h;
9861
  if (eh->elf.root.type != bfd_link_hash_undefweak || !eh->was_undefined)
9862
    return TRUE;
9863
 
9864
  eh->elf.root.type = bfd_link_hash_undefined;
9865
  return TRUE;
9866
}
9867
 
9868
void
9869
ppc64_elf_restore_symbols (struct bfd_link_info *info)
9870
{
9871
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
9872
  elf_link_hash_traverse (&htab->elf, undo_symbol_twiddle, info);
9873
}
9874
 
9875
/* What to do when ld finds relocations against symbols defined in
9876
   discarded sections.  */
9877
 
9878
static unsigned int
9879
ppc64_elf_action_discarded (asection *sec)
9880
{
9881
  if (strcmp (".opd", sec->name) == 0)
9882
    return 0;
9883
 
9884
  if (strcmp (".toc", sec->name) == 0)
9885
    return 0;
9886
 
9887
  if (strcmp (".toc1", sec->name) == 0)
9888
    return 0;
9889
 
9890
  return _bfd_elf_default_action_discarded (sec);
9891
}
9892
 
9893
/* The RELOCATE_SECTION function is called by the ELF backend linker
9894
   to handle the relocations for a section.
9895
 
9896
   The relocs are always passed as Rela structures; if the section
9897
   actually uses Rel structures, the r_addend field will always be
9898
   zero.
9899
 
9900
   This function is responsible for adjust the section contents as
9901
   necessary, and (if using Rela relocs and generating a
9902
   relocatable output file) adjusting the reloc addend as
9903
   necessary.
9904
 
9905
   This function does not have to worry about setting the reloc
9906
   address or the reloc symbol index.
9907
 
9908
   LOCAL_SYMS is a pointer to the swapped in local symbols.
9909
 
9910
   LOCAL_SECTIONS is an array giving the section in the input file
9911
   corresponding to the st_shndx field of each local symbol.
9912
 
9913
   The global hash table entry for the global symbols can be found
9914
   via elf_sym_hashes (input_bfd).
9915
 
9916
   When generating relocatable output, this function must handle
9917
   STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
9918
   going to be the section symbol corresponding to the output
9919
   section, which means that the addend must be adjusted
9920
   accordingly.  */
9921
 
9922
static bfd_boolean
9923
ppc64_elf_relocate_section (bfd *output_bfd,
9924
                            struct bfd_link_info *info,
9925
                            bfd *input_bfd,
9926
                            asection *input_section,
9927
                            bfd_byte *contents,
9928
                            Elf_Internal_Rela *relocs,
9929
                            Elf_Internal_Sym *local_syms,
9930
                            asection **local_sections)
9931
{
9932
  struct ppc_link_hash_table *htab;
9933
  Elf_Internal_Shdr *symtab_hdr;
9934
  struct elf_link_hash_entry **sym_hashes;
9935
  Elf_Internal_Rela *rel;
9936
  Elf_Internal_Rela *relend;
9937
  Elf_Internal_Rela outrel;
9938
  bfd_byte *loc;
9939
  struct got_entry **local_got_ents;
9940
  bfd_vma TOCstart;
9941
  bfd_boolean ret = TRUE;
9942
  bfd_boolean is_opd;
9943
  /* Disabled until we sort out how ld should choose 'y' vs 'at'.  */
9944
  bfd_boolean is_power4 = FALSE;
9945
  bfd_vma d_offset = (bfd_big_endian (output_bfd) ? 2 : 0);
9946
 
9947
  /* Initialize howto table if needed.  */
9948
  if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
9949
    ppc_howto_init ();
9950
 
9951
  htab = ppc_hash_table (info);
9952
 
9953
  /* Don't relocate stub sections.  */
9954
  if (input_section->owner == htab->stub_bfd)
9955
    return TRUE;
9956
 
9957
  BFD_ASSERT (is_ppc64_elf (input_bfd));
9958
 
9959
  local_got_ents = elf_local_got_ents (input_bfd);
9960
  TOCstart = elf_gp (output_bfd);
9961
  symtab_hdr = &elf_symtab_hdr (input_bfd);
9962
  sym_hashes = elf_sym_hashes (input_bfd);
9963
  is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
9964
 
9965
  rel = relocs;
9966
  relend = relocs + input_section->reloc_count;
9967
  for (; rel < relend; rel++)
9968
    {
9969
      enum elf_ppc64_reloc_type r_type;
9970
      bfd_vma addend, orig_addend;
9971
      bfd_reloc_status_type r;
9972
      Elf_Internal_Sym *sym;
9973
      asection *sec;
9974
      struct elf_link_hash_entry *h_elf;
9975
      struct ppc_link_hash_entry *h;
9976
      struct ppc_link_hash_entry *fdh;
9977
      const char *sym_name;
9978
      unsigned long r_symndx, toc_symndx;
9979
      char tls_mask, tls_gd, tls_type;
9980
      char sym_type;
9981
      bfd_vma relocation;
9982
      bfd_boolean unresolved_reloc;
9983
      bfd_boolean warned;
9984
      unsigned long insn, mask;
9985
      struct ppc_stub_hash_entry *stub_entry;
9986
      bfd_vma max_br_offset;
9987
      bfd_vma from;
9988
 
9989
      r_type = ELF64_R_TYPE (rel->r_info);
9990
      r_symndx = ELF64_R_SYM (rel->r_info);
9991
 
9992
      /* For old style R_PPC64_TOC relocs with a zero symbol, use the
9993
         symbol of the previous ADDR64 reloc.  The symbol gives us the
9994
         proper TOC base to use.  */
9995
      if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
9996
          && rel != relocs
9997
          && ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_ADDR64
9998
          && is_opd)
9999
        r_symndx = ELF64_R_SYM (rel[-1].r_info);
10000
 
10001
      sym = NULL;
10002
      sec = NULL;
10003
      h_elf = NULL;
10004
      sym_name = NULL;
10005
      unresolved_reloc = FALSE;
10006
      warned = FALSE;
10007
      orig_addend = rel->r_addend;
10008
 
10009
      if (r_symndx < symtab_hdr->sh_info)
10010
        {
10011
          /* It's a local symbol.  */
10012
          struct _opd_sec_data *opd;
10013
 
10014
          sym = local_syms + r_symndx;
10015
          sec = local_sections[r_symndx];
10016
          sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
10017
          sym_type = ELF64_ST_TYPE (sym->st_info);
10018
          relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
10019
          opd = get_opd_info (sec);
10020
          if (opd != NULL && opd->adjust != NULL)
10021
            {
10022
              long adjust = opd->adjust[(sym->st_value + rel->r_addend) / 8];
10023
              if (adjust == -1)
10024
                relocation = 0;
10025
              else
10026
                {
10027
                  /* If this is a relocation against the opd section sym
10028
                     and we have edited .opd, adjust the reloc addend so
10029
                     that ld -r and ld --emit-relocs output is correct.
10030
                     If it is a reloc against some other .opd symbol,
10031
                     then the symbol value will be adjusted later.  */
10032
                  if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
10033
                    rel->r_addend += adjust;
10034
                  else
10035
                    relocation += adjust;
10036
                }
10037
            }
10038
        }
10039
      else
10040
        {
10041
          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
10042
                                   r_symndx, symtab_hdr, sym_hashes,
10043
                                   h_elf, sec, relocation,
10044
                                   unresolved_reloc, warned);
10045
          sym_name = h_elf->root.root.string;
10046
          sym_type = h_elf->type;
10047
        }
10048
      h = (struct ppc_link_hash_entry *) h_elf;
10049
 
10050
      if (sec != NULL && elf_discarded_section (sec))
10051
        {
10052
          /* For relocs against symbols from removed linkonce sections,
10053
             or sections discarded by a linker script, we just want the
10054
             section contents zeroed.  Avoid any special processing.  */
10055
          _bfd_clear_contents (ppc64_elf_howto_table[r_type], input_bfd,
10056
                               contents + rel->r_offset);
10057
          rel->r_info = 0;
10058
          rel->r_addend = 0;
10059
          continue;
10060
        }
10061
 
10062
      if (info->relocatable)
10063
        continue;
10064
 
10065
      /* TLS optimizations.  Replace instruction sequences and relocs
10066
         based on information we collected in tls_optimize.  We edit
10067
         RELOCS so that --emit-relocs will output something sensible
10068
         for the final instruction stream.  */
10069
      tls_mask = 0;
10070
      tls_gd = 0;
10071
      toc_symndx = 0;
10072
      if (IS_PPC64_TLS_RELOC (r_type))
10073
        {
10074
          if (h != NULL)
10075
            tls_mask = h->tls_mask;
10076
          else if (local_got_ents != NULL)
10077
            {
10078
              char *lgot_masks;
10079
              lgot_masks = (char *) (local_got_ents + symtab_hdr->sh_info);
10080
              tls_mask = lgot_masks[r_symndx];
10081
            }
10082
          if (tls_mask == 0 && r_type == R_PPC64_TLS)
10083
            {
10084
              /* Check for toc tls entries.  */
10085
              char *toc_tls;
10086
 
10087
              if (!get_tls_mask (&toc_tls, &toc_symndx, &local_syms,
10088
                                 rel, input_bfd))
10089
                return FALSE;
10090
 
10091
              if (toc_tls)
10092
                tls_mask = *toc_tls;
10093
            }
10094
        }
10095
 
10096
      /* Check that tls relocs are used with tls syms, and non-tls
10097
         relocs are used with non-tls syms.  */
10098
      if (r_symndx != 0
10099
          && r_type != R_PPC64_NONE
10100
          && (h == NULL
10101
              || h->elf.root.type == bfd_link_hash_defined
10102
              || h->elf.root.type == bfd_link_hash_defweak)
10103
          && IS_PPC64_TLS_RELOC (r_type) != (sym_type == STT_TLS))
10104
        {
10105
          if (r_type == R_PPC64_TLS && tls_mask != 0)
10106
            /* R_PPC64_TLS is OK against a symbol in the TOC.  */
10107
            ;
10108
          else
10109
            (*_bfd_error_handler)
10110
              (sym_type == STT_TLS
10111
               ? _("%B(%A+0x%lx): %s used with TLS symbol %s")
10112
               : _("%B(%A+0x%lx): %s used with non-TLS symbol %s"),
10113
               input_bfd,
10114
               input_section,
10115
               (long) rel->r_offset,
10116
               ppc64_elf_howto_table[r_type]->name,
10117
               sym_name);
10118
        }
10119
 
10120
      /* Ensure reloc mapping code below stays sane.  */
10121
      if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
10122
          || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
10123
          || (R_PPC64_GOT_TLSLD16 & 3)    != (R_PPC64_GOT_TLSGD16 & 3)
10124
          || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
10125
          || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
10126
          || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
10127
          || (R_PPC64_GOT_TLSLD16 & 3)    != (R_PPC64_GOT_TPREL16_DS & 3)
10128
          || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
10129
          || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
10130
          || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
10131
        abort ();
10132
 
10133
      switch (r_type)
10134
        {
10135
        default:
10136
          break;
10137
 
10138
        case R_PPC64_TOC16:
10139
        case R_PPC64_TOC16_LO:
10140
        case R_PPC64_TOC16_DS:
10141
        case R_PPC64_TOC16_LO_DS:
10142
          {
10143
            /* Check for toc tls entries.  */
10144
            char *toc_tls;
10145
            int retval;
10146
 
10147
            retval = get_tls_mask (&toc_tls, &toc_symndx, &local_syms,
10148
                                   rel, input_bfd);
10149
            if (retval == 0)
10150
              return FALSE;
10151
 
10152
            if (toc_tls)
10153
              {
10154
                tls_mask = *toc_tls;
10155
                if (r_type == R_PPC64_TOC16_DS
10156
                    || r_type == R_PPC64_TOC16_LO_DS)
10157
                  {
10158
                    if (tls_mask != 0
10159
                        && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
10160
                      goto toctprel;
10161
                  }
10162
                else
10163
                  {
10164
                    /* If we found a GD reloc pair, then we might be
10165
                       doing a GD->IE transition.  */
10166
                    if (retval == 2)
10167
                      {
10168
                        tls_gd = TLS_TPRELGD;
10169
                        if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
10170
                          goto tls_ldgd_opt;
10171
                      }
10172
                    else if (retval == 3)
10173
                      {
10174
                        if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
10175
                          goto tls_ldgd_opt;
10176
                      }
10177
                  }
10178
              }
10179
          }
10180
          break;
10181
 
10182
        case R_PPC64_GOT_TPREL16_DS:
10183
        case R_PPC64_GOT_TPREL16_LO_DS:
10184
          if (tls_mask != 0
10185
              && (tls_mask & TLS_TPREL) == 0)
10186
            {
10187
            toctprel:
10188
              insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
10189
              insn &= 31 << 21;
10190
              insn |= 0x3c0d0000;       /* addis 0,13,0 */
10191
              bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
10192
              r_type = R_PPC64_TPREL16_HA;
10193
              if (toc_symndx != 0)
10194
                {
10195
                  rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
10196
                  /* We changed the symbol.  Start over in order to
10197
                     get h, sym, sec etc. right.  */
10198
                  rel--;
10199
                  continue;
10200
                }
10201
              else
10202
                rel->r_info = ELF64_R_INFO (r_symndx, r_type);
10203
            }
10204
          break;
10205
 
10206
        case R_PPC64_TLS:
10207
          if (tls_mask != 0
10208
              && (tls_mask & TLS_TPREL) == 0)
10209
            {
10210
              bfd_vma rtra;
10211
              insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
10212
              if ((insn & ((0x3f << 26) | (31 << 11)))
10213
                  == ((31 << 26) | (13 << 11)))
10214
                rtra = insn & ((1 << 26) - (1 << 16));
10215
              else if ((insn & ((0x3f << 26) | (31 << 16)))
10216
                       == ((31 << 26) | (13 << 16)))
10217
                rtra = (insn & (31 << 21)) | ((insn & (31 << 11)) << 5);
10218
              else
10219
                abort ();
10220
              if ((insn & ((1 << 11) - (1 << 1))) == 266 << 1)
10221
                /* add -> addi.  */
10222
                insn = 14 << 26;
10223
              else if ((insn & (31 << 1)) == 23 << 1
10224
                       && ((insn & (31 << 6)) < 14 << 6
10225
                           || ((insn & (31 << 6)) >= 16 << 6
10226
                               && (insn & (31 << 6)) < 24 << 6)))
10227
                /* load and store indexed -> dform.  */
10228
                insn = (32 | ((insn >> 6) & 31)) << 26;
10229
              else if ((insn & (31 << 1)) == 21 << 1
10230
                       && (insn & (0x1a << 6)) == 0)
10231
                /* ldx, ldux, stdx, stdux -> ld, ldu, std, stdu.  */
10232
                insn = (((58 | ((insn >> 6) & 4)) << 26)
10233
                        | ((insn >> 6) & 1));
10234
              else if ((insn & (31 << 1)) == 21 << 1
10235
                       && (insn & ((1 << 11) - (1 << 1))) == 341 << 1)
10236
                /* lwax -> lwa.  */
10237
                insn = (58 << 26) | 2;
10238
              else
10239
                abort ();
10240
              insn |= rtra;
10241
              bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
10242
              /* Was PPC64_TLS which sits on insn boundary, now
10243
                 PPC64_TPREL16_LO which is at low-order half-word.  */
10244
              rel->r_offset += d_offset;
10245
              r_type = R_PPC64_TPREL16_LO;
10246
              if (toc_symndx != 0)
10247
                {
10248
                  rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
10249
                  /* We changed the symbol.  Start over in order to
10250
                     get h, sym, sec etc. right.  */
10251
                  rel--;
10252
                  continue;
10253
                }
10254
              else
10255
                rel->r_info = ELF64_R_INFO (r_symndx, r_type);
10256
            }
10257
          break;
10258
 
10259
        case R_PPC64_GOT_TLSGD16_HI:
10260
        case R_PPC64_GOT_TLSGD16_HA:
10261
          tls_gd = TLS_TPRELGD;
10262
          if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
10263
            goto tls_gdld_hi;
10264
          break;
10265
 
10266
        case R_PPC64_GOT_TLSLD16_HI:
10267
        case R_PPC64_GOT_TLSLD16_HA:
10268
          if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
10269
            {
10270
            tls_gdld_hi:
10271
              if ((tls_mask & tls_gd) != 0)
10272
                r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
10273
                          + R_PPC64_GOT_TPREL16_DS);
10274
              else
10275
                {
10276
                  bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
10277
                  rel->r_offset -= d_offset;
10278
                  r_type = R_PPC64_NONE;
10279
                }
10280
              rel->r_info = ELF64_R_INFO (r_symndx, r_type);
10281
            }
10282
          break;
10283
 
10284
        case R_PPC64_GOT_TLSGD16:
10285
        case R_PPC64_GOT_TLSGD16_LO:
10286
          tls_gd = TLS_TPRELGD;
10287
          if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
10288
            goto tls_ldgd_opt;
10289
          break;
10290
 
10291
        case R_PPC64_GOT_TLSLD16:
10292
        case R_PPC64_GOT_TLSLD16_LO:
10293
          if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
10294
            {
10295
              bfd_vma insn1, insn2, insn3;
10296
              bfd_vma offset;
10297
 
10298
            tls_ldgd_opt:
10299
              /* We know that the next reloc is on a tls_get_addr
10300
                 call, since ppc64_elf_tls_optimize checks this.  */
10301
              offset = rel[1].r_offset;
10302
              insn1 = bfd_get_32 (output_bfd,
10303
                                  contents + rel->r_offset - d_offset);
10304
              insn3 = bfd_get_32 (output_bfd,
10305
                                  contents + offset + 4);
10306
              if ((tls_mask & tls_gd) != 0)
10307
                {
10308
                  /* IE */
10309
                  insn1 &= (1 << 26) - (1 << 2);
10310
                  insn1 |= 58 << 26;    /* ld */
10311
                  insn2 = 0x7c636a14;   /* add 3,3,13 */
10312
                  rel[1].r_info = ELF64_R_INFO (ELF64_R_SYM (rel[1].r_info),
10313
                                                R_PPC64_NONE);
10314
                  if ((tls_mask & TLS_EXPLICIT) == 0)
10315
                    r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
10316
                              + R_PPC64_GOT_TPREL16_DS);
10317
                  else
10318
                    r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
10319
                  rel->r_info = ELF64_R_INFO (r_symndx, r_type);
10320
                }
10321
              else
10322
                {
10323
                  /* LE */
10324
                  insn1 = 0x3c6d0000;   /* addis 3,13,0 */
10325
                  insn2 = 0x38630000;   /* addi 3,3,0 */
10326
                  if (tls_gd == 0)
10327
                    {
10328
                      /* Was an LD reloc.  */
10329
                      r_symndx = 0;
10330
                      rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
10331
                      rel[1].r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
10332
                    }
10333
                  else if (toc_symndx != 0)
10334
                    r_symndx = toc_symndx;
10335
                  r_type = R_PPC64_TPREL16_HA;
10336
                  rel->r_info = ELF64_R_INFO (r_symndx, r_type);
10337
                  rel[1].r_info = ELF64_R_INFO (r_symndx,
10338
                                                R_PPC64_TPREL16_LO);
10339
                  rel[1].r_offset += d_offset;
10340
                }
10341
              if (insn3 == NOP
10342
                  || insn3 == CROR_151515 || insn3 == CROR_313131)
10343
                {
10344
                  insn3 = insn2;
10345
                  insn2 = NOP;
10346
                  rel[1].r_offset += 4;
10347
                }
10348
              bfd_put_32 (output_bfd, insn1,
10349
                          contents + rel->r_offset - d_offset);
10350
              bfd_put_32 (output_bfd, insn2, contents + offset);
10351
              bfd_put_32 (output_bfd, insn3, contents + offset + 4);
10352
              if (tls_gd == 0 || toc_symndx != 0)
10353
                {
10354
                  /* We changed the symbol.  Start over in order
10355
                     to get h, sym, sec etc. right.  */
10356
                  rel--;
10357
                  continue;
10358
                }
10359
            }
10360
          break;
10361
 
10362
        case R_PPC64_DTPMOD64:
10363
          if (rel + 1 < relend
10364
              && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
10365
              && rel[1].r_offset == rel->r_offset + 8)
10366
            {
10367
              if ((tls_mask & TLS_GD) == 0)
10368
                {
10369
                  rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
10370
                  if ((tls_mask & TLS_TPRELGD) != 0)
10371
                    r_type = R_PPC64_TPREL64;
10372
                  else
10373
                    {
10374
                      bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
10375
                      r_type = R_PPC64_NONE;
10376
                    }
10377
                  rel->r_info = ELF64_R_INFO (r_symndx, r_type);
10378
                }
10379
            }
10380
          else
10381
            {
10382
              if ((tls_mask & TLS_LD) == 0)
10383
                {
10384
                  bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
10385
                  r_type = R_PPC64_NONE;
10386
                  rel->r_info = ELF64_R_INFO (r_symndx, r_type);
10387
                }
10388
            }
10389
          break;
10390
 
10391
        case R_PPC64_TPREL64:
10392
          if ((tls_mask & TLS_TPREL) == 0)
10393
            {
10394
              r_type = R_PPC64_NONE;
10395
              rel->r_info = ELF64_R_INFO (r_symndx, r_type);
10396
            }
10397
          break;
10398
        }
10399
 
10400
      /* Handle other relocations that tweak non-addend part of insn.  */
10401
      insn = 0;
10402
      max_br_offset = 1 << 25;
10403
      addend = rel->r_addend;
10404
      switch (r_type)
10405
        {
10406
        default:
10407
          break;
10408
 
10409
          /* Branch taken prediction relocations.  */
10410
        case R_PPC64_ADDR14_BRTAKEN:
10411
        case R_PPC64_REL14_BRTAKEN:
10412
          insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field.  */
10413
          /* Fall thru.  */
10414
 
10415
          /* Branch not taken prediction relocations.  */
10416
        case R_PPC64_ADDR14_BRNTAKEN:
10417
        case R_PPC64_REL14_BRNTAKEN:
10418
          insn |= bfd_get_32 (output_bfd,
10419
                              contents + rel->r_offset) & ~(0x01 << 21);
10420
          /* Fall thru.  */
10421
 
10422
        case R_PPC64_REL14:
10423
          max_br_offset = 1 << 15;
10424
          /* Fall thru.  */
10425
 
10426
        case R_PPC64_REL24:
10427
          /* Calls to functions with a different TOC, such as calls to
10428
             shared objects, need to alter the TOC pointer.  This is
10429
             done using a linkage stub.  A REL24 branching to these
10430
             linkage stubs needs to be followed by a nop, as the nop
10431
             will be replaced with an instruction to restore the TOC
10432
             base pointer.  */
10433
          stub_entry = NULL;
10434
          fdh = h;
10435
          if (((h != NULL
10436
                && (((fdh = h->oh) != NULL
10437
                     && fdh->elf.plt.plist != NULL)
10438
                    || (fdh = h)->elf.plt.plist != NULL))
10439
               || (sec != NULL
10440
                   && sec->output_section != NULL
10441
                   && sec->id <= htab->top_id
10442
                   && (htab->stub_group[sec->id].toc_off
10443
                       != htab->stub_group[input_section->id].toc_off)))
10444
              && (stub_entry = ppc_get_stub_entry (input_section, sec, fdh,
10445
                                                   rel, htab)) != NULL
10446
              && (stub_entry->stub_type == ppc_stub_plt_call
10447
                  || stub_entry->stub_type == ppc_stub_plt_branch_r2off
10448
                  || stub_entry->stub_type == ppc_stub_long_branch_r2off))
10449
            {
10450
              bfd_boolean can_plt_call = FALSE;
10451
 
10452
              if (rel->r_offset + 8 <= input_section->size)
10453
                {
10454
                  unsigned long nop;
10455
                  nop = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
10456
                  if (nop == NOP
10457
                      || nop == CROR_151515 || nop == CROR_313131)
10458
                    {
10459
                      bfd_put_32 (input_bfd, LD_R2_40R1,
10460
                                  contents + rel->r_offset + 4);
10461
                      can_plt_call = TRUE;
10462
                    }
10463
                }
10464
 
10465
              if (!can_plt_call)
10466
                {
10467
                  if (stub_entry->stub_type == ppc_stub_plt_call)
10468
                    {
10469
                      /* If this is a plain branch rather than a branch
10470
                         and link, don't require a nop.  However, don't
10471
                         allow tail calls in a shared library as they
10472
                         will result in r2 being corrupted.  */
10473
                      unsigned long br;
10474
                      br = bfd_get_32 (input_bfd, contents + rel->r_offset);
10475
                      if (info->executable && (br & 1) == 0)
10476
                        can_plt_call = TRUE;
10477
                      else
10478
                        stub_entry = NULL;
10479
                    }
10480
                  else if (h != NULL
10481
                           && strcmp (h->elf.root.root.string,
10482
                                      ".__libc_start_main") == 0)
10483
                    {
10484
                      /* Allow crt1 branch to go via a toc adjusting stub.  */
10485
                      can_plt_call = TRUE;
10486
                    }
10487
                  else
10488
                    {
10489
                      if (strcmp (input_section->output_section->name,
10490
                                  ".init") == 0
10491
                          || strcmp (input_section->output_section->name,
10492
                                     ".fini") == 0)
10493
                        (*_bfd_error_handler)
10494
                          (_("%B(%A+0x%lx): automatic multiple TOCs "
10495
                             "not supported using your crt files; "
10496
                             "recompile with -mminimal-toc or upgrade gcc"),
10497
                           input_bfd,
10498
                           input_section,
10499
                           (long) rel->r_offset);
10500
                      else
10501
                        (*_bfd_error_handler)
10502
                          (_("%B(%A+0x%lx): sibling call optimization to `%s' "
10503
                             "does not allow automatic multiple TOCs; "
10504
                             "recompile with -mminimal-toc or "
10505
                             "-fno-optimize-sibling-calls, "
10506
                             "or make `%s' extern"),
10507
                           input_bfd,
10508
                           input_section,
10509
                           (long) rel->r_offset,
10510
                           sym_name,
10511
                           sym_name);
10512
                      bfd_set_error (bfd_error_bad_value);
10513
                      ret = FALSE;
10514
                    }
10515
                }
10516
 
10517
              if (can_plt_call
10518
                  && stub_entry->stub_type == ppc_stub_plt_call)
10519
                unresolved_reloc = FALSE;
10520
            }
10521
 
10522
          if (stub_entry == NULL
10523
              && get_opd_info (sec) != NULL)
10524
            {
10525
              /* The branch destination is the value of the opd entry. */
10526
              bfd_vma off = (relocation + addend
10527
                             - sec->output_section->vma
10528
                             - sec->output_offset);
10529
              bfd_vma dest = opd_entry_value (sec, off, NULL, NULL);
10530
              if (dest != (bfd_vma) -1)
10531
                {
10532
                  relocation = dest;
10533
                  addend = 0;
10534
                }
10535
            }
10536
 
10537
          /* If the branch is out of reach we ought to have a long
10538
             branch stub.  */
10539
          from = (rel->r_offset
10540
                  + input_section->output_offset
10541
                  + input_section->output_section->vma);
10542
 
10543
          if (stub_entry == NULL
10544
              && (relocation + addend - from + max_br_offset
10545
                  >= 2 * max_br_offset)
10546
              && r_type != R_PPC64_ADDR14_BRTAKEN
10547
              && r_type != R_PPC64_ADDR14_BRNTAKEN)
10548
            stub_entry = ppc_get_stub_entry (input_section, sec, h, rel,
10549
                                             htab);
10550
 
10551
          if (stub_entry != NULL)
10552
            {
10553
              /* Munge up the value and addend so that we call the stub
10554
                 rather than the procedure directly.  */
10555
              relocation = (stub_entry->stub_offset
10556
                            + stub_entry->stub_sec->output_offset
10557
                            + stub_entry->stub_sec->output_section->vma);
10558
              addend = 0;
10559
            }
10560
 
10561
          if (insn != 0)
10562
            {
10563
              if (is_power4)
10564
                {
10565
                  /* Set 'a' bit.  This is 0b00010 in BO field for branch
10566
                     on CR(BI) insns (BO == 001at or 011at), and 0b01000
10567
                     for branch on CTR insns (BO == 1a00t or 1a01t).  */
10568
                  if ((insn & (0x14 << 21)) == (0x04 << 21))
10569
                    insn |= 0x02 << 21;
10570
                  else if ((insn & (0x14 << 21)) == (0x10 << 21))
10571
                    insn |= 0x08 << 21;
10572
                  else
10573
                    break;
10574
                }
10575
              else
10576
                {
10577
                  /* Invert 'y' bit if not the default.  */
10578
                  if ((bfd_signed_vma) (relocation + addend - from) < 0)
10579
                    insn ^= 0x01 << 21;
10580
                }
10581
 
10582
              bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
10583
            }
10584
 
10585
          /* NOP out calls to undefined weak functions.
10586
             We can thus call a weak function without first
10587
             checking whether the function is defined.  */
10588
          else if (h != NULL
10589
                   && h->elf.root.type == bfd_link_hash_undefweak
10590
                   && r_type == R_PPC64_REL24
10591
                   && relocation == 0
10592
                   && addend == 0)
10593
            {
10594
              bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
10595
              continue;
10596
            }
10597
          break;
10598
        }
10599
 
10600
      /* Set `addend'.  */
10601
      tls_type = 0;
10602
      switch (r_type)
10603
        {
10604
        default:
10605
          (*_bfd_error_handler)
10606
            (_("%B: unknown relocation type %d for symbol %s"),
10607
             input_bfd, (int) r_type, sym_name);
10608
 
10609
          bfd_set_error (bfd_error_bad_value);
10610
          ret = FALSE;
10611
          continue;
10612
 
10613
        case R_PPC64_NONE:
10614
        case R_PPC64_TLS:
10615
        case R_PPC64_GNU_VTINHERIT:
10616
        case R_PPC64_GNU_VTENTRY:
10617
          continue;
10618
 
10619
          /* GOT16 relocations.  Like an ADDR16 using the symbol's
10620
             address in the GOT as relocation value instead of the
10621
             symbol's value itself.  Also, create a GOT entry for the
10622
             symbol and put the symbol value there.  */
10623
        case R_PPC64_GOT_TLSGD16:
10624
        case R_PPC64_GOT_TLSGD16_LO:
10625
        case R_PPC64_GOT_TLSGD16_HI:
10626
        case R_PPC64_GOT_TLSGD16_HA:
10627
          tls_type = TLS_TLS | TLS_GD;
10628
          goto dogot;
10629
 
10630
        case R_PPC64_GOT_TLSLD16:
10631
        case R_PPC64_GOT_TLSLD16_LO:
10632
        case R_PPC64_GOT_TLSLD16_HI:
10633
        case R_PPC64_GOT_TLSLD16_HA:
10634
          tls_type = TLS_TLS | TLS_LD;
10635
          goto dogot;
10636
 
10637
        case R_PPC64_GOT_TPREL16_DS:
10638
        case R_PPC64_GOT_TPREL16_LO_DS:
10639
        case R_PPC64_GOT_TPREL16_HI:
10640
        case R_PPC64_GOT_TPREL16_HA:
10641
          tls_type = TLS_TLS | TLS_TPREL;
10642
          goto dogot;
10643
 
10644
        case R_PPC64_GOT_DTPREL16_DS:
10645
        case R_PPC64_GOT_DTPREL16_LO_DS:
10646
        case R_PPC64_GOT_DTPREL16_HI:
10647
        case R_PPC64_GOT_DTPREL16_HA:
10648
          tls_type = TLS_TLS | TLS_DTPREL;
10649
          goto dogot;
10650
 
10651
        case R_PPC64_GOT16:
10652
        case R_PPC64_GOT16_LO:
10653
        case R_PPC64_GOT16_HI:
10654
        case R_PPC64_GOT16_HA:
10655
        case R_PPC64_GOT16_DS:
10656
        case R_PPC64_GOT16_LO_DS:
10657
        dogot:
10658
          {
10659
            /* Relocation is to the entry for this symbol in the global
10660
               offset table.  */
10661
            asection *got;
10662
            bfd_vma *offp;
10663
            bfd_vma off;
10664
            unsigned long indx = 0;
10665
 
10666
            if (tls_type == (TLS_TLS | TLS_LD)
10667
                && (h == NULL
10668
                    || !h->elf.def_dynamic))
10669
              offp = &ppc64_tlsld_got (input_bfd)->offset;
10670
            else
10671
              {
10672
                struct got_entry *ent;
10673
 
10674
                if (h != NULL)
10675
                  {
10676
                    bfd_boolean dyn = htab->elf.dynamic_sections_created;
10677
                    if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
10678
                                                          &h->elf)
10679
                        || (info->shared
10680
                            && SYMBOL_REFERENCES_LOCAL (info, &h->elf)))
10681
                      /* This is actually a static link, or it is a
10682
                         -Bsymbolic link and the symbol is defined
10683
                         locally, or the symbol was forced to be local
10684
                         because of a version file.  */
10685
                      ;
10686
                    else
10687
                      {
10688
                        indx = h->elf.dynindx;
10689
                        unresolved_reloc = FALSE;
10690
                      }
10691
                    ent = h->elf.got.glist;
10692
                  }
10693
                else
10694
                  {
10695
                    if (local_got_ents == NULL)
10696
                      abort ();
10697
                    ent = local_got_ents[r_symndx];
10698
                  }
10699
 
10700
                for (; ent != NULL; ent = ent->next)
10701
                  if (ent->addend == orig_addend
10702
                      && ent->owner == input_bfd
10703
                      && ent->tls_type == tls_type)
10704
                    break;
10705
                if (ent == NULL)
10706
                  abort ();
10707
                offp = &ent->got.offset;
10708
              }
10709
 
10710
            got = ppc64_elf_tdata (input_bfd)->got;
10711
            if (got == NULL)
10712
              abort ();
10713
 
10714
            /* The offset must always be a multiple of 8.  We use the
10715
               least significant bit to record whether we have already
10716
               processed this entry.  */
10717
            off = *offp;
10718
            if ((off & 1) != 0)
10719
              off &= ~1;
10720
            else
10721
              {
10722
                /* Generate relocs for the dynamic linker, except in
10723
                   the case of TLSLD where we'll use one entry per
10724
                   module.  */
10725
                asection *relgot = ppc64_elf_tdata (input_bfd)->relgot;
10726
 
10727
                *offp = off | 1;
10728
                if ((info->shared || indx != 0)
10729
                    && (h == NULL
10730
                        || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
10731
                        || h->elf.root.type != bfd_link_hash_undefweak))
10732
                  {
10733
                    outrel.r_offset = (got->output_section->vma
10734
                                       + got->output_offset
10735
                                       + off);
10736
                    outrel.r_addend = addend;
10737
                    if (tls_type & (TLS_LD | TLS_GD))
10738
                      {
10739
                        outrel.r_addend = 0;
10740
                        outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
10741
                        if (tls_type == (TLS_TLS | TLS_GD))
10742
                          {
10743
                            loc = relgot->contents;
10744
                            loc += (relgot->reloc_count++
10745
                                    * sizeof (Elf64_External_Rela));
10746
                            bfd_elf64_swap_reloca_out (output_bfd,
10747
                                                       &outrel, loc);
10748
                            outrel.r_offset += 8;
10749
                            outrel.r_addend = addend;
10750
                            outrel.r_info
10751
                              = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
10752
                          }
10753
                      }
10754
                    else if (tls_type == (TLS_TLS | TLS_DTPREL))
10755
                      outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
10756
                    else if (tls_type == (TLS_TLS | TLS_TPREL))
10757
                      outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
10758
                    else if (indx == 0)
10759
                      {
10760
                        outrel.r_info = ELF64_R_INFO (indx, R_PPC64_RELATIVE);
10761
 
10762
                        /* Write the .got section contents for the sake
10763
                           of prelink.  */
10764
                        loc = got->contents + off;
10765
                        bfd_put_64 (output_bfd, outrel.r_addend + relocation,
10766
                                    loc);
10767
                      }
10768
                    else
10769
                      outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
10770
 
10771
                    if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
10772
                      {
10773
                        outrel.r_addend += relocation;
10774
                        if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
10775
                          outrel.r_addend -= htab->elf.tls_sec->vma;
10776
                      }
10777
                    loc = relgot->contents;
10778
                    loc += (relgot->reloc_count++
10779
                            * sizeof (Elf64_External_Rela));
10780
                    bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
10781
                  }
10782
 
10783
                /* Init the .got section contents here if we're not
10784
                   emitting a reloc.  */
10785
                else
10786
                  {
10787
                    relocation += addend;
10788
                    if (tls_type == (TLS_TLS | TLS_LD))
10789
                      relocation = 1;
10790
                    else if (tls_type != 0)
10791
                      {
10792
                        relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
10793
                        if (tls_type == (TLS_TLS | TLS_TPREL))
10794
                          relocation += DTP_OFFSET - TP_OFFSET;
10795
 
10796
                        if (tls_type == (TLS_TLS | TLS_GD))
10797
                          {
10798
                            bfd_put_64 (output_bfd, relocation,
10799
                                        got->contents + off + 8);
10800
                            relocation = 1;
10801
                          }
10802
                      }
10803
 
10804
                    bfd_put_64 (output_bfd, relocation,
10805
                                got->contents + off);
10806
                  }
10807
              }
10808
 
10809
            if (off >= (bfd_vma) -2)
10810
              abort ();
10811
 
10812
            relocation = got->output_offset + off;
10813
 
10814
            /* TOC base (r2) is TOC start plus 0x8000.  */
10815
            addend = -TOC_BASE_OFF;
10816
          }
10817
          break;
10818
 
10819
        case R_PPC64_PLT16_HA:
10820
        case R_PPC64_PLT16_HI:
10821
        case R_PPC64_PLT16_LO:
10822
        case R_PPC64_PLT32:
10823
        case R_PPC64_PLT64:
10824
          /* Relocation is to the entry for this symbol in the
10825
             procedure linkage table.  */
10826
 
10827
          /* Resolve a PLT reloc against a local symbol directly,
10828
             without using the procedure linkage table.  */
10829
          if (h == NULL)
10830
            break;
10831
 
10832
          /* It's possible that we didn't make a PLT entry for this
10833
             symbol.  This happens when statically linking PIC code,
10834
             or when using -Bsymbolic.  Go find a match if there is a
10835
             PLT entry.  */
10836
          if (htab->plt != NULL)
10837
            {
10838
              struct plt_entry *ent;
10839
              for (ent = h->elf.plt.plist; ent != NULL; ent = ent->next)
10840
                if (ent->addend == orig_addend
10841
                    && ent->plt.offset != (bfd_vma) -1)
10842
                  {
10843
                    relocation = (htab->plt->output_section->vma
10844
                                  + htab->plt->output_offset
10845
                                  + ent->plt.offset);
10846
                    unresolved_reloc = FALSE;
10847
                  }
10848
            }
10849
          break;
10850
 
10851
        case R_PPC64_TOC:
10852
          /* Relocation value is TOC base.  */
10853
          relocation = TOCstart;
10854
          if (r_symndx == 0)
10855
            relocation += htab->stub_group[input_section->id].toc_off;
10856
          else if (unresolved_reloc)
10857
            ;
10858
          else if (sec != NULL && sec->id <= htab->top_id)
10859
            relocation += htab->stub_group[sec->id].toc_off;
10860
          else
10861
            unresolved_reloc = TRUE;
10862
          goto dodyn;
10863
 
10864
          /* TOC16 relocs.  We want the offset relative to the TOC base,
10865
             which is the address of the start of the TOC plus 0x8000.
10866
             The TOC consists of sections .got, .toc, .tocbss, and .plt,
10867
             in this order.  */
10868
        case R_PPC64_TOC16:
10869
        case R_PPC64_TOC16_LO:
10870
        case R_PPC64_TOC16_HI:
10871
        case R_PPC64_TOC16_DS:
10872
        case R_PPC64_TOC16_LO_DS:
10873
        case R_PPC64_TOC16_HA:
10874
          addend -= TOCstart + htab->stub_group[input_section->id].toc_off;
10875
          break;
10876
 
10877
          /* Relocate against the beginning of the section.  */
10878
        case R_PPC64_SECTOFF:
10879
        case R_PPC64_SECTOFF_LO:
10880
        case R_PPC64_SECTOFF_HI:
10881
        case R_PPC64_SECTOFF_DS:
10882
        case R_PPC64_SECTOFF_LO_DS:
10883
        case R_PPC64_SECTOFF_HA:
10884
          if (sec != NULL)
10885
            addend -= sec->output_section->vma;
10886
          break;
10887
 
10888
        case R_PPC64_REL14:
10889
        case R_PPC64_REL14_BRNTAKEN:
10890
        case R_PPC64_REL14_BRTAKEN:
10891
        case R_PPC64_REL24:
10892
          break;
10893
 
10894
        case R_PPC64_TPREL16:
10895
        case R_PPC64_TPREL16_LO:
10896
        case R_PPC64_TPREL16_HI:
10897
        case R_PPC64_TPREL16_HA:
10898
        case R_PPC64_TPREL16_DS:
10899
        case R_PPC64_TPREL16_LO_DS:
10900
        case R_PPC64_TPREL16_HIGHER:
10901
        case R_PPC64_TPREL16_HIGHERA:
10902
        case R_PPC64_TPREL16_HIGHEST:
10903
        case R_PPC64_TPREL16_HIGHESTA:
10904
          addend -= htab->elf.tls_sec->vma + TP_OFFSET;
10905
          if (info->shared)
10906
            /* The TPREL16 relocs shouldn't really be used in shared
10907
               libs as they will result in DT_TEXTREL being set, but
10908
               support them anyway.  */
10909
            goto dodyn;
10910
          break;
10911
 
10912
        case R_PPC64_DTPREL16:
10913
        case R_PPC64_DTPREL16_LO:
10914
        case R_PPC64_DTPREL16_HI:
10915
        case R_PPC64_DTPREL16_HA:
10916
        case R_PPC64_DTPREL16_DS:
10917
        case R_PPC64_DTPREL16_LO_DS:
10918
        case R_PPC64_DTPREL16_HIGHER:
10919
        case R_PPC64_DTPREL16_HIGHERA:
10920
        case R_PPC64_DTPREL16_HIGHEST:
10921
        case R_PPC64_DTPREL16_HIGHESTA:
10922
          addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
10923
          break;
10924
 
10925
        case R_PPC64_DTPMOD64:
10926
          relocation = 1;
10927
          addend = 0;
10928
          goto dodyn;
10929
 
10930
        case R_PPC64_TPREL64:
10931
          addend -= htab->elf.tls_sec->vma + TP_OFFSET;
10932
          goto dodyn;
10933
 
10934
        case R_PPC64_DTPREL64:
10935
          addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
10936
          /* Fall thru */
10937
 
10938
          /* Relocations that may need to be propagated if this is a
10939
             dynamic object.  */
10940
        case R_PPC64_REL30:
10941
        case R_PPC64_REL32:
10942
        case R_PPC64_REL64:
10943
        case R_PPC64_ADDR14:
10944
        case R_PPC64_ADDR14_BRNTAKEN:
10945
        case R_PPC64_ADDR14_BRTAKEN:
10946
        case R_PPC64_ADDR16:
10947
        case R_PPC64_ADDR16_DS:
10948
        case R_PPC64_ADDR16_HA:
10949
        case R_PPC64_ADDR16_HI:
10950
        case R_PPC64_ADDR16_HIGHER:
10951
        case R_PPC64_ADDR16_HIGHERA:
10952
        case R_PPC64_ADDR16_HIGHEST:
10953
        case R_PPC64_ADDR16_HIGHESTA:
10954
        case R_PPC64_ADDR16_LO:
10955
        case R_PPC64_ADDR16_LO_DS:
10956
        case R_PPC64_ADDR24:
10957
        case R_PPC64_ADDR32:
10958
        case R_PPC64_ADDR64:
10959
        case R_PPC64_UADDR16:
10960
        case R_PPC64_UADDR32:
10961
        case R_PPC64_UADDR64:
10962
        dodyn:
10963
          if ((input_section->flags & SEC_ALLOC) == 0)
10964
            break;
10965
 
10966
          if (NO_OPD_RELOCS && is_opd)
10967
            break;
10968
 
10969
          if ((info->shared
10970
               && (h == NULL
10971
                   || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
10972
                   || h->elf.root.type != bfd_link_hash_undefweak)
10973
               && (MUST_BE_DYN_RELOC (r_type)
10974
                   || !SYMBOL_CALLS_LOCAL (info, &h->elf)))
10975
              || (ELIMINATE_COPY_RELOCS
10976
                  && !info->shared
10977
                  && h != NULL
10978
                  && h->elf.dynindx != -1
10979
                  && !h->elf.non_got_ref
10980
                  && h->elf.def_dynamic
10981
                  && !h->elf.def_regular))
10982
            {
10983
              Elf_Internal_Rela outrel;
10984
              bfd_boolean skip, relocate;
10985
              asection *sreloc;
10986
              bfd_byte *loc;
10987
              bfd_vma out_off;
10988
 
10989
              /* When generating a dynamic object, these relocations
10990
                 are copied into the output file to be resolved at run
10991
                 time.  */
10992
 
10993
              skip = FALSE;
10994
              relocate = FALSE;
10995
 
10996
              out_off = _bfd_elf_section_offset (output_bfd, info,
10997
                                                 input_section, rel->r_offset);
10998
              if (out_off == (bfd_vma) -1)
10999
                skip = TRUE;
11000
              else if (out_off == (bfd_vma) -2)
11001
                skip = TRUE, relocate = TRUE;
11002
              out_off += (input_section->output_section->vma
11003
                          + input_section->output_offset);
11004
              outrel.r_offset = out_off;
11005
              outrel.r_addend = rel->r_addend;
11006
 
11007
              /* Optimize unaligned reloc use.  */
11008
              if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
11009
                  || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
11010
                r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
11011
              else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
11012
                       || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
11013
                r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
11014
              else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
11015
                       || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
11016
                r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
11017
 
11018
              if (skip)
11019
                memset (&outrel, 0, sizeof outrel);
11020
              else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
11021
                       && !is_opd
11022
                       && r_type != R_PPC64_TOC)
11023
                outrel.r_info = ELF64_R_INFO (h->elf.dynindx, r_type);
11024
              else
11025
                {
11026
                  /* This symbol is local, or marked to become local,
11027
                     or this is an opd section reloc which must point
11028
                     at a local function.  */
11029
                  outrel.r_addend += relocation;
11030
                  if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
11031
                    {
11032
                      if (is_opd && h != NULL)
11033
                        {
11034
                          /* Lie about opd entries.  This case occurs
11035
                             when building shared libraries and we
11036
                             reference a function in another shared
11037
                             lib.  The same thing happens for a weak
11038
                             definition in an application that's
11039
                             overridden by a strong definition in a
11040
                             shared lib.  (I believe this is a generic
11041
                             bug in binutils handling of weak syms.)
11042
                             In these cases we won't use the opd
11043
                             entry in this lib.  */
11044
                          unresolved_reloc = FALSE;
11045
                        }
11046
                      outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
11047
 
11048
                      /* We need to relocate .opd contents for ld.so.
11049
                         Prelink also wants simple and consistent rules
11050
                         for relocs.  This make all RELATIVE relocs have
11051
                         *r_offset equal to r_addend.  */
11052
                      relocate = TRUE;
11053
                    }
11054
                  else
11055
                    {
11056
                      long indx = 0;
11057
 
11058
                      if (bfd_is_abs_section (sec))
11059
                        ;
11060
                      else if (sec == NULL || sec->owner == NULL)
11061
                        {
11062
                          bfd_set_error (bfd_error_bad_value);
11063
                          return FALSE;
11064
                        }
11065
                      else
11066
                        {
11067
                          asection *osec;
11068
 
11069
                          osec = sec->output_section;
11070
                          indx = elf_section_data (osec)->dynindx;
11071
 
11072
                          if (indx == 0)
11073
                            {
11074
                              if ((osec->flags & SEC_READONLY) == 0
11075
                                  && htab->elf.data_index_section != NULL)
11076
                                osec = htab->elf.data_index_section;
11077
                              else
11078
                                osec = htab->elf.text_index_section;
11079
                              indx = elf_section_data (osec)->dynindx;
11080
                            }
11081
                          BFD_ASSERT (indx != 0);
11082
 
11083
                          /* We are turning this relocation into one
11084
                             against a section symbol, so subtract out
11085
                             the output section's address but not the
11086
                             offset of the input section in the output
11087
                             section.  */
11088
                          outrel.r_addend -= osec->vma;
11089
                        }
11090
 
11091
                      outrel.r_info = ELF64_R_INFO (indx, r_type);
11092
                    }
11093
                }
11094
 
11095
              sreloc = elf_section_data (input_section)->sreloc;
11096
              if (sreloc == NULL)
11097
                abort ();
11098
 
11099
              if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
11100
                  >= sreloc->size)
11101
                abort ();
11102
              loc = sreloc->contents;
11103
              loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
11104
              bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
11105
 
11106
              /* If this reloc is against an external symbol, it will
11107
                 be computed at runtime, so there's no need to do
11108
                 anything now.  However, for the sake of prelink ensure
11109
                 that the section contents are a known value.  */
11110
              if (! relocate)
11111
                {
11112
                  unresolved_reloc = FALSE;
11113
                  /* The value chosen here is quite arbitrary as ld.so
11114
                     ignores section contents except for the special
11115
                     case of .opd where the contents might be accessed
11116
                     before relocation.  Choose zero, as that won't
11117
                     cause reloc overflow.  */
11118
                  relocation = 0;
11119
                  addend = 0;
11120
                  /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
11121
                     to improve backward compatibility with older
11122
                     versions of ld.  */
11123
                  if (r_type == R_PPC64_ADDR64)
11124
                    addend = outrel.r_addend;
11125
                  /* Adjust pc_relative relocs to have zero in *r_offset.  */
11126
                  else if (ppc64_elf_howto_table[r_type]->pc_relative)
11127
                    addend = (input_section->output_section->vma
11128
                              + input_section->output_offset
11129
                              + rel->r_offset);
11130
                }
11131
            }
11132
          break;
11133
 
11134
        case R_PPC64_COPY:
11135
        case R_PPC64_GLOB_DAT:
11136
        case R_PPC64_JMP_SLOT:
11137
        case R_PPC64_RELATIVE:
11138
          /* We shouldn't ever see these dynamic relocs in relocatable
11139
             files.  */
11140
          /* Fall through.  */
11141
 
11142
        case R_PPC64_PLTGOT16:
11143
        case R_PPC64_PLTGOT16_DS:
11144
        case R_PPC64_PLTGOT16_HA:
11145
        case R_PPC64_PLTGOT16_HI:
11146
        case R_PPC64_PLTGOT16_LO:
11147
        case R_PPC64_PLTGOT16_LO_DS:
11148
        case R_PPC64_PLTREL32:
11149
        case R_PPC64_PLTREL64:
11150
          /* These ones haven't been implemented yet.  */
11151
 
11152
          (*_bfd_error_handler)
11153
            (_("%B: relocation %s is not supported for symbol %s."),
11154
             input_bfd,
11155
             ppc64_elf_howto_table[r_type]->name, sym_name);
11156
 
11157
          bfd_set_error (bfd_error_invalid_operation);
11158
          ret = FALSE;
11159
          continue;
11160
        }
11161
 
11162
      /* Do any further special processing.  */
11163
      switch (r_type)
11164
        {
11165
        default:
11166
          break;
11167
 
11168
        case R_PPC64_ADDR16_HA:
11169
        case R_PPC64_ADDR16_HIGHERA:
11170
        case R_PPC64_ADDR16_HIGHESTA:
11171
        case R_PPC64_TOC16_HA:
11172
        case R_PPC64_SECTOFF_HA:
11173
        case R_PPC64_TPREL16_HA:
11174
        case R_PPC64_DTPREL16_HA:
11175
        case R_PPC64_TPREL16_HIGHER:
11176
        case R_PPC64_TPREL16_HIGHERA:
11177
        case R_PPC64_TPREL16_HIGHEST:
11178
        case R_PPC64_TPREL16_HIGHESTA:
11179
        case R_PPC64_DTPREL16_HIGHER:
11180
        case R_PPC64_DTPREL16_HIGHERA:
11181
        case R_PPC64_DTPREL16_HIGHEST:
11182
        case R_PPC64_DTPREL16_HIGHESTA:
11183
          /* It's just possible that this symbol is a weak symbol
11184
             that's not actually defined anywhere. In that case,
11185
             'sec' would be NULL, and we should leave the symbol
11186
             alone (it will be set to zero elsewhere in the link).  */
11187
          if (sec == NULL)
11188
            break;
11189
          /* Fall thru */
11190
 
11191
        case R_PPC64_GOT16_HA:
11192
        case R_PPC64_PLTGOT16_HA:
11193
        case R_PPC64_PLT16_HA:
11194
        case R_PPC64_GOT_TLSGD16_HA:
11195
        case R_PPC64_GOT_TLSLD16_HA:
11196
        case R_PPC64_GOT_TPREL16_HA:
11197
        case R_PPC64_GOT_DTPREL16_HA:
11198
          /* Add 0x10000 if sign bit in 0:15 is set.
11199
             Bits 0:15 are not used.  */
11200
          addend += 0x8000;
11201
          break;
11202
 
11203
        case R_PPC64_ADDR16_DS:
11204
        case R_PPC64_ADDR16_LO_DS:
11205
        case R_PPC64_GOT16_DS:
11206
        case R_PPC64_GOT16_LO_DS:
11207
        case R_PPC64_PLT16_LO_DS:
11208
        case R_PPC64_SECTOFF_DS:
11209
        case R_PPC64_SECTOFF_LO_DS:
11210
        case R_PPC64_TOC16_DS:
11211
        case R_PPC64_TOC16_LO_DS:
11212
        case R_PPC64_PLTGOT16_DS:
11213
        case R_PPC64_PLTGOT16_LO_DS:
11214
        case R_PPC64_GOT_TPREL16_DS:
11215
        case R_PPC64_GOT_TPREL16_LO_DS:
11216
        case R_PPC64_GOT_DTPREL16_DS:
11217
        case R_PPC64_GOT_DTPREL16_LO_DS:
11218
        case R_PPC64_TPREL16_DS:
11219
        case R_PPC64_TPREL16_LO_DS:
11220
        case R_PPC64_DTPREL16_DS:
11221
        case R_PPC64_DTPREL16_LO_DS:
11222
          insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
11223
          mask = 3;
11224
          /* If this reloc is against an lq insn, then the value must be
11225
             a multiple of 16.  This is somewhat of a hack, but the
11226
             "correct" way to do this by defining _DQ forms of all the
11227
             _DS relocs bloats all reloc switches in this file.  It
11228
             doesn't seem to make much sense to use any of these relocs
11229
             in data, so testing the insn should be safe.  */
11230
          if ((insn & (0x3f << 26)) == (56u << 26))
11231
            mask = 15;
11232
          if (((relocation + addend) & mask) != 0)
11233
            {
11234
              (*_bfd_error_handler)
11235
                (_("%B: error: relocation %s not a multiple of %d"),
11236
                 input_bfd,
11237
                 ppc64_elf_howto_table[r_type]->name,
11238
                 mask + 1);
11239
              bfd_set_error (bfd_error_bad_value);
11240
              ret = FALSE;
11241
              continue;
11242
            }
11243
          break;
11244
        }
11245
 
11246
      /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
11247
         because such sections are not SEC_ALLOC and thus ld.so will
11248
         not process them.  */
11249
      if (unresolved_reloc
11250
          && !((input_section->flags & SEC_DEBUGGING) != 0
11251
               && h->elf.def_dynamic))
11252
        {
11253
          (*_bfd_error_handler)
11254
            (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
11255
             input_bfd,
11256
             input_section,
11257
             (long) rel->r_offset,
11258
             ppc64_elf_howto_table[(int) r_type]->name,
11259
             h->elf.root.root.string);
11260
          ret = FALSE;
11261
        }
11262
 
11263
      r = _bfd_final_link_relocate (ppc64_elf_howto_table[(int) r_type],
11264
                                    input_bfd,
11265
                                    input_section,
11266
                                    contents,
11267
                                    rel->r_offset,
11268
                                    relocation,
11269
                                    addend);
11270
 
11271
      if (r != bfd_reloc_ok)
11272
        {
11273
          if (sym_name == NULL)
11274
            sym_name = "(null)";
11275
          if (r == bfd_reloc_overflow)
11276
            {
11277
              if (warned)
11278
                continue;
11279
              if (h != NULL
11280
                  && h->elf.root.type == bfd_link_hash_undefweak
11281
                  && ppc64_elf_howto_table[r_type]->pc_relative)
11282
                {
11283
                  /* Assume this is a call protected by other code that
11284
                     detects the symbol is undefined.  If this is the case,
11285
                     we can safely ignore the overflow.  If not, the
11286
                     program is hosed anyway, and a little warning isn't
11287
                     going to help.  */
11288
 
11289
                  continue;
11290
                }
11291
 
11292
              if (!((*info->callbacks->reloc_overflow)
11293
                    (info, (h ? &h->elf.root : NULL), sym_name,
11294
                     ppc64_elf_howto_table[r_type]->name,
11295
                     orig_addend, input_bfd, input_section, rel->r_offset)))
11296
                return FALSE;
11297
            }
11298
          else
11299
            {
11300
              (*_bfd_error_handler)
11301
                (_("%B(%A+0x%lx): %s reloc against `%s': error %d"),
11302
                 input_bfd,
11303
                 input_section,
11304
                 (long) rel->r_offset,
11305
                 ppc64_elf_howto_table[r_type]->name,
11306
                 sym_name,
11307
                 (int) r);
11308
              ret = FALSE;
11309
            }
11310
        }
11311
    }
11312
 
11313
  /* If we're emitting relocations, then shortly after this function
11314
     returns, reloc offsets and addends for this section will be
11315
     adjusted.  Worse, reloc symbol indices will be for the output
11316
     file rather than the input.  Save a copy of the relocs for
11317
     opd_entry_value.  */
11318
  if (is_opd && (info->emitrelocations || info->relocatable))
11319
    {
11320
      bfd_size_type amt;
11321
      amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
11322
      rel = bfd_alloc (input_bfd, amt);
11323
      BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd_relocs == NULL);
11324
      ppc64_elf_tdata (input_bfd)->opd_relocs = rel;
11325
      if (rel == NULL)
11326
        return FALSE;
11327
      memcpy (rel, relocs, amt);
11328
    }
11329
  return ret;
11330
}
11331
 
11332
/* Adjust the value of any local symbols in opd sections.  */
11333
 
11334
static bfd_boolean
11335
ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
11336
                              const char *name ATTRIBUTE_UNUSED,
11337
                              Elf_Internal_Sym *elfsym,
11338
                              asection *input_sec,
11339
                              struct elf_link_hash_entry *h)
11340
{
11341
  struct _opd_sec_data *opd;
11342
  long adjust;
11343
  bfd_vma value;
11344
 
11345
  if (h != NULL)
11346
    return TRUE;
11347
 
11348
  opd = get_opd_info (input_sec);
11349
  if (opd == NULL || opd->adjust == NULL)
11350
    return TRUE;
11351
 
11352
  value = elfsym->st_value - input_sec->output_offset;
11353
  if (!info->relocatable)
11354
    value -= input_sec->output_section->vma;
11355
 
11356
  adjust = opd->adjust[value / 8];
11357
  if (adjust == -1)
11358
    elfsym->st_value = 0;
11359
  else
11360
    elfsym->st_value += adjust;
11361
  return TRUE;
11362
}
11363
 
11364
/* Finish up dynamic symbol handling.  We set the contents of various
11365
   dynamic sections here.  */
11366
 
11367
static bfd_boolean
11368
ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
11369
                                 struct bfd_link_info *info,
11370
                                 struct elf_link_hash_entry *h,
11371
                                 Elf_Internal_Sym *sym)
11372
{
11373
  struct ppc_link_hash_table *htab;
11374
  struct plt_entry *ent;
11375
  Elf_Internal_Rela rela;
11376
  bfd_byte *loc;
11377
 
11378
  htab = ppc_hash_table (info);
11379
 
11380
  for (ent = h->plt.plist; ent != NULL; ent = ent->next)
11381
    if (ent->plt.offset != (bfd_vma) -1)
11382
      {
11383
        /* This symbol has an entry in the procedure linkage
11384
           table.  Set it up.  */
11385
 
11386
        if (htab->plt == NULL
11387
            || htab->relplt == NULL
11388
            || htab->glink == NULL)
11389
          abort ();
11390
 
11391
        /* Create a JMP_SLOT reloc to inform the dynamic linker to
11392
           fill in the PLT entry.  */
11393
        rela.r_offset = (htab->plt->output_section->vma
11394
                         + htab->plt->output_offset
11395
                         + ent->plt.offset);
11396
        rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
11397
        rela.r_addend = ent->addend;
11398
 
11399
        loc = htab->relplt->contents;
11400
        loc += ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE) / PLT_ENTRY_SIZE
11401
                * sizeof (Elf64_External_Rela));
11402
        bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
11403
      }
11404
 
11405
  if (h->needs_copy)
11406
    {
11407
      Elf_Internal_Rela rela;
11408
      bfd_byte *loc;
11409
 
11410
      /* This symbol needs a copy reloc.  Set it up.  */
11411
 
11412
      if (h->dynindx == -1
11413
          || (h->root.type != bfd_link_hash_defined
11414
              && h->root.type != bfd_link_hash_defweak)
11415
          || htab->relbss == NULL)
11416
        abort ();
11417
 
11418
      rela.r_offset = (h->root.u.def.value
11419
                       + h->root.u.def.section->output_section->vma
11420
                       + h->root.u.def.section->output_offset);
11421
      rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
11422
      rela.r_addend = 0;
11423
      loc = htab->relbss->contents;
11424
      loc += htab->relbss->reloc_count++ * sizeof (Elf64_External_Rela);
11425
      bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
11426
    }
11427
 
11428
  /* Mark some specially defined symbols as absolute.  */
11429
  if (strcmp (h->root.root.string, "_DYNAMIC") == 0)
11430
    sym->st_shndx = SHN_ABS;
11431
 
11432
  return TRUE;
11433
}
11434
 
11435
/* Used to decide how to sort relocs in an optimal manner for the
11436
   dynamic linker, before writing them out.  */
11437
 
11438
static enum elf_reloc_type_class
11439
ppc64_elf_reloc_type_class (const Elf_Internal_Rela *rela)
11440
{
11441
  enum elf_ppc64_reloc_type r_type;
11442
 
11443
  r_type = ELF64_R_TYPE (rela->r_info);
11444
  switch (r_type)
11445
    {
11446
    case R_PPC64_RELATIVE:
11447
      return reloc_class_relative;
11448
    case R_PPC64_JMP_SLOT:
11449
      return reloc_class_plt;
11450
    case R_PPC64_COPY:
11451
      return reloc_class_copy;
11452
    default:
11453
      return reloc_class_normal;
11454
    }
11455
}
11456
 
11457
/* Finish up the dynamic sections.  */
11458
 
11459
static bfd_boolean
11460
ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
11461
                                   struct bfd_link_info *info)
11462
{
11463
  struct ppc_link_hash_table *htab;
11464
  bfd *dynobj;
11465
  asection *sdyn;
11466
 
11467
  htab = ppc_hash_table (info);
11468
  dynobj = htab->elf.dynobj;
11469
  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
11470
 
11471
  if (htab->elf.dynamic_sections_created)
11472
    {
11473
      Elf64_External_Dyn *dyncon, *dynconend;
11474
 
11475
      if (sdyn == NULL || htab->got == NULL)
11476
        abort ();
11477
 
11478
      dyncon = (Elf64_External_Dyn *) sdyn->contents;
11479
      dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
11480
      for (; dyncon < dynconend; dyncon++)
11481
        {
11482
          Elf_Internal_Dyn dyn;
11483
          asection *s;
11484
 
11485
          bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
11486
 
11487
          switch (dyn.d_tag)
11488
            {
11489
            default:
11490
              continue;
11491
 
11492
            case DT_PPC64_GLINK:
11493
              s = htab->glink;
11494
              dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
11495
              /* We stupidly defined DT_PPC64_GLINK to be the start
11496
                 of glink rather than the first entry point, which is
11497
                 what ld.so needs, and now have a bigger stub to
11498
                 support automatic multiple TOCs.  */
11499
              dyn.d_un.d_ptr += GLINK_CALL_STUB_SIZE - 32;
11500
              break;
11501
 
11502
            case DT_PPC64_OPD:
11503
              s = bfd_get_section_by_name (output_bfd, ".opd");
11504
              if (s == NULL)
11505
                continue;
11506
              dyn.d_un.d_ptr = s->vma;
11507
              break;
11508
 
11509
            case DT_PPC64_OPDSZ:
11510
              s = bfd_get_section_by_name (output_bfd, ".opd");
11511
              if (s == NULL)
11512
                continue;
11513
              dyn.d_un.d_val = s->size;
11514
              break;
11515
 
11516
            case DT_PLTGOT:
11517
              s = htab->plt;
11518
              dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
11519
              break;
11520
 
11521
            case DT_JMPREL:
11522
              s = htab->relplt;
11523
              dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
11524
              break;
11525
 
11526
            case DT_PLTRELSZ:
11527
              dyn.d_un.d_val = htab->relplt->size;
11528
              break;
11529
 
11530
            case DT_RELASZ:
11531
              /* Don't count procedure linkage table relocs in the
11532
                 overall reloc count.  */
11533
              s = htab->relplt;
11534
              if (s == NULL)
11535
                continue;
11536
              dyn.d_un.d_val -= s->size;
11537
              break;
11538
 
11539
            case DT_RELA:
11540
              /* We may not be using the standard ELF linker script.
11541
                 If .rela.plt is the first .rela section, we adjust
11542
                 DT_RELA to not include it.  */
11543
              s = htab->relplt;
11544
              if (s == NULL)
11545
                continue;
11546
              if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
11547
                continue;
11548
              dyn.d_un.d_ptr += s->size;
11549
              break;
11550
            }
11551
 
11552
          bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
11553
        }
11554
    }
11555
 
11556
  if (htab->got != NULL && htab->got->size != 0)
11557
    {
11558
      /* Fill in the first entry in the global offset table.
11559
         We use it to hold the link-time TOCbase.  */
11560
      bfd_put_64 (output_bfd,
11561
                  elf_gp (output_bfd) + TOC_BASE_OFF,
11562
                  htab->got->contents);
11563
 
11564
      /* Set .got entry size.  */
11565
      elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 8;
11566
    }
11567
 
11568
  if (htab->plt != NULL && htab->plt->size != 0)
11569
    {
11570
      /* Set .plt entry size.  */
11571
      elf_section_data (htab->plt->output_section)->this_hdr.sh_entsize
11572
        = PLT_ENTRY_SIZE;
11573
    }
11574
 
11575
  /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
11576
     brlt ourselves if emitrelocations.  */
11577
  if (htab->brlt != NULL
11578
      && htab->brlt->reloc_count != 0
11579
      && !_bfd_elf_link_output_relocs (output_bfd,
11580
                                       htab->brlt,
11581
                                       &elf_section_data (htab->brlt)->rel_hdr,
11582
                                       elf_section_data (htab->brlt)->relocs,
11583
                                       NULL))
11584
    return FALSE;
11585
 
11586
  /* We need to handle writing out multiple GOT sections ourselves,
11587
     since we didn't add them to DYNOBJ.  We know dynobj is the first
11588
     bfd.  */
11589
  while ((dynobj = dynobj->link_next) != NULL)
11590
    {
11591
      asection *s;
11592
 
11593
      if (!is_ppc64_elf (dynobj))
11594
        continue;
11595
 
11596
      s = ppc64_elf_tdata (dynobj)->got;
11597
      if (s != NULL
11598
          && s->size != 0
11599
          && s->output_section != bfd_abs_section_ptr
11600
          && !bfd_set_section_contents (output_bfd, s->output_section,
11601
                                        s->contents, s->output_offset,
11602
                                        s->size))
11603
        return FALSE;
11604
      s = ppc64_elf_tdata (dynobj)->relgot;
11605
      if (s != NULL
11606
          && s->size != 0
11607
          && s->output_section != bfd_abs_section_ptr
11608
          && !bfd_set_section_contents (output_bfd, s->output_section,
11609
                                        s->contents, s->output_offset,
11610
                                        s->size))
11611
        return FALSE;
11612
    }
11613
 
11614
  return TRUE;
11615
}
11616
 
11617
#include "elf64-target.h"

powered by: WebSVN 2.1.0

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