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

Subversion Repositories open8_urisc

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

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

Line No. Rev Author Line
1 14 khays
/* PowerPC64-specific support for 64-bit ELF.
2
   Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
3
   2009, 2010, 2011 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.
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_TARGET_ID           PPC64_ELF_DATA
65
#define ELF_MACHINE_CODE        EM_PPC64
66
#define ELF_MAXPAGESIZE         0x10000
67
#define ELF_COMMONPAGESIZE      0x1000
68
#define elf_info_to_howto       ppc64_elf_info_to_howto
69
 
70
#define elf_backend_want_got_sym 0
71
#define elf_backend_want_plt_sym 0
72
#define elf_backend_plt_alignment 3
73
#define elf_backend_plt_not_loaded 1
74
#define elf_backend_got_header_size 8
75
#define elf_backend_can_gc_sections 1
76
#define elf_backend_can_refcount 1
77
#define elf_backend_rela_normal 1
78
#define elf_backend_default_execstack 0
79
 
80
#define bfd_elf64_mkobject                    ppc64_elf_mkobject
81
#define bfd_elf64_bfd_reloc_type_lookup       ppc64_elf_reloc_type_lookup
82
#define bfd_elf64_bfd_reloc_name_lookup       ppc64_elf_reloc_name_lookup
83
#define bfd_elf64_bfd_merge_private_bfd_data  ppc64_elf_merge_private_bfd_data
84
#define bfd_elf64_new_section_hook            ppc64_elf_new_section_hook
85
#define bfd_elf64_bfd_link_hash_table_create  ppc64_elf_link_hash_table_create
86
#define bfd_elf64_bfd_link_hash_table_free    ppc64_elf_link_hash_table_free
87
#define bfd_elf64_get_synthetic_symtab        ppc64_elf_get_synthetic_symtab
88
#define bfd_elf64_bfd_link_just_syms          ppc64_elf_link_just_syms
89
 
90
#define elf_backend_object_p                  ppc64_elf_object_p
91
#define elf_backend_grok_prstatus             ppc64_elf_grok_prstatus
92
#define elf_backend_grok_psinfo               ppc64_elf_grok_psinfo
93
#define elf_backend_write_core_note           ppc64_elf_write_core_note
94
#define elf_backend_create_dynamic_sections   ppc64_elf_create_dynamic_sections
95
#define elf_backend_copy_indirect_symbol      ppc64_elf_copy_indirect_symbol
96
#define elf_backend_add_symbol_hook           ppc64_elf_add_symbol_hook
97
#define elf_backend_check_directives          ppc64_elf_process_dot_syms
98
#define elf_backend_as_needed_cleanup         ppc64_elf_as_needed_cleanup
99
#define elf_backend_archive_symbol_lookup     ppc64_elf_archive_symbol_lookup
100
#define elf_backend_check_relocs              ppc64_elf_check_relocs
101
#define elf_backend_gc_keep                   ppc64_elf_gc_keep
102
#define elf_backend_gc_mark_dynamic_ref       ppc64_elf_gc_mark_dynamic_ref
103
#define elf_backend_gc_mark_hook              ppc64_elf_gc_mark_hook
104
#define elf_backend_gc_sweep_hook             ppc64_elf_gc_sweep_hook
105
#define elf_backend_adjust_dynamic_symbol     ppc64_elf_adjust_dynamic_symbol
106
#define elf_backend_hide_symbol               ppc64_elf_hide_symbol
107
#define elf_backend_always_size_sections      ppc64_elf_func_desc_adjust
108
#define elf_backend_size_dynamic_sections     ppc64_elf_size_dynamic_sections
109
#define elf_backend_init_index_section        _bfd_elf_init_2_index_sections
110
#define elf_backend_action_discarded          ppc64_elf_action_discarded
111
#define elf_backend_relocate_section          ppc64_elf_relocate_section
112
#define elf_backend_finish_dynamic_symbol     ppc64_elf_finish_dynamic_symbol
113
#define elf_backend_reloc_type_class          ppc64_elf_reloc_type_class
114
#define elf_backend_finish_dynamic_sections   ppc64_elf_finish_dynamic_sections
115
#define elf_backend_link_output_symbol_hook   ppc64_elf_output_symbol_hook
116
#define elf_backend_special_sections          ppc64_elf_special_sections
117
#define elf_backend_post_process_headers      _bfd_elf_set_osabi
118
 
119
/* The name of the dynamic interpreter.  This is put in the .interp
120
   section.  */
121
#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
122
 
123
/* The size in bytes of an entry in the procedure linkage table.  */
124
#define PLT_ENTRY_SIZE 24
125
 
126
/* The initial size of the plt reserved for the dynamic linker.  */
127
#define PLT_INITIAL_ENTRY_SIZE PLT_ENTRY_SIZE
128
 
129
/* TOC base pointers offset from start of TOC.  */
130
#define TOC_BASE_OFF    0x8000
131
 
132
/* Offset of tp and dtp pointers from start of TLS block.  */
133
#define TP_OFFSET       0x7000
134
#define DTP_OFFSET      0x8000
135
 
136
/* .plt call stub instructions.  The normal stub is like this, but
137
   sometimes the .plt entry crosses a 64k boundary and we need to
138
   insert an addi to adjust r12.  */
139
#define PLT_CALL_STUB_SIZE (7*4)
140
#define ADDIS_R12_R2    0x3d820000      /* addis %r12,%r2,xxx@ha     */
141
#define STD_R2_40R1     0xf8410028      /* std   %r2,40(%r1)         */
142
#define LD_R11_0R12     0xe96c0000      /* ld    %r11,xxx+0@l(%r12)  */
143
#define MTCTR_R11       0x7d6903a6      /* mtctr %r11                */
144
#define LD_R2_0R12      0xe84c0000      /* ld    %r2,xxx+8@l(%r12)   */
145
                                        /* ld    %r11,xxx+16@l(%r12) */
146
#define BCTR            0x4e800420      /* bctr                      */
147
 
148
 
149
#define ADDIS_R12_R12   0x3d8c0000      /* addis %r12,%r12,off@ha  */
150
#define ADDI_R12_R12    0x398c0000      /* addi %r12,%r12,off@l  */
151
#define ADDIS_R2_R2     0x3c420000      /* addis %r2,%r2,off@ha  */
152
#define ADDI_R2_R2      0x38420000      /* addi  %r2,%r2,off@l   */
153
 
154
#define LD_R11_0R2      0xe9620000      /* ld    %r11,xxx+0(%r2) */
155
#define LD_R2_0R2       0xe8420000      /* ld    %r2,xxx+0(%r2)  */
156
 
157
#define LD_R2_40R1      0xe8410028      /* ld    %r2,40(%r1)     */
158
 
159
/* glink call stub instructions.  We enter with the index in R0.  */
160
#define GLINK_CALL_STUB_SIZE (16*4)
161
                                        /* 0:                           */
162
                                        /*  .quad plt0-1f               */
163
                                        /* __glink:                     */
164
#define MFLR_R12        0x7d8802a6      /*  mflr %12                    */
165
#define BCL_20_31       0x429f0005      /*  bcl 20,31,1f                */
166
                                        /* 1:                           */
167
#define MFLR_R11        0x7d6802a6      /*  mflr %11                    */
168
#define LD_R2_M16R11    0xe84bfff0      /*  ld %2,(0b-1b)(%11)          */
169
#define MTLR_R12        0x7d8803a6      /*  mtlr %12                    */
170
#define ADD_R12_R2_R11  0x7d825a14      /*  add %12,%2,%11              */
171
                                        /*  ld %11,0(%12)               */
172
                                        /*  ld %2,8(%12)                */
173
                                        /*  mtctr %11                   */
174
                                        /*  ld %11,16(%12)              */
175
                                        /*  bctr                        */
176
 
177
/* Pad with this.  */
178
#define NOP             0x60000000
179
 
180
/* Some other nops.  */
181
#define CROR_151515     0x4def7b82
182
#define CROR_313131     0x4ffffb82
183
 
184
/* .glink entries for the first 32k functions are two instructions.  */
185
#define LI_R0_0         0x38000000      /* li    %r0,0          */
186
#define B_DOT           0x48000000      /* b     .              */
187
 
188
/* After that, we need two instructions to load the index, followed by
189
   a branch.  */
190
#define LIS_R0_0        0x3c000000      /* lis   %r0,0          */
191
#define ORI_R0_R0_0     0x60000000      /* ori   %r0,%r0,0      */
192
 
193
/* Instructions used by the save and restore reg functions.  */
194
#define STD_R0_0R1      0xf8010000      /* std   %r0,0(%r1)     */
195
#define STD_R0_0R12     0xf80c0000      /* std   %r0,0(%r12)    */
196
#define LD_R0_0R1       0xe8010000      /* ld    %r0,0(%r1)     */
197
#define LD_R0_0R12      0xe80c0000      /* ld    %r0,0(%r12)    */
198
#define STFD_FR0_0R1    0xd8010000      /* stfd  %fr0,0(%r1)    */
199
#define LFD_FR0_0R1     0xc8010000      /* lfd   %fr0,0(%r1)    */
200
#define LI_R12_0        0x39800000      /* li    %r12,0         */
201
#define STVX_VR0_R12_R0 0x7c0c01ce      /* stvx  %v0,%r12,%r0   */
202
#define LVX_VR0_R12_R0  0x7c0c00ce      /* lvx   %v0,%r12,%r0   */
203
#define MTLR_R0         0x7c0803a6      /* mtlr  %r0            */
204
#define BLR             0x4e800020      /* blr                  */
205
 
206
/* Since .opd is an array of descriptors and each entry will end up
207
   with identical R_PPC64_RELATIVE relocs, there is really no need to
208
   propagate .opd relocs;  The dynamic linker should be taught to
209
   relocate .opd without reloc entries.  */
210
#ifndef NO_OPD_RELOCS
211
#define NO_OPD_RELOCS 0
212
#endif
213
 
214
#define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
215
 
216
/* Relocation HOWTO's.  */
217
static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
218
 
219
static reloc_howto_type ppc64_elf_howto_raw[] = {
220
  /* This reloc does nothing.  */
221
  HOWTO (R_PPC64_NONE,          /* type */
222
         0,                      /* rightshift */
223
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
224
         32,                    /* bitsize */
225
         FALSE,                 /* pc_relative */
226
         0,                      /* bitpos */
227
         complain_overflow_dont, /* complain_on_overflow */
228
         bfd_elf_generic_reloc, /* special_function */
229
         "R_PPC64_NONE",        /* name */
230
         FALSE,                 /* partial_inplace */
231
         0,                      /* src_mask */
232
         0,                      /* dst_mask */
233
         FALSE),                /* pcrel_offset */
234
 
235
  /* A standard 32 bit relocation.  */
236
  HOWTO (R_PPC64_ADDR32,        /* type */
237
         0,                      /* rightshift */
238
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
239
         32,                    /* bitsize */
240
         FALSE,                 /* pc_relative */
241
         0,                      /* bitpos */
242
         complain_overflow_bitfield, /* complain_on_overflow */
243
         bfd_elf_generic_reloc, /* special_function */
244
         "R_PPC64_ADDR32",      /* name */
245
         FALSE,                 /* partial_inplace */
246
         0,                      /* src_mask */
247
         0xffffffff,            /* dst_mask */
248
         FALSE),                /* pcrel_offset */
249
 
250
  /* An absolute 26 bit branch; the lower two bits must be zero.
251
     FIXME: we don't check that, we just clear them.  */
252
  HOWTO (R_PPC64_ADDR24,        /* type */
253
         0,                      /* rightshift */
254
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
255
         26,                    /* bitsize */
256
         FALSE,                 /* pc_relative */
257
         0,                      /* bitpos */
258
         complain_overflow_bitfield, /* complain_on_overflow */
259
         bfd_elf_generic_reloc, /* special_function */
260
         "R_PPC64_ADDR24",      /* name */
261
         FALSE,                 /* partial_inplace */
262
         0,                      /* src_mask */
263
         0x03fffffc,            /* dst_mask */
264
         FALSE),                /* pcrel_offset */
265
 
266
  /* A standard 16 bit relocation.  */
267
  HOWTO (R_PPC64_ADDR16,        /* type */
268
         0,                      /* rightshift */
269
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
270
         16,                    /* bitsize */
271
         FALSE,                 /* pc_relative */
272
         0,                      /* bitpos */
273
         complain_overflow_bitfield, /* complain_on_overflow */
274
         bfd_elf_generic_reloc, /* special_function */
275
         "R_PPC64_ADDR16",      /* name */
276
         FALSE,                 /* partial_inplace */
277
         0,                      /* src_mask */
278
         0xffff,                /* dst_mask */
279
         FALSE),                /* pcrel_offset */
280
 
281
  /* A 16 bit relocation without overflow.  */
282
  HOWTO (R_PPC64_ADDR16_LO,     /* type */
283
         0,                      /* rightshift */
284
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
285
         16,                    /* bitsize */
286
         FALSE,                 /* pc_relative */
287
         0,                      /* bitpos */
288
         complain_overflow_dont,/* complain_on_overflow */
289
         bfd_elf_generic_reloc, /* special_function */
290
         "R_PPC64_ADDR16_LO",   /* name */
291
         FALSE,                 /* partial_inplace */
292
         0,                      /* src_mask */
293
         0xffff,                /* dst_mask */
294
         FALSE),                /* pcrel_offset */
295
 
296
  /* Bits 16-31 of an address.  */
297
  HOWTO (R_PPC64_ADDR16_HI,     /* type */
298
         16,                    /* rightshift */
299
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
300
         16,                    /* bitsize */
301
         FALSE,                 /* pc_relative */
302
         0,                      /* bitpos */
303
         complain_overflow_dont, /* complain_on_overflow */
304
         bfd_elf_generic_reloc, /* special_function */
305
         "R_PPC64_ADDR16_HI",   /* name */
306
         FALSE,                 /* partial_inplace */
307
         0,                      /* src_mask */
308
         0xffff,                /* dst_mask */
309
         FALSE),                /* pcrel_offset */
310
 
311
  /* Bits 16-31 of an address, plus 1 if the contents of the low 16
312
     bits, treated as a signed number, is negative.  */
313
  HOWTO (R_PPC64_ADDR16_HA,     /* type */
314
         16,                    /* rightshift */
315
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
316
         16,                    /* bitsize */
317
         FALSE,                 /* pc_relative */
318
         0,                      /* bitpos */
319
         complain_overflow_dont, /* complain_on_overflow */
320
         ppc64_elf_ha_reloc,    /* special_function */
321
         "R_PPC64_ADDR16_HA",   /* name */
322
         FALSE,                 /* partial_inplace */
323
         0,                      /* src_mask */
324
         0xffff,                /* dst_mask */
325
         FALSE),                /* pcrel_offset */
326
 
327
  /* An absolute 16 bit branch; the lower two bits must be zero.
328
     FIXME: we don't check that, we just clear them.  */
329
  HOWTO (R_PPC64_ADDR14,        /* type */
330
         0,                      /* rightshift */
331
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
332
         16,                    /* bitsize */
333
         FALSE,                 /* pc_relative */
334
         0,                      /* bitpos */
335
         complain_overflow_bitfield, /* complain_on_overflow */
336
         ppc64_elf_branch_reloc, /* special_function */
337
         "R_PPC64_ADDR14",      /* name */
338
         FALSE,                 /* partial_inplace */
339
         0,                      /* src_mask */
340
         0x0000fffc,            /* dst_mask */
341
         FALSE),                /* pcrel_offset */
342
 
343
  /* An absolute 16 bit branch, for which bit 10 should be set to
344
     indicate that the branch is expected to be taken.  The lower two
345
     bits must be zero.  */
346
  HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */
347
         0,                      /* rightshift */
348
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
349
         16,                    /* bitsize */
350
         FALSE,                 /* pc_relative */
351
         0,                      /* bitpos */
352
         complain_overflow_bitfield, /* complain_on_overflow */
353
         ppc64_elf_brtaken_reloc, /* special_function */
354
         "R_PPC64_ADDR14_BRTAKEN",/* name */
355
         FALSE,                 /* partial_inplace */
356
         0,                      /* src_mask */
357
         0x0000fffc,            /* dst_mask */
358
         FALSE),                /* pcrel_offset */
359
 
360
  /* An absolute 16 bit branch, for which bit 10 should be set to
361
     indicate that the branch is not expected to be taken.  The lower
362
     two bits must be zero.  */
363
  HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */
364
         0,                      /* rightshift */
365
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
366
         16,                    /* bitsize */
367
         FALSE,                 /* pc_relative */
368
         0,                      /* bitpos */
369
         complain_overflow_bitfield, /* complain_on_overflow */
370
         ppc64_elf_brtaken_reloc, /* special_function */
371
         "R_PPC64_ADDR14_BRNTAKEN",/* name */
372
         FALSE,                 /* partial_inplace */
373
         0,                      /* src_mask */
374
         0x0000fffc,            /* dst_mask */
375
         FALSE),                /* pcrel_offset */
376
 
377
  /* A relative 26 bit branch; the lower two bits must be zero.  */
378
  HOWTO (R_PPC64_REL24,         /* type */
379
         0,                      /* rightshift */
380
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
381
         26,                    /* bitsize */
382
         TRUE,                  /* pc_relative */
383
         0,                      /* bitpos */
384
         complain_overflow_signed, /* complain_on_overflow */
385
         ppc64_elf_branch_reloc, /* special_function */
386
         "R_PPC64_REL24",       /* name */
387
         FALSE,                 /* partial_inplace */
388
         0,                      /* src_mask */
389
         0x03fffffc,            /* dst_mask */
390
         TRUE),                 /* pcrel_offset */
391
 
392
  /* A relative 16 bit branch; the lower two bits must be zero.  */
393
  HOWTO (R_PPC64_REL14,         /* type */
394
         0,                      /* rightshift */
395
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
396
         16,                    /* bitsize */
397
         TRUE,                  /* pc_relative */
398
         0,                      /* bitpos */
399
         complain_overflow_signed, /* complain_on_overflow */
400
         ppc64_elf_branch_reloc, /* special_function */
401
         "R_PPC64_REL14",       /* name */
402
         FALSE,                 /* partial_inplace */
403
         0,                      /* src_mask */
404
         0x0000fffc,            /* dst_mask */
405
         TRUE),                 /* pcrel_offset */
406
 
407
  /* A relative 16 bit branch.  Bit 10 should be set to indicate that
408
     the branch is expected to be taken.  The lower two bits must be
409
     zero.  */
410
  HOWTO (R_PPC64_REL14_BRTAKEN, /* type */
411
         0,                      /* rightshift */
412
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
413
         16,                    /* bitsize */
414
         TRUE,                  /* pc_relative */
415
         0,                      /* bitpos */
416
         complain_overflow_signed, /* complain_on_overflow */
417
         ppc64_elf_brtaken_reloc, /* special_function */
418
         "R_PPC64_REL14_BRTAKEN", /* name */
419
         FALSE,                 /* partial_inplace */
420
         0,                      /* src_mask */
421
         0x0000fffc,            /* dst_mask */
422
         TRUE),                 /* pcrel_offset */
423
 
424
  /* A relative 16 bit branch.  Bit 10 should be set to indicate that
425
     the branch is not expected to be taken.  The lower two bits must
426
     be zero.  */
427
  HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */
428
         0,                      /* rightshift */
429
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
430
         16,                    /* bitsize */
431
         TRUE,                  /* pc_relative */
432
         0,                      /* bitpos */
433
         complain_overflow_signed, /* complain_on_overflow */
434
         ppc64_elf_brtaken_reloc, /* special_function */
435
         "R_PPC64_REL14_BRNTAKEN",/* name */
436
         FALSE,                 /* partial_inplace */
437
         0,                      /* src_mask */
438
         0x0000fffc,            /* dst_mask */
439
         TRUE),                 /* pcrel_offset */
440
 
441
  /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
442
     symbol.  */
443
  HOWTO (R_PPC64_GOT16,         /* type */
444
         0,                      /* rightshift */
445
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
446
         16,                    /* bitsize */
447
         FALSE,                 /* pc_relative */
448
         0,                      /* bitpos */
449
         complain_overflow_signed, /* complain_on_overflow */
450
         ppc64_elf_unhandled_reloc, /* special_function */
451
         "R_PPC64_GOT16",       /* name */
452
         FALSE,                 /* partial_inplace */
453
         0,                      /* src_mask */
454
         0xffff,                /* dst_mask */
455
         FALSE),                /* pcrel_offset */
456
 
457
  /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
458
     the symbol.  */
459
  HOWTO (R_PPC64_GOT16_LO,      /* type */
460
         0,                      /* rightshift */
461
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
462
         16,                    /* bitsize */
463
         FALSE,                 /* pc_relative */
464
         0,                      /* bitpos */
465
         complain_overflow_dont, /* complain_on_overflow */
466
         ppc64_elf_unhandled_reloc, /* special_function */
467
         "R_PPC64_GOT16_LO",    /* name */
468
         FALSE,                 /* partial_inplace */
469
         0,                      /* src_mask */
470
         0xffff,                /* dst_mask */
471
         FALSE),                /* pcrel_offset */
472
 
473
  /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
474
     the symbol.  */
475
  HOWTO (R_PPC64_GOT16_HI,      /* type */
476
         16,                    /* rightshift */
477
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
478
         16,                    /* bitsize */
479
         FALSE,                 /* pc_relative */
480
         0,                      /* bitpos */
481
         complain_overflow_dont,/* complain_on_overflow */
482
         ppc64_elf_unhandled_reloc, /* special_function */
483
         "R_PPC64_GOT16_HI",    /* name */
484
         FALSE,                 /* partial_inplace */
485
         0,                      /* src_mask */
486
         0xffff,                /* dst_mask */
487
         FALSE),                /* pcrel_offset */
488
 
489
  /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
490
     the symbol.  */
491
  HOWTO (R_PPC64_GOT16_HA,      /* type */
492
         16,                    /* rightshift */
493
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
494
         16,                    /* bitsize */
495
         FALSE,                 /* pc_relative */
496
         0,                      /* bitpos */
497
         complain_overflow_dont,/* complain_on_overflow */
498
         ppc64_elf_unhandled_reloc, /* special_function */
499
         "R_PPC64_GOT16_HA",    /* name */
500
         FALSE,                 /* partial_inplace */
501
         0,                      /* src_mask */
502
         0xffff,                /* dst_mask */
503
         FALSE),                /* pcrel_offset */
504
 
505
  /* This is used only by the dynamic linker.  The symbol should exist
506
     both in the object being run and in some shared library.  The
507
     dynamic linker copies the data addressed by the symbol from the
508
     shared library into the object, because the object being
509
     run has to have the data at some particular address.  */
510
  HOWTO (R_PPC64_COPY,          /* type */
511
         0,                      /* rightshift */
512
         0,                      /* this one is variable size */
513
         0,                      /* bitsize */
514
         FALSE,                 /* pc_relative */
515
         0,                      /* bitpos */
516
         complain_overflow_dont, /* complain_on_overflow */
517
         ppc64_elf_unhandled_reloc, /* special_function */
518
         "R_PPC64_COPY",        /* name */
519
         FALSE,                 /* partial_inplace */
520
         0,                      /* src_mask */
521
         0,                      /* dst_mask */
522
         FALSE),                /* pcrel_offset */
523
 
524
  /* Like R_PPC64_ADDR64, but used when setting global offset table
525
     entries.  */
526
  HOWTO (R_PPC64_GLOB_DAT,      /* type */
527
         0,                      /* rightshift */
528
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
529
         64,                    /* bitsize */
530
         FALSE,                 /* pc_relative */
531
         0,                      /* bitpos */
532
         complain_overflow_dont, /* complain_on_overflow */
533
         ppc64_elf_unhandled_reloc,  /* special_function */
534
         "R_PPC64_GLOB_DAT",    /* name */
535
         FALSE,                 /* partial_inplace */
536
         0,                      /* src_mask */
537
         ONES (64),             /* dst_mask */
538
         FALSE),                /* pcrel_offset */
539
 
540
  /* Created by the link editor.  Marks a procedure linkage table
541
     entry for a symbol.  */
542
  HOWTO (R_PPC64_JMP_SLOT,      /* type */
543
         0,                      /* rightshift */
544
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
545
         0,                      /* bitsize */
546
         FALSE,                 /* pc_relative */
547
         0,                      /* bitpos */
548
         complain_overflow_dont, /* complain_on_overflow */
549
         ppc64_elf_unhandled_reloc, /* special_function */
550
         "R_PPC64_JMP_SLOT",    /* name */
551
         FALSE,                 /* partial_inplace */
552
         0,                      /* src_mask */
553
         0,                      /* dst_mask */
554
         FALSE),                /* pcrel_offset */
555
 
556
  /* Used only by the dynamic linker.  When the object is run, this
557
     doubleword64 is set to the load address of the object, plus the
558
     addend.  */
559
  HOWTO (R_PPC64_RELATIVE,      /* type */
560
         0,                      /* rightshift */
561
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
562
         64,                    /* bitsize */
563
         FALSE,                 /* pc_relative */
564
         0,                      /* bitpos */
565
         complain_overflow_dont, /* complain_on_overflow */
566
         bfd_elf_generic_reloc, /* special_function */
567
         "R_PPC64_RELATIVE",    /* name */
568
         FALSE,                 /* partial_inplace */
569
         0,                      /* src_mask */
570
         ONES (64),             /* dst_mask */
571
         FALSE),                /* pcrel_offset */
572
 
573
  /* Like R_PPC64_ADDR32, but may be unaligned.  */
574
  HOWTO (R_PPC64_UADDR32,       /* type */
575
         0,                      /* rightshift */
576
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
577
         32,                    /* bitsize */
578
         FALSE,                 /* pc_relative */
579
         0,                      /* bitpos */
580
         complain_overflow_bitfield, /* complain_on_overflow */
581
         bfd_elf_generic_reloc, /* special_function */
582
         "R_PPC64_UADDR32",     /* name */
583
         FALSE,                 /* partial_inplace */
584
         0,                      /* src_mask */
585
         0xffffffff,            /* dst_mask */
586
         FALSE),                /* pcrel_offset */
587
 
588
  /* Like R_PPC64_ADDR16, but may be unaligned.  */
589
  HOWTO (R_PPC64_UADDR16,       /* type */
590
         0,                      /* rightshift */
591
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
592
         16,                    /* bitsize */
593
         FALSE,                 /* pc_relative */
594
         0,                      /* bitpos */
595
         complain_overflow_bitfield, /* complain_on_overflow */
596
         bfd_elf_generic_reloc, /* special_function */
597
         "R_PPC64_UADDR16",     /* name */
598
         FALSE,                 /* partial_inplace */
599
         0,                      /* src_mask */
600
         0xffff,                /* dst_mask */
601
         FALSE),                /* pcrel_offset */
602
 
603
  /* 32-bit PC relative.  */
604
  HOWTO (R_PPC64_REL32,         /* type */
605
         0,                      /* rightshift */
606
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
607
         32,                    /* bitsize */
608
         TRUE,                  /* pc_relative */
609
         0,                      /* bitpos */
610
         /* FIXME: Verify.  Was complain_overflow_bitfield.  */
611
         complain_overflow_signed, /* complain_on_overflow */
612
         bfd_elf_generic_reloc, /* special_function */
613
         "R_PPC64_REL32",       /* name */
614
         FALSE,                 /* partial_inplace */
615
         0,                      /* src_mask */
616
         0xffffffff,            /* dst_mask */
617
         TRUE),                 /* pcrel_offset */
618
 
619
  /* 32-bit relocation to the symbol's procedure linkage table.  */
620
  HOWTO (R_PPC64_PLT32,         /* type */
621
         0,                      /* rightshift */
622
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
623
         32,                    /* bitsize */
624
         FALSE,                 /* pc_relative */
625
         0,                      /* bitpos */
626
         complain_overflow_bitfield, /* complain_on_overflow */
627
         ppc64_elf_unhandled_reloc, /* special_function */
628
         "R_PPC64_PLT32",       /* name */
629
         FALSE,                 /* partial_inplace */
630
         0,                      /* src_mask */
631
         0xffffffff,            /* dst_mask */
632
         FALSE),                /* pcrel_offset */
633
 
634
  /* 32-bit PC relative relocation to the symbol's procedure linkage table.
635
     FIXME: R_PPC64_PLTREL32 not supported.  */
636
  HOWTO (R_PPC64_PLTREL32,      /* type */
637
         0,                      /* rightshift */
638
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
639
         32,                    /* bitsize */
640
         TRUE,                  /* pc_relative */
641
         0,                      /* bitpos */
642
         complain_overflow_signed, /* complain_on_overflow */
643
         bfd_elf_generic_reloc, /* special_function */
644
         "R_PPC64_PLTREL32",    /* name */
645
         FALSE,                 /* partial_inplace */
646
         0,                      /* src_mask */
647
         0xffffffff,            /* dst_mask */
648
         TRUE),                 /* pcrel_offset */
649
 
650
  /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
651
     the symbol.  */
652
  HOWTO (R_PPC64_PLT16_LO,      /* type */
653
         0,                      /* rightshift */
654
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
655
         16,                    /* bitsize */
656
         FALSE,                 /* pc_relative */
657
         0,                      /* bitpos */
658
         complain_overflow_dont, /* complain_on_overflow */
659
         ppc64_elf_unhandled_reloc, /* special_function */
660
         "R_PPC64_PLT16_LO",    /* name */
661
         FALSE,                 /* partial_inplace */
662
         0,                      /* src_mask */
663
         0xffff,                /* dst_mask */
664
         FALSE),                /* pcrel_offset */
665
 
666
  /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
667
     the symbol.  */
668
  HOWTO (R_PPC64_PLT16_HI,      /* type */
669
         16,                    /* rightshift */
670
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
671
         16,                    /* bitsize */
672
         FALSE,                 /* pc_relative */
673
         0,                      /* bitpos */
674
         complain_overflow_dont, /* complain_on_overflow */
675
         ppc64_elf_unhandled_reloc, /* special_function */
676
         "R_PPC64_PLT16_HI",    /* name */
677
         FALSE,                 /* partial_inplace */
678
         0,                      /* src_mask */
679
         0xffff,                /* dst_mask */
680
         FALSE),                /* pcrel_offset */
681
 
682
  /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
683
     the symbol.  */
684
  HOWTO (R_PPC64_PLT16_HA,      /* type */
685
         16,                    /* rightshift */
686
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
687
         16,                    /* bitsize */
688
         FALSE,                 /* pc_relative */
689
         0,                      /* bitpos */
690
         complain_overflow_dont, /* complain_on_overflow */
691
         ppc64_elf_unhandled_reloc, /* special_function */
692
         "R_PPC64_PLT16_HA",    /* name */
693
         FALSE,                 /* partial_inplace */
694
         0,                      /* src_mask */
695
         0xffff,                /* dst_mask */
696
         FALSE),                /* pcrel_offset */
697
 
698
  /* 16-bit section relative relocation.  */
699
  HOWTO (R_PPC64_SECTOFF,       /* type */
700
         0,                      /* rightshift */
701
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
702
         16,                    /* bitsize */
703
         FALSE,                 /* pc_relative */
704
         0,                      /* bitpos */
705
         complain_overflow_bitfield, /* complain_on_overflow */
706
         ppc64_elf_sectoff_reloc, /* special_function */
707
         "R_PPC64_SECTOFF",     /* name */
708
         FALSE,                 /* partial_inplace */
709
         0,                      /* src_mask */
710
         0xffff,                /* dst_mask */
711
         FALSE),                /* pcrel_offset */
712
 
713
  /* Like R_PPC64_SECTOFF, but no overflow warning.  */
714
  HOWTO (R_PPC64_SECTOFF_LO,    /* type */
715
         0,                      /* rightshift */
716
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
717
         16,                    /* bitsize */
718
         FALSE,                 /* pc_relative */
719
         0,                      /* bitpos */
720
         complain_overflow_dont, /* complain_on_overflow */
721
         ppc64_elf_sectoff_reloc, /* special_function */
722
         "R_PPC64_SECTOFF_LO",  /* name */
723
         FALSE,                 /* partial_inplace */
724
         0,                      /* src_mask */
725
         0xffff,                /* dst_mask */
726
         FALSE),                /* pcrel_offset */
727
 
728
  /* 16-bit upper half section relative relocation.  */
729
  HOWTO (R_PPC64_SECTOFF_HI,    /* type */
730
         16,                    /* rightshift */
731
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
732
         16,                    /* bitsize */
733
         FALSE,                 /* pc_relative */
734
         0,                      /* bitpos */
735
         complain_overflow_dont, /* complain_on_overflow */
736
         ppc64_elf_sectoff_reloc, /* special_function */
737
         "R_PPC64_SECTOFF_HI",  /* name */
738
         FALSE,                 /* partial_inplace */
739
         0,                      /* src_mask */
740
         0xffff,                /* dst_mask */
741
         FALSE),                /* pcrel_offset */
742
 
743
  /* 16-bit upper half adjusted section relative relocation.  */
744
  HOWTO (R_PPC64_SECTOFF_HA,    /* type */
745
         16,                    /* rightshift */
746
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
747
         16,                    /* bitsize */
748
         FALSE,                 /* pc_relative */
749
         0,                      /* bitpos */
750
         complain_overflow_dont, /* complain_on_overflow */
751
         ppc64_elf_sectoff_ha_reloc, /* special_function */
752
         "R_PPC64_SECTOFF_HA",  /* name */
753
         FALSE,                 /* partial_inplace */
754
         0,                      /* src_mask */
755
         0xffff,                /* dst_mask */
756
         FALSE),                /* pcrel_offset */
757
 
758
  /* Like R_PPC64_REL24 without touching the two least significant bits.  */
759
  HOWTO (R_PPC64_REL30,         /* type */
760
         2,                     /* rightshift */
761
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
762
         30,                    /* bitsize */
763
         TRUE,                  /* pc_relative */
764
         0,                      /* bitpos */
765
         complain_overflow_dont, /* complain_on_overflow */
766
         bfd_elf_generic_reloc, /* special_function */
767
         "R_PPC64_REL30",       /* name */
768
         FALSE,                 /* partial_inplace */
769
         0,                      /* src_mask */
770
         0xfffffffc,            /* dst_mask */
771
         TRUE),                 /* pcrel_offset */
772
 
773
  /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI.  */
774
 
775
  /* A standard 64-bit relocation.  */
776
  HOWTO (R_PPC64_ADDR64,        /* type */
777
         0,                      /* rightshift */
778
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
779
         64,                    /* bitsize */
780
         FALSE,                 /* pc_relative */
781
         0,                      /* bitpos */
782
         complain_overflow_dont, /* complain_on_overflow */
783
         bfd_elf_generic_reloc, /* special_function */
784
         "R_PPC64_ADDR64",      /* name */
785
         FALSE,                 /* partial_inplace */
786
         0,                      /* src_mask */
787
         ONES (64),             /* dst_mask */
788
         FALSE),                /* pcrel_offset */
789
 
790
  /* The bits 32-47 of an address.  */
791
  HOWTO (R_PPC64_ADDR16_HIGHER, /* type */
792
         32,                    /* rightshift */
793
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
794
         16,                    /* bitsize */
795
         FALSE,                 /* pc_relative */
796
         0,                      /* bitpos */
797
         complain_overflow_dont, /* complain_on_overflow */
798
         bfd_elf_generic_reloc, /* special_function */
799
         "R_PPC64_ADDR16_HIGHER", /* name */
800
         FALSE,                 /* partial_inplace */
801
         0,                      /* src_mask */
802
         0xffff,                /* dst_mask */
803
         FALSE),                /* pcrel_offset */
804
 
805
  /* The bits 32-47 of an address, plus 1 if the contents of the low
806
     16 bits, treated as a signed number, is negative.  */
807
  HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */
808
         32,                    /* rightshift */
809
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
810
         16,                    /* bitsize */
811
         FALSE,                 /* pc_relative */
812
         0,                      /* bitpos */
813
         complain_overflow_dont, /* complain_on_overflow */
814
         ppc64_elf_ha_reloc,    /* special_function */
815
         "R_PPC64_ADDR16_HIGHERA", /* name */
816
         FALSE,                 /* partial_inplace */
817
         0,                      /* src_mask */
818
         0xffff,                /* dst_mask */
819
         FALSE),                /* pcrel_offset */
820
 
821
  /* The bits 48-63 of an address.  */
822
  HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */
823
         48,                    /* rightshift */
824
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
825
         16,                    /* bitsize */
826
         FALSE,                 /* pc_relative */
827
         0,                      /* bitpos */
828
         complain_overflow_dont, /* complain_on_overflow */
829
         bfd_elf_generic_reloc, /* special_function */
830
         "R_PPC64_ADDR16_HIGHEST", /* name */
831
         FALSE,                 /* partial_inplace */
832
         0,                      /* src_mask */
833
         0xffff,                /* dst_mask */
834
         FALSE),                /* pcrel_offset */
835
 
836
  /* The bits 48-63 of an address, plus 1 if the contents of the low
837
     16 bits, treated as a signed number, is negative.  */
838
  HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */
839
         48,                    /* rightshift */
840
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
841
         16,                    /* bitsize */
842
         FALSE,                 /* pc_relative */
843
         0,                      /* bitpos */
844
         complain_overflow_dont, /* complain_on_overflow */
845
         ppc64_elf_ha_reloc,    /* special_function */
846
         "R_PPC64_ADDR16_HIGHESTA", /* name */
847
         FALSE,                 /* partial_inplace */
848
         0,                      /* src_mask */
849
         0xffff,                /* dst_mask */
850
         FALSE),                /* pcrel_offset */
851
 
852
  /* Like ADDR64, but may be unaligned.  */
853
  HOWTO (R_PPC64_UADDR64,       /* type */
854
         0,                      /* rightshift */
855
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
856
         64,                    /* bitsize */
857
         FALSE,                 /* pc_relative */
858
         0,                      /* bitpos */
859
         complain_overflow_dont, /* complain_on_overflow */
860
         bfd_elf_generic_reloc, /* special_function */
861
         "R_PPC64_UADDR64",     /* name */
862
         FALSE,                 /* partial_inplace */
863
         0,                      /* src_mask */
864
         ONES (64),             /* dst_mask */
865
         FALSE),                /* pcrel_offset */
866
 
867
  /* 64-bit relative relocation.  */
868
  HOWTO (R_PPC64_REL64,         /* type */
869
         0,                      /* rightshift */
870
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
871
         64,                    /* bitsize */
872
         TRUE,                  /* pc_relative */
873
         0,                      /* bitpos */
874
         complain_overflow_dont, /* complain_on_overflow */
875
         bfd_elf_generic_reloc, /* special_function */
876
         "R_PPC64_REL64",       /* name */
877
         FALSE,                 /* partial_inplace */
878
         0,                      /* src_mask */
879
         ONES (64),             /* dst_mask */
880
         TRUE),                 /* pcrel_offset */
881
 
882
  /* 64-bit relocation to the symbol's procedure linkage table.  */
883
  HOWTO (R_PPC64_PLT64,         /* type */
884
         0,                      /* rightshift */
885
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
886
         64,                    /* bitsize */
887
         FALSE,                 /* pc_relative */
888
         0,                      /* bitpos */
889
         complain_overflow_dont, /* complain_on_overflow */
890
         ppc64_elf_unhandled_reloc, /* special_function */
891
         "R_PPC64_PLT64",       /* name */
892
         FALSE,                 /* partial_inplace */
893
         0,                      /* src_mask */
894
         ONES (64),             /* dst_mask */
895
         FALSE),                /* pcrel_offset */
896
 
897
  /* 64-bit PC relative relocation to the symbol's procedure linkage
898
     table.  */
899
  /* FIXME: R_PPC64_PLTREL64 not supported.  */
900
  HOWTO (R_PPC64_PLTREL64,      /* type */
901
         0,                      /* rightshift */
902
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
903
         64,                    /* bitsize */
904
         TRUE,                  /* pc_relative */
905
         0,                      /* bitpos */
906
         complain_overflow_dont, /* complain_on_overflow */
907
         ppc64_elf_unhandled_reloc, /* special_function */
908
         "R_PPC64_PLTREL64",    /* name */
909
         FALSE,                 /* partial_inplace */
910
         0,                      /* src_mask */
911
         ONES (64),             /* dst_mask */
912
         TRUE),                 /* pcrel_offset */
913
 
914
  /* 16 bit TOC-relative relocation.  */
915
 
916
  /* R_PPC64_TOC16        47       half16*      S + A - .TOC.  */
917
  HOWTO (R_PPC64_TOC16,         /* type */
918
         0,                      /* rightshift */
919
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
920
         16,                    /* bitsize */
921
         FALSE,                 /* pc_relative */
922
         0,                      /* bitpos */
923
         complain_overflow_signed, /* complain_on_overflow */
924
         ppc64_elf_toc_reloc,   /* special_function */
925
         "R_PPC64_TOC16",       /* name */
926
         FALSE,                 /* partial_inplace */
927
         0,                      /* src_mask */
928
         0xffff,                /* dst_mask */
929
         FALSE),                /* pcrel_offset */
930
 
931
  /* 16 bit TOC-relative relocation without overflow.  */
932
 
933
  /* R_PPC64_TOC16_LO     48       half16        #lo (S + A - .TOC.)  */
934
  HOWTO (R_PPC64_TOC16_LO,      /* type */
935
         0,                      /* rightshift */
936
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
937
         16,                    /* bitsize */
938
         FALSE,                 /* pc_relative */
939
         0,                      /* bitpos */
940
         complain_overflow_dont, /* complain_on_overflow */
941
         ppc64_elf_toc_reloc,   /* special_function */
942
         "R_PPC64_TOC16_LO",    /* name */
943
         FALSE,                 /* partial_inplace */
944
         0,                      /* src_mask */
945
         0xffff,                /* dst_mask */
946
         FALSE),                /* pcrel_offset */
947
 
948
  /* 16 bit TOC-relative relocation, high 16 bits.  */
949
 
950
  /* R_PPC64_TOC16_HI     49       half16        #hi (S + A - .TOC.)  */
951
  HOWTO (R_PPC64_TOC16_HI,      /* type */
952
         16,                    /* rightshift */
953
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
954
         16,                    /* bitsize */
955
         FALSE,                 /* pc_relative */
956
         0,                      /* bitpos */
957
         complain_overflow_dont, /* complain_on_overflow */
958
         ppc64_elf_toc_reloc,   /* special_function */
959
         "R_PPC64_TOC16_HI",    /* name */
960
         FALSE,                 /* partial_inplace */
961
         0,                      /* src_mask */
962
         0xffff,                /* dst_mask */
963
         FALSE),                /* pcrel_offset */
964
 
965
  /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
966
     contents of the low 16 bits, treated as a signed number, is
967
     negative.  */
968
 
969
  /* R_PPC64_TOC16_HA     50       half16        #ha (S + A - .TOC.)  */
970
  HOWTO (R_PPC64_TOC16_HA,      /* type */
971
         16,                    /* rightshift */
972
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
973
         16,                    /* bitsize */
974
         FALSE,                 /* pc_relative */
975
         0,                      /* bitpos */
976
         complain_overflow_dont, /* complain_on_overflow */
977
         ppc64_elf_toc_ha_reloc, /* special_function */
978
         "R_PPC64_TOC16_HA",    /* name */
979
         FALSE,                 /* partial_inplace */
980
         0,                      /* src_mask */
981
         0xffff,                /* dst_mask */
982
         FALSE),                /* pcrel_offset */
983
 
984
  /* 64-bit relocation; insert value of TOC base (.TOC.).  */
985
 
986
  /* R_PPC64_TOC                  51       doubleword64  .TOC.  */
987
  HOWTO (R_PPC64_TOC,           /* type */
988
         0,                      /* rightshift */
989
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
990
         64,                    /* bitsize */
991
         FALSE,                 /* pc_relative */
992
         0,                      /* bitpos */
993
         complain_overflow_bitfield, /* complain_on_overflow */
994
         ppc64_elf_toc64_reloc, /* special_function */
995
         "R_PPC64_TOC",         /* name */
996
         FALSE,                 /* partial_inplace */
997
         0,                      /* src_mask */
998
         ONES (64),             /* dst_mask */
999
         FALSE),                /* pcrel_offset */
1000
 
1001
  /* Like R_PPC64_GOT16, but also informs the link editor that the
1002
     value to relocate may (!) refer to a PLT entry which the link
1003
     editor (a) may replace with the symbol value.  If the link editor
1004
     is unable to fully resolve the symbol, it may (b) create a PLT
1005
     entry and store the address to the new PLT entry in the GOT.
1006
     This permits lazy resolution of function symbols at run time.
1007
     The link editor may also skip all of this and just (c) emit a
1008
     R_PPC64_GLOB_DAT to tie the symbol to the GOT entry.  */
1009
  /* FIXME: R_PPC64_PLTGOT16 not implemented.  */
1010
    HOWTO (R_PPC64_PLTGOT16,    /* type */
1011
         0,                      /* rightshift */
1012
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1013
         16,                    /* bitsize */
1014
         FALSE,                 /* pc_relative */
1015
         0,                      /* bitpos */
1016
         complain_overflow_signed, /* complain_on_overflow */
1017
         ppc64_elf_unhandled_reloc, /* special_function */
1018
         "R_PPC64_PLTGOT16",    /* name */
1019
         FALSE,                 /* partial_inplace */
1020
         0,                      /* src_mask */
1021
         0xffff,                /* dst_mask */
1022
         FALSE),                /* pcrel_offset */
1023
 
1024
  /* Like R_PPC64_PLTGOT16, but without overflow.  */
1025
  /* FIXME: R_PPC64_PLTGOT16_LO not implemented.  */
1026
  HOWTO (R_PPC64_PLTGOT16_LO,   /* type */
1027
         0,                      /* rightshift */
1028
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1029
         16,                    /* bitsize */
1030
         FALSE,                 /* pc_relative */
1031
         0,                      /* bitpos */
1032
         complain_overflow_dont, /* complain_on_overflow */
1033
         ppc64_elf_unhandled_reloc, /* special_function */
1034
         "R_PPC64_PLTGOT16_LO", /* name */
1035
         FALSE,                 /* partial_inplace */
1036
         0,                      /* src_mask */
1037
         0xffff,                /* dst_mask */
1038
         FALSE),                /* pcrel_offset */
1039
 
1040
  /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address.  */
1041
  /* FIXME: R_PPC64_PLTGOT16_HI not implemented.  */
1042
  HOWTO (R_PPC64_PLTGOT16_HI,   /* type */
1043
         16,                    /* rightshift */
1044
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1045
         16,                    /* bitsize */
1046
         FALSE,                 /* pc_relative */
1047
         0,                      /* bitpos */
1048
         complain_overflow_dont, /* complain_on_overflow */
1049
         ppc64_elf_unhandled_reloc, /* special_function */
1050
         "R_PPC64_PLTGOT16_HI", /* name */
1051
         FALSE,                 /* partial_inplace */
1052
         0,                      /* src_mask */
1053
         0xffff,                /* dst_mask */
1054
         FALSE),                /* pcrel_offset */
1055
 
1056
  /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1057
     1 if the contents of the low 16 bits, treated as a signed number,
1058
     is negative.  */
1059
  /* FIXME: R_PPC64_PLTGOT16_HA not implemented.  */
1060
  HOWTO (R_PPC64_PLTGOT16_HA,   /* type */
1061
         16,                    /* rightshift */
1062
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1063
         16,                    /* bitsize */
1064
         FALSE,                 /* pc_relative */
1065
         0,                      /* bitpos */
1066
         complain_overflow_dont,/* complain_on_overflow */
1067
         ppc64_elf_unhandled_reloc, /* special_function */
1068
         "R_PPC64_PLTGOT16_HA", /* name */
1069
         FALSE,                 /* partial_inplace */
1070
         0,                      /* src_mask */
1071
         0xffff,                /* dst_mask */
1072
         FALSE),                /* pcrel_offset */
1073
 
1074
  /* Like R_PPC64_ADDR16, but for instructions with a DS field.  */
1075
  HOWTO (R_PPC64_ADDR16_DS,     /* type */
1076
         0,                      /* rightshift */
1077
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1078
         16,                    /* bitsize */
1079
         FALSE,                 /* pc_relative */
1080
         0,                      /* bitpos */
1081
         complain_overflow_bitfield, /* complain_on_overflow */
1082
         bfd_elf_generic_reloc, /* special_function */
1083
         "R_PPC64_ADDR16_DS",   /* name */
1084
         FALSE,                 /* partial_inplace */
1085
         0,                      /* src_mask */
1086
         0xfffc,                /* dst_mask */
1087
         FALSE),                /* pcrel_offset */
1088
 
1089
  /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field.  */
1090
  HOWTO (R_PPC64_ADDR16_LO_DS,  /* type */
1091
         0,                      /* rightshift */
1092
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1093
         16,                    /* bitsize */
1094
         FALSE,                 /* pc_relative */
1095
         0,                      /* bitpos */
1096
         complain_overflow_dont,/* complain_on_overflow */
1097
         bfd_elf_generic_reloc, /* special_function */
1098
         "R_PPC64_ADDR16_LO_DS",/* name */
1099
         FALSE,                 /* partial_inplace */
1100
         0,                      /* src_mask */
1101
         0xfffc,                /* dst_mask */
1102
         FALSE),                /* pcrel_offset */
1103
 
1104
  /* Like R_PPC64_GOT16, but for instructions with a DS field.  */
1105
  HOWTO (R_PPC64_GOT16_DS,      /* type */
1106
         0,                      /* rightshift */
1107
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1108
         16,                    /* bitsize */
1109
         FALSE,                 /* pc_relative */
1110
         0,                      /* bitpos */
1111
         complain_overflow_signed, /* complain_on_overflow */
1112
         ppc64_elf_unhandled_reloc, /* special_function */
1113
         "R_PPC64_GOT16_DS",    /* name */
1114
         FALSE,                 /* partial_inplace */
1115
         0,                      /* src_mask */
1116
         0xfffc,                /* dst_mask */
1117
         FALSE),                /* pcrel_offset */
1118
 
1119
  /* Like R_PPC64_GOT16_LO, but for instructions with a DS field.  */
1120
  HOWTO (R_PPC64_GOT16_LO_DS,   /* type */
1121
         0,                      /* rightshift */
1122
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1123
         16,                    /* bitsize */
1124
         FALSE,                 /* pc_relative */
1125
         0,                      /* bitpos */
1126
         complain_overflow_dont, /* complain_on_overflow */
1127
         ppc64_elf_unhandled_reloc, /* special_function */
1128
         "R_PPC64_GOT16_LO_DS", /* name */
1129
         FALSE,                 /* partial_inplace */
1130
         0,                      /* src_mask */
1131
         0xfffc,                /* dst_mask */
1132
         FALSE),                /* pcrel_offset */
1133
 
1134
  /* Like R_PPC64_PLT16_LO, but for instructions with a DS field.  */
1135
  HOWTO (R_PPC64_PLT16_LO_DS,   /* type */
1136
         0,                      /* rightshift */
1137
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1138
         16,                    /* bitsize */
1139
         FALSE,                 /* pc_relative */
1140
         0,                      /* bitpos */
1141
         complain_overflow_dont, /* complain_on_overflow */
1142
         ppc64_elf_unhandled_reloc, /* special_function */
1143
         "R_PPC64_PLT16_LO_DS", /* name */
1144
         FALSE,                 /* partial_inplace */
1145
         0,                      /* src_mask */
1146
         0xfffc,                /* dst_mask */
1147
         FALSE),                /* pcrel_offset */
1148
 
1149
  /* Like R_PPC64_SECTOFF, but for instructions with a DS field.  */
1150
  HOWTO (R_PPC64_SECTOFF_DS,    /* type */
1151
         0,                      /* rightshift */
1152
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1153
         16,                    /* bitsize */
1154
         FALSE,                 /* pc_relative */
1155
         0,                      /* bitpos */
1156
         complain_overflow_bitfield, /* complain_on_overflow */
1157
         ppc64_elf_sectoff_reloc, /* special_function */
1158
         "R_PPC64_SECTOFF_DS",  /* name */
1159
         FALSE,                 /* partial_inplace */
1160
         0,                      /* src_mask */
1161
         0xfffc,                /* dst_mask */
1162
         FALSE),                /* pcrel_offset */
1163
 
1164
  /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field.  */
1165
  HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */
1166
         0,                      /* rightshift */
1167
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1168
         16,                    /* bitsize */
1169
         FALSE,                 /* pc_relative */
1170
         0,                      /* bitpos */
1171
         complain_overflow_dont, /* complain_on_overflow */
1172
         ppc64_elf_sectoff_reloc, /* special_function */
1173
         "R_PPC64_SECTOFF_LO_DS",/* name */
1174
         FALSE,                 /* partial_inplace */
1175
         0,                      /* src_mask */
1176
         0xfffc,                /* dst_mask */
1177
         FALSE),                /* pcrel_offset */
1178
 
1179
  /* Like R_PPC64_TOC16, but for instructions with a DS field.  */
1180
  HOWTO (R_PPC64_TOC16_DS,      /* type */
1181
         0,                      /* rightshift */
1182
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1183
         16,                    /* bitsize */
1184
         FALSE,                 /* pc_relative */
1185
         0,                      /* bitpos */
1186
         complain_overflow_signed, /* complain_on_overflow */
1187
         ppc64_elf_toc_reloc,   /* special_function */
1188
         "R_PPC64_TOC16_DS",    /* name */
1189
         FALSE,                 /* partial_inplace */
1190
         0,                      /* src_mask */
1191
         0xfffc,                /* dst_mask */
1192
         FALSE),                /* pcrel_offset */
1193
 
1194
  /* Like R_PPC64_TOC16_LO, but for instructions with a DS field.  */
1195
  HOWTO (R_PPC64_TOC16_LO_DS,   /* type */
1196
         0,                      /* rightshift */
1197
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1198
         16,                    /* bitsize */
1199
         FALSE,                 /* pc_relative */
1200
         0,                      /* bitpos */
1201
         complain_overflow_dont, /* complain_on_overflow */
1202
         ppc64_elf_toc_reloc,   /* special_function */
1203
         "R_PPC64_TOC16_LO_DS", /* name */
1204
         FALSE,                 /* partial_inplace */
1205
         0,                      /* src_mask */
1206
         0xfffc,                /* dst_mask */
1207
         FALSE),                /* pcrel_offset */
1208
 
1209
  /* Like R_PPC64_PLTGOT16, but for instructions with a DS field.  */
1210
  /* FIXME: R_PPC64_PLTGOT16_DS not implemented.  */
1211
  HOWTO (R_PPC64_PLTGOT16_DS,   /* type */
1212
         0,                      /* rightshift */
1213
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1214
         16,                    /* bitsize */
1215
         FALSE,                 /* pc_relative */
1216
         0,                      /* bitpos */
1217
         complain_overflow_signed, /* complain_on_overflow */
1218
         ppc64_elf_unhandled_reloc, /* special_function */
1219
         "R_PPC64_PLTGOT16_DS", /* name */
1220
         FALSE,                 /* partial_inplace */
1221
         0,                      /* src_mask */
1222
         0xfffc,                /* dst_mask */
1223
         FALSE),                /* pcrel_offset */
1224
 
1225
  /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field.  */
1226
  /* FIXME: R_PPC64_PLTGOT16_LO not implemented.  */
1227
  HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */
1228
         0,                      /* rightshift */
1229
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1230
         16,                    /* bitsize */
1231
         FALSE,                 /* pc_relative */
1232
         0,                      /* bitpos */
1233
         complain_overflow_dont, /* complain_on_overflow */
1234
         ppc64_elf_unhandled_reloc, /* special_function */
1235
         "R_PPC64_PLTGOT16_LO_DS",/* name */
1236
         FALSE,                 /* partial_inplace */
1237
         0,                      /* src_mask */
1238
         0xfffc,                /* dst_mask */
1239
         FALSE),                /* pcrel_offset */
1240
 
1241
  /* Marker relocs for TLS.  */
1242
  HOWTO (R_PPC64_TLS,
1243
         0,                      /* rightshift */
1244
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1245
         32,                    /* bitsize */
1246
         FALSE,                 /* pc_relative */
1247
         0,                      /* bitpos */
1248
         complain_overflow_dont, /* complain_on_overflow */
1249
         bfd_elf_generic_reloc, /* special_function */
1250
         "R_PPC64_TLS",         /* name */
1251
         FALSE,                 /* partial_inplace */
1252
         0,                      /* src_mask */
1253
         0,                      /* dst_mask */
1254
         FALSE),                /* pcrel_offset */
1255
 
1256
  HOWTO (R_PPC64_TLSGD,
1257
         0,                      /* rightshift */
1258
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1259
         32,                    /* bitsize */
1260
         FALSE,                 /* pc_relative */
1261
         0,                      /* bitpos */
1262
         complain_overflow_dont, /* complain_on_overflow */
1263
         bfd_elf_generic_reloc, /* special_function */
1264
         "R_PPC64_TLSGD",       /* name */
1265
         FALSE,                 /* partial_inplace */
1266
         0,                      /* src_mask */
1267
         0,                      /* dst_mask */
1268
         FALSE),                /* pcrel_offset */
1269
 
1270
  HOWTO (R_PPC64_TLSLD,
1271
         0,                      /* rightshift */
1272
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1273
         32,                    /* bitsize */
1274
         FALSE,                 /* pc_relative */
1275
         0,                      /* bitpos */
1276
         complain_overflow_dont, /* complain_on_overflow */
1277
         bfd_elf_generic_reloc, /* special_function */
1278
         "R_PPC64_TLSLD",       /* name */
1279
         FALSE,                 /* partial_inplace */
1280
         0,                      /* src_mask */
1281
         0,                      /* dst_mask */
1282
         FALSE),                /* pcrel_offset */
1283
 
1284
  /* Computes the load module index of the load module that contains the
1285
     definition of its TLS sym.  */
1286
  HOWTO (R_PPC64_DTPMOD64,
1287
         0,                      /* rightshift */
1288
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
1289
         64,                    /* bitsize */
1290
         FALSE,                 /* pc_relative */
1291
         0,                      /* bitpos */
1292
         complain_overflow_dont, /* complain_on_overflow */
1293
         ppc64_elf_unhandled_reloc, /* special_function */
1294
         "R_PPC64_DTPMOD64",    /* name */
1295
         FALSE,                 /* partial_inplace */
1296
         0,                      /* src_mask */
1297
         ONES (64),             /* dst_mask */
1298
         FALSE),                /* pcrel_offset */
1299
 
1300
  /* Computes a dtv-relative displacement, the difference between the value
1301
     of sym+add and the base address of the thread-local storage block that
1302
     contains the definition of sym, minus 0x8000.  */
1303
  HOWTO (R_PPC64_DTPREL64,
1304
         0,                      /* rightshift */
1305
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
1306
         64,                    /* bitsize */
1307
         FALSE,                 /* pc_relative */
1308
         0,                      /* bitpos */
1309
         complain_overflow_dont, /* complain_on_overflow */
1310
         ppc64_elf_unhandled_reloc, /* special_function */
1311
         "R_PPC64_DTPREL64",    /* name */
1312
         FALSE,                 /* partial_inplace */
1313
         0,                      /* src_mask */
1314
         ONES (64),             /* dst_mask */
1315
         FALSE),                /* pcrel_offset */
1316
 
1317
  /* A 16 bit dtprel reloc.  */
1318
  HOWTO (R_PPC64_DTPREL16,
1319
         0,                      /* rightshift */
1320
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1321
         16,                    /* bitsize */
1322
         FALSE,                 /* pc_relative */
1323
         0,                      /* bitpos */
1324
         complain_overflow_signed, /* complain_on_overflow */
1325
         ppc64_elf_unhandled_reloc, /* special_function */
1326
         "R_PPC64_DTPREL16",    /* name */
1327
         FALSE,                 /* partial_inplace */
1328
         0,                      /* src_mask */
1329
         0xffff,                /* dst_mask */
1330
         FALSE),                /* pcrel_offset */
1331
 
1332
  /* Like DTPREL16, but no overflow.  */
1333
  HOWTO (R_PPC64_DTPREL16_LO,
1334
         0,                      /* rightshift */
1335
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1336
         16,                    /* bitsize */
1337
         FALSE,                 /* pc_relative */
1338
         0,                      /* bitpos */
1339
         complain_overflow_dont, /* complain_on_overflow */
1340
         ppc64_elf_unhandled_reloc, /* special_function */
1341
         "R_PPC64_DTPREL16_LO", /* name */
1342
         FALSE,                 /* partial_inplace */
1343
         0,                      /* src_mask */
1344
         0xffff,                /* dst_mask */
1345
         FALSE),                /* pcrel_offset */
1346
 
1347
  /* Like DTPREL16_LO, but next higher group of 16 bits.  */
1348
  HOWTO (R_PPC64_DTPREL16_HI,
1349
         16,                    /* rightshift */
1350
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1351
         16,                    /* bitsize */
1352
         FALSE,                 /* pc_relative */
1353
         0,                      /* bitpos */
1354
         complain_overflow_dont, /* complain_on_overflow */
1355
         ppc64_elf_unhandled_reloc, /* special_function */
1356
         "R_PPC64_DTPREL16_HI", /* name */
1357
         FALSE,                 /* partial_inplace */
1358
         0,                      /* src_mask */
1359
         0xffff,                /* dst_mask */
1360
         FALSE),                /* pcrel_offset */
1361
 
1362
  /* Like DTPREL16_HI, but adjust for low 16 bits.  */
1363
  HOWTO (R_PPC64_DTPREL16_HA,
1364
         16,                    /* rightshift */
1365
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1366
         16,                    /* bitsize */
1367
         FALSE,                 /* pc_relative */
1368
         0,                      /* bitpos */
1369
         complain_overflow_dont, /* complain_on_overflow */
1370
         ppc64_elf_unhandled_reloc, /* special_function */
1371
         "R_PPC64_DTPREL16_HA", /* name */
1372
         FALSE,                 /* partial_inplace */
1373
         0,                      /* src_mask */
1374
         0xffff,                /* dst_mask */
1375
         FALSE),                /* pcrel_offset */
1376
 
1377
  /* Like DTPREL16_HI, but next higher group of 16 bits.  */
1378
  HOWTO (R_PPC64_DTPREL16_HIGHER,
1379
         32,                    /* rightshift */
1380
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1381
         16,                    /* bitsize */
1382
         FALSE,                 /* pc_relative */
1383
         0,                      /* bitpos */
1384
         complain_overflow_dont, /* complain_on_overflow */
1385
         ppc64_elf_unhandled_reloc, /* special_function */
1386
         "R_PPC64_DTPREL16_HIGHER", /* name */
1387
         FALSE,                 /* partial_inplace */
1388
         0,                      /* src_mask */
1389
         0xffff,                /* dst_mask */
1390
         FALSE),                /* pcrel_offset */
1391
 
1392
  /* Like DTPREL16_HIGHER, but adjust for low 16 bits.  */
1393
  HOWTO (R_PPC64_DTPREL16_HIGHERA,
1394
         32,                    /* rightshift */
1395
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1396
         16,                    /* bitsize */
1397
         FALSE,                 /* pc_relative */
1398
         0,                      /* bitpos */
1399
         complain_overflow_dont, /* complain_on_overflow */
1400
         ppc64_elf_unhandled_reloc, /* special_function */
1401
         "R_PPC64_DTPREL16_HIGHERA", /* name */
1402
         FALSE,                 /* partial_inplace */
1403
         0,                      /* src_mask */
1404
         0xffff,                /* dst_mask */
1405
         FALSE),                /* pcrel_offset */
1406
 
1407
  /* Like DTPREL16_HIGHER, but next higher group of 16 bits.  */
1408
  HOWTO (R_PPC64_DTPREL16_HIGHEST,
1409
         48,                    /* rightshift */
1410
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1411
         16,                    /* bitsize */
1412
         FALSE,                 /* pc_relative */
1413
         0,                      /* bitpos */
1414
         complain_overflow_dont, /* complain_on_overflow */
1415
         ppc64_elf_unhandled_reloc, /* special_function */
1416
         "R_PPC64_DTPREL16_HIGHEST", /* name */
1417
         FALSE,                 /* partial_inplace */
1418
         0,                      /* src_mask */
1419
         0xffff,                /* dst_mask */
1420
         FALSE),                /* pcrel_offset */
1421
 
1422
  /* Like DTPREL16_HIGHEST, but adjust for low 16 bits.  */
1423
  HOWTO (R_PPC64_DTPREL16_HIGHESTA,
1424
         48,                    /* rightshift */
1425
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1426
         16,                    /* bitsize */
1427
         FALSE,                 /* pc_relative */
1428
         0,                      /* bitpos */
1429
         complain_overflow_dont, /* complain_on_overflow */
1430
         ppc64_elf_unhandled_reloc, /* special_function */
1431
         "R_PPC64_DTPREL16_HIGHESTA", /* name */
1432
         FALSE,                 /* partial_inplace */
1433
         0,                      /* src_mask */
1434
         0xffff,                /* dst_mask */
1435
         FALSE),                /* pcrel_offset */
1436
 
1437
  /* Like DTPREL16, but for insns with a DS field.  */
1438
  HOWTO (R_PPC64_DTPREL16_DS,
1439
         0,                      /* rightshift */
1440
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1441
         16,                    /* bitsize */
1442
         FALSE,                 /* pc_relative */
1443
         0,                      /* bitpos */
1444
         complain_overflow_signed, /* complain_on_overflow */
1445
         ppc64_elf_unhandled_reloc, /* special_function */
1446
         "R_PPC64_DTPREL16_DS", /* name */
1447
         FALSE,                 /* partial_inplace */
1448
         0,                      /* src_mask */
1449
         0xfffc,                /* dst_mask */
1450
         FALSE),                /* pcrel_offset */
1451
 
1452
  /* Like DTPREL16_DS, but no overflow.  */
1453
  HOWTO (R_PPC64_DTPREL16_LO_DS,
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_dont, /* complain_on_overflow */
1460
         ppc64_elf_unhandled_reloc, /* special_function */
1461
         "R_PPC64_DTPREL16_LO_DS", /* name */
1462
         FALSE,                 /* partial_inplace */
1463
         0,                      /* src_mask */
1464
         0xfffc,                /* dst_mask */
1465
         FALSE),                /* pcrel_offset */
1466
 
1467
  /* Computes a tp-relative displacement, the difference between the value of
1468
     sym+add and the value of the thread pointer (r13).  */
1469
  HOWTO (R_PPC64_TPREL64,
1470
         0,                      /* rightshift */
1471
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
1472
         64,                    /* bitsize */
1473
         FALSE,                 /* pc_relative */
1474
         0,                      /* bitpos */
1475
         complain_overflow_dont, /* complain_on_overflow */
1476
         ppc64_elf_unhandled_reloc, /* special_function */
1477
         "R_PPC64_TPREL64",     /* name */
1478
         FALSE,                 /* partial_inplace */
1479
         0,                      /* src_mask */
1480
         ONES (64),             /* dst_mask */
1481
         FALSE),                /* pcrel_offset */
1482
 
1483
  /* A 16 bit tprel reloc.  */
1484
  HOWTO (R_PPC64_TPREL16,
1485
         0,                      /* rightshift */
1486
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1487
         16,                    /* bitsize */
1488
         FALSE,                 /* pc_relative */
1489
         0,                      /* bitpos */
1490
         complain_overflow_signed, /* complain_on_overflow */
1491
         ppc64_elf_unhandled_reloc, /* special_function */
1492
         "R_PPC64_TPREL16",     /* name */
1493
         FALSE,                 /* partial_inplace */
1494
         0,                      /* src_mask */
1495
         0xffff,                /* dst_mask */
1496
         FALSE),                /* pcrel_offset */
1497
 
1498
  /* Like TPREL16, but no overflow.  */
1499
  HOWTO (R_PPC64_TPREL16_LO,
1500
         0,                      /* rightshift */
1501
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1502
         16,                    /* bitsize */
1503
         FALSE,                 /* pc_relative */
1504
         0,                      /* bitpos */
1505
         complain_overflow_dont, /* complain_on_overflow */
1506
         ppc64_elf_unhandled_reloc, /* special_function */
1507
         "R_PPC64_TPREL16_LO",  /* name */
1508
         FALSE,                 /* partial_inplace */
1509
         0,                      /* src_mask */
1510
         0xffff,                /* dst_mask */
1511
         FALSE),                /* pcrel_offset */
1512
 
1513
  /* Like TPREL16_LO, but next higher group of 16 bits.  */
1514
  HOWTO (R_PPC64_TPREL16_HI,
1515
         16,                    /* rightshift */
1516
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1517
         16,                    /* bitsize */
1518
         FALSE,                 /* pc_relative */
1519
         0,                      /* bitpos */
1520
         complain_overflow_dont, /* complain_on_overflow */
1521
         ppc64_elf_unhandled_reloc, /* special_function */
1522
         "R_PPC64_TPREL16_HI",  /* name */
1523
         FALSE,                 /* partial_inplace */
1524
         0,                      /* src_mask */
1525
         0xffff,                /* dst_mask */
1526
         FALSE),                /* pcrel_offset */
1527
 
1528
  /* Like TPREL16_HI, but adjust for low 16 bits.  */
1529
  HOWTO (R_PPC64_TPREL16_HA,
1530
         16,                    /* rightshift */
1531
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1532
         16,                    /* bitsize */
1533
         FALSE,                 /* pc_relative */
1534
         0,                      /* bitpos */
1535
         complain_overflow_dont, /* complain_on_overflow */
1536
         ppc64_elf_unhandled_reloc, /* special_function */
1537
         "R_PPC64_TPREL16_HA",  /* name */
1538
         FALSE,                 /* partial_inplace */
1539
         0,                      /* src_mask */
1540
         0xffff,                /* dst_mask */
1541
         FALSE),                /* pcrel_offset */
1542
 
1543
  /* Like TPREL16_HI, but next higher group of 16 bits.  */
1544
  HOWTO (R_PPC64_TPREL16_HIGHER,
1545
         32,                    /* rightshift */
1546
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1547
         16,                    /* bitsize */
1548
         FALSE,                 /* pc_relative */
1549
         0,                      /* bitpos */
1550
         complain_overflow_dont, /* complain_on_overflow */
1551
         ppc64_elf_unhandled_reloc, /* special_function */
1552
         "R_PPC64_TPREL16_HIGHER",      /* name */
1553
         FALSE,                 /* partial_inplace */
1554
         0,                      /* src_mask */
1555
         0xffff,                /* dst_mask */
1556
         FALSE),                /* pcrel_offset */
1557
 
1558
  /* Like TPREL16_HIGHER, but adjust for low 16 bits.  */
1559
  HOWTO (R_PPC64_TPREL16_HIGHERA,
1560
         32,                    /* rightshift */
1561
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1562
         16,                    /* bitsize */
1563
         FALSE,                 /* pc_relative */
1564
         0,                      /* bitpos */
1565
         complain_overflow_dont, /* complain_on_overflow */
1566
         ppc64_elf_unhandled_reloc, /* special_function */
1567
         "R_PPC64_TPREL16_HIGHERA", /* name */
1568
         FALSE,                 /* partial_inplace */
1569
         0,                      /* src_mask */
1570
         0xffff,                /* dst_mask */
1571
         FALSE),                /* pcrel_offset */
1572
 
1573
  /* Like TPREL16_HIGHER, but next higher group of 16 bits.  */
1574
  HOWTO (R_PPC64_TPREL16_HIGHEST,
1575
         48,                    /* rightshift */
1576
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1577
         16,                    /* bitsize */
1578
         FALSE,                 /* pc_relative */
1579
         0,                      /* bitpos */
1580
         complain_overflow_dont, /* complain_on_overflow */
1581
         ppc64_elf_unhandled_reloc, /* special_function */
1582
         "R_PPC64_TPREL16_HIGHEST", /* name */
1583
         FALSE,                 /* partial_inplace */
1584
         0,                      /* src_mask */
1585
         0xffff,                /* dst_mask */
1586
         FALSE),                /* pcrel_offset */
1587
 
1588
  /* Like TPREL16_HIGHEST, but adjust for low 16 bits.  */
1589
  HOWTO (R_PPC64_TPREL16_HIGHESTA,
1590
         48,                    /* rightshift */
1591
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1592
         16,                    /* bitsize */
1593
         FALSE,                 /* pc_relative */
1594
         0,                      /* bitpos */
1595
         complain_overflow_dont, /* complain_on_overflow */
1596
         ppc64_elf_unhandled_reloc, /* special_function */
1597
         "R_PPC64_TPREL16_HIGHESTA", /* name */
1598
         FALSE,                 /* partial_inplace */
1599
         0,                      /* src_mask */
1600
         0xffff,                /* dst_mask */
1601
         FALSE),                /* pcrel_offset */
1602
 
1603
  /* Like TPREL16, but for insns with a DS field.  */
1604
  HOWTO (R_PPC64_TPREL16_DS,
1605
         0,                      /* rightshift */
1606
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1607
         16,                    /* bitsize */
1608
         FALSE,                 /* pc_relative */
1609
         0,                      /* bitpos */
1610
         complain_overflow_signed, /* complain_on_overflow */
1611
         ppc64_elf_unhandled_reloc, /* special_function */
1612
         "R_PPC64_TPREL16_DS",  /* name */
1613
         FALSE,                 /* partial_inplace */
1614
         0,                      /* src_mask */
1615
         0xfffc,                /* dst_mask */
1616
         FALSE),                /* pcrel_offset */
1617
 
1618
  /* Like TPREL16_DS, but no overflow.  */
1619
  HOWTO (R_PPC64_TPREL16_LO_DS,
1620
         0,                      /* rightshift */
1621
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1622
         16,                    /* bitsize */
1623
         FALSE,                 /* pc_relative */
1624
         0,                      /* bitpos */
1625
         complain_overflow_dont, /* complain_on_overflow */
1626
         ppc64_elf_unhandled_reloc, /* special_function */
1627
         "R_PPC64_TPREL16_LO_DS", /* name */
1628
         FALSE,                 /* partial_inplace */
1629
         0,                      /* src_mask */
1630
         0xfffc,                /* dst_mask */
1631
         FALSE),                /* pcrel_offset */
1632
 
1633
  /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1634
     with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1635
     to the first entry relative to the TOC base (r2).  */
1636
  HOWTO (R_PPC64_GOT_TLSGD16,
1637
         0,                      /* rightshift */
1638
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1639
         16,                    /* bitsize */
1640
         FALSE,                 /* pc_relative */
1641
         0,                      /* bitpos */
1642
         complain_overflow_signed, /* complain_on_overflow */
1643
         ppc64_elf_unhandled_reloc, /* special_function */
1644
         "R_PPC64_GOT_TLSGD16", /* name */
1645
         FALSE,                 /* partial_inplace */
1646
         0,                      /* src_mask */
1647
         0xffff,                /* dst_mask */
1648
         FALSE),                /* pcrel_offset */
1649
 
1650
  /* Like GOT_TLSGD16, but no overflow.  */
1651
  HOWTO (R_PPC64_GOT_TLSGD16_LO,
1652
         0,                      /* rightshift */
1653
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1654
         16,                    /* bitsize */
1655
         FALSE,                 /* pc_relative */
1656
         0,                      /* bitpos */
1657
         complain_overflow_dont, /* complain_on_overflow */
1658
         ppc64_elf_unhandled_reloc, /* special_function */
1659
         "R_PPC64_GOT_TLSGD16_LO", /* name */
1660
         FALSE,                 /* partial_inplace */
1661
         0,                      /* src_mask */
1662
         0xffff,                /* dst_mask */
1663
         FALSE),                /* pcrel_offset */
1664
 
1665
  /* Like GOT_TLSGD16_LO, but next higher group of 16 bits.  */
1666
  HOWTO (R_PPC64_GOT_TLSGD16_HI,
1667
         16,                    /* rightshift */
1668
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1669
         16,                    /* bitsize */
1670
         FALSE,                 /* pc_relative */
1671
         0,                      /* bitpos */
1672
         complain_overflow_dont, /* complain_on_overflow */
1673
         ppc64_elf_unhandled_reloc, /* special_function */
1674
         "R_PPC64_GOT_TLSGD16_HI", /* name */
1675
         FALSE,                 /* partial_inplace */
1676
         0,                      /* src_mask */
1677
         0xffff,                /* dst_mask */
1678
         FALSE),                /* pcrel_offset */
1679
 
1680
  /* Like GOT_TLSGD16_HI, but adjust for low 16 bits.  */
1681
  HOWTO (R_PPC64_GOT_TLSGD16_HA,
1682
         16,                    /* rightshift */
1683
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1684
         16,                    /* bitsize */
1685
         FALSE,                 /* pc_relative */
1686
         0,                      /* bitpos */
1687
         complain_overflow_dont, /* complain_on_overflow */
1688
         ppc64_elf_unhandled_reloc, /* special_function */
1689
         "R_PPC64_GOT_TLSGD16_HA", /* name */
1690
         FALSE,                 /* partial_inplace */
1691
         0,                      /* src_mask */
1692
         0xffff,                /* dst_mask */
1693
         FALSE),                /* pcrel_offset */
1694
 
1695
  /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1696
     with values (sym+add)@dtpmod and zero, and computes the offset to the
1697
     first entry relative to the TOC base (r2).  */
1698
  HOWTO (R_PPC64_GOT_TLSLD16,
1699
         0,                      /* rightshift */
1700
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1701
         16,                    /* bitsize */
1702
         FALSE,                 /* pc_relative */
1703
         0,                      /* bitpos */
1704
         complain_overflow_signed, /* complain_on_overflow */
1705
         ppc64_elf_unhandled_reloc, /* special_function */
1706
         "R_PPC64_GOT_TLSLD16", /* name */
1707
         FALSE,                 /* partial_inplace */
1708
         0,                      /* src_mask */
1709
         0xffff,                /* dst_mask */
1710
         FALSE),                /* pcrel_offset */
1711
 
1712
  /* Like GOT_TLSLD16, but no overflow.  */
1713
  HOWTO (R_PPC64_GOT_TLSLD16_LO,
1714
         0,                      /* rightshift */
1715
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1716
         16,                    /* bitsize */
1717
         FALSE,                 /* pc_relative */
1718
         0,                      /* bitpos */
1719
         complain_overflow_dont, /* complain_on_overflow */
1720
         ppc64_elf_unhandled_reloc, /* special_function */
1721
         "R_PPC64_GOT_TLSLD16_LO", /* name */
1722
         FALSE,                 /* partial_inplace */
1723
         0,                      /* src_mask */
1724
         0xffff,                /* dst_mask */
1725
         FALSE),                /* pcrel_offset */
1726
 
1727
  /* Like GOT_TLSLD16_LO, but next higher group of 16 bits.  */
1728
  HOWTO (R_PPC64_GOT_TLSLD16_HI,
1729
         16,                    /* rightshift */
1730
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1731
         16,                    /* bitsize */
1732
         FALSE,                 /* pc_relative */
1733
         0,                      /* bitpos */
1734
         complain_overflow_dont, /* complain_on_overflow */
1735
         ppc64_elf_unhandled_reloc, /* special_function */
1736
         "R_PPC64_GOT_TLSLD16_HI", /* name */
1737
         FALSE,                 /* partial_inplace */
1738
         0,                      /* src_mask */
1739
         0xffff,                /* dst_mask */
1740
         FALSE),                /* pcrel_offset */
1741
 
1742
  /* Like GOT_TLSLD16_HI, but adjust for low 16 bits.  */
1743
  HOWTO (R_PPC64_GOT_TLSLD16_HA,
1744
         16,                    /* 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_TLSLD16_HA", /* name */
1752
         FALSE,                 /* partial_inplace */
1753
         0,                      /* src_mask */
1754
         0xffff,                /* dst_mask */
1755
         FALSE),                /* pcrel_offset */
1756
 
1757
  /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1758
     the offset to the entry relative to the TOC base (r2).  */
1759
  HOWTO (R_PPC64_GOT_DTPREL16_DS,
1760
         0,                      /* rightshift */
1761
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1762
         16,                    /* bitsize */
1763
         FALSE,                 /* pc_relative */
1764
         0,                      /* bitpos */
1765
         complain_overflow_signed, /* complain_on_overflow */
1766
         ppc64_elf_unhandled_reloc, /* special_function */
1767
         "R_PPC64_GOT_DTPREL16_DS", /* name */
1768
         FALSE,                 /* partial_inplace */
1769
         0,                      /* src_mask */
1770
         0xfffc,                /* dst_mask */
1771
         FALSE),                /* pcrel_offset */
1772
 
1773
  /* Like GOT_DTPREL16_DS, but no overflow.  */
1774
  HOWTO (R_PPC64_GOT_DTPREL16_LO_DS,
1775
         0,                      /* rightshift */
1776
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1777
         16,                    /* bitsize */
1778
         FALSE,                 /* pc_relative */
1779
         0,                      /* bitpos */
1780
         complain_overflow_dont, /* complain_on_overflow */
1781
         ppc64_elf_unhandled_reloc, /* special_function */
1782
         "R_PPC64_GOT_DTPREL16_LO_DS", /* name */
1783
         FALSE,                 /* partial_inplace */
1784
         0,                      /* src_mask */
1785
         0xfffc,                /* dst_mask */
1786
         FALSE),                /* pcrel_offset */
1787
 
1788
  /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits.  */
1789
  HOWTO (R_PPC64_GOT_DTPREL16_HI,
1790
         16,                    /* rightshift */
1791
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1792
         16,                    /* bitsize */
1793
         FALSE,                 /* pc_relative */
1794
         0,                      /* bitpos */
1795
         complain_overflow_dont, /* complain_on_overflow */
1796
         ppc64_elf_unhandled_reloc, /* special_function */
1797
         "R_PPC64_GOT_DTPREL16_HI", /* name */
1798
         FALSE,                 /* partial_inplace */
1799
         0,                      /* src_mask */
1800
         0xffff,                /* dst_mask */
1801
         FALSE),                /* pcrel_offset */
1802
 
1803
  /* Like GOT_DTPREL16_HI, but adjust for low 16 bits.  */
1804
  HOWTO (R_PPC64_GOT_DTPREL16_HA,
1805
         16,                    /* 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_DTPREL16_HA", /* name */
1813
         FALSE,                 /* partial_inplace */
1814
         0,                      /* src_mask */
1815
         0xffff,                /* dst_mask */
1816
         FALSE),                /* pcrel_offset */
1817
 
1818
  /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1819
     offset to the entry relative to the TOC base (r2).  */
1820
  HOWTO (R_PPC64_GOT_TPREL16_DS,
1821
         0,                      /* rightshift */
1822
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1823
         16,                    /* bitsize */
1824
         FALSE,                 /* pc_relative */
1825
         0,                      /* bitpos */
1826
         complain_overflow_signed, /* complain_on_overflow */
1827
         ppc64_elf_unhandled_reloc, /* special_function */
1828
         "R_PPC64_GOT_TPREL16_DS", /* name */
1829
         FALSE,                 /* partial_inplace */
1830
         0,                      /* src_mask */
1831
         0xfffc,                /* dst_mask */
1832
         FALSE),                /* pcrel_offset */
1833
 
1834
  /* Like GOT_TPREL16_DS, but no overflow.  */
1835
  HOWTO (R_PPC64_GOT_TPREL16_LO_DS,
1836
         0,                      /* rightshift */
1837
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1838
         16,                    /* bitsize */
1839
         FALSE,                 /* pc_relative */
1840
         0,                      /* bitpos */
1841
         complain_overflow_dont, /* complain_on_overflow */
1842
         ppc64_elf_unhandled_reloc, /* special_function */
1843
         "R_PPC64_GOT_TPREL16_LO_DS", /* name */
1844
         FALSE,                 /* partial_inplace */
1845
         0,                      /* src_mask */
1846
         0xfffc,                /* dst_mask */
1847
         FALSE),                /* pcrel_offset */
1848
 
1849
  /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits.  */
1850
  HOWTO (R_PPC64_GOT_TPREL16_HI,
1851
         16,                    /* rightshift */
1852
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1853
         16,                    /* bitsize */
1854
         FALSE,                 /* pc_relative */
1855
         0,                      /* bitpos */
1856
         complain_overflow_dont, /* complain_on_overflow */
1857
         ppc64_elf_unhandled_reloc, /* special_function */
1858
         "R_PPC64_GOT_TPREL16_HI", /* name */
1859
         FALSE,                 /* partial_inplace */
1860
         0,                      /* src_mask */
1861
         0xffff,                /* dst_mask */
1862
         FALSE),                /* pcrel_offset */
1863
 
1864
  /* Like GOT_TPREL16_HI, but adjust for low 16 bits.  */
1865
  HOWTO (R_PPC64_GOT_TPREL16_HA,
1866
         16,                    /* rightshift */
1867
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1868
         16,                    /* bitsize */
1869
         FALSE,                 /* pc_relative */
1870
         0,                      /* bitpos */
1871
         complain_overflow_dont, /* complain_on_overflow */
1872
         ppc64_elf_unhandled_reloc, /* special_function */
1873
         "R_PPC64_GOT_TPREL16_HA", /* name */
1874
         FALSE,                 /* partial_inplace */
1875
         0,                      /* src_mask */
1876
         0xffff,                /* dst_mask */
1877
         FALSE),                /* pcrel_offset */
1878
 
1879
  HOWTO (R_PPC64_JMP_IREL,      /* type */
1880
         0,                      /* rightshift */
1881
         0,                      /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1882
         0,                      /* bitsize */
1883
         FALSE,                 /* pc_relative */
1884
         0,                      /* bitpos */
1885
         complain_overflow_dont, /* complain_on_overflow */
1886
         ppc64_elf_unhandled_reloc, /* special_function */
1887
         "R_PPC64_JMP_IREL",    /* name */
1888
         FALSE,                 /* partial_inplace */
1889
         0,                      /* src_mask */
1890
         0,                      /* dst_mask */
1891
         FALSE),                /* pcrel_offset */
1892
 
1893
  HOWTO (R_PPC64_IRELATIVE,     /* type */
1894
         0,                      /* rightshift */
1895
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1896
         64,                    /* bitsize */
1897
         FALSE,                 /* pc_relative */
1898
         0,                      /* bitpos */
1899
         complain_overflow_dont, /* complain_on_overflow */
1900
         bfd_elf_generic_reloc, /* special_function */
1901
         "R_PPC64_IRELATIVE",   /* name */
1902
         FALSE,                 /* partial_inplace */
1903
         0,                      /* src_mask */
1904
         ONES (64),             /* dst_mask */
1905
         FALSE),                /* pcrel_offset */
1906
 
1907
  /* A 16 bit relative relocation.  */
1908
  HOWTO (R_PPC64_REL16,         /* type */
1909
         0,                      /* rightshift */
1910
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1911
         16,                    /* bitsize */
1912
         TRUE,                  /* pc_relative */
1913
         0,                      /* bitpos */
1914
         complain_overflow_bitfield, /* complain_on_overflow */
1915
         bfd_elf_generic_reloc, /* special_function */
1916
         "R_PPC64_REL16",       /* name */
1917
         FALSE,                 /* partial_inplace */
1918
         0,                      /* src_mask */
1919
         0xffff,                /* dst_mask */
1920
         TRUE),                 /* pcrel_offset */
1921
 
1922
  /* A 16 bit relative relocation without overflow.  */
1923
  HOWTO (R_PPC64_REL16_LO,      /* type */
1924
         0,                      /* rightshift */
1925
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1926
         16,                    /* bitsize */
1927
         TRUE,                  /* pc_relative */
1928
         0,                      /* bitpos */
1929
         complain_overflow_dont,/* complain_on_overflow */
1930
         bfd_elf_generic_reloc, /* special_function */
1931
         "R_PPC64_REL16_LO",    /* name */
1932
         FALSE,                 /* partial_inplace */
1933
         0,                      /* src_mask */
1934
         0xffff,                /* dst_mask */
1935
         TRUE),                 /* pcrel_offset */
1936
 
1937
  /* The high order 16 bits of a relative address.  */
1938
  HOWTO (R_PPC64_REL16_HI,      /* type */
1939
         16,                    /* rightshift */
1940
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1941
         16,                    /* bitsize */
1942
         TRUE,                  /* pc_relative */
1943
         0,                      /* bitpos */
1944
         complain_overflow_dont, /* complain_on_overflow */
1945
         bfd_elf_generic_reloc, /* special_function */
1946
         "R_PPC64_REL16_HI",    /* name */
1947
         FALSE,                 /* partial_inplace */
1948
         0,                      /* src_mask */
1949
         0xffff,                /* dst_mask */
1950
         TRUE),                 /* pcrel_offset */
1951
 
1952
  /* The high order 16 bits of a relative address, plus 1 if the contents of
1953
     the low 16 bits, treated as a signed number, is negative.  */
1954
  HOWTO (R_PPC64_REL16_HA,      /* type */
1955
         16,                    /* rightshift */
1956
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1957
         16,                    /* bitsize */
1958
         TRUE,                  /* pc_relative */
1959
         0,                      /* bitpos */
1960
         complain_overflow_dont, /* complain_on_overflow */
1961
         ppc64_elf_ha_reloc,    /* special_function */
1962
         "R_PPC64_REL16_HA",    /* name */
1963
         FALSE,                 /* partial_inplace */
1964
         0,                      /* src_mask */
1965
         0xffff,                /* dst_mask */
1966
         TRUE),                 /* pcrel_offset */
1967
 
1968
  /* GNU extension to record C++ vtable hierarchy.  */
1969
  HOWTO (R_PPC64_GNU_VTINHERIT, /* type */
1970
         0,                      /* rightshift */
1971
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
1972
         0,                      /* bitsize */
1973
         FALSE,                 /* pc_relative */
1974
         0,                      /* bitpos */
1975
         complain_overflow_dont, /* complain_on_overflow */
1976
         NULL,                  /* special_function */
1977
         "R_PPC64_GNU_VTINHERIT", /* name */
1978
         FALSE,                 /* partial_inplace */
1979
         0,                      /* src_mask */
1980
         0,                      /* dst_mask */
1981
         FALSE),                /* pcrel_offset */
1982
 
1983
  /* GNU extension to record C++ vtable member usage.  */
1984
  HOWTO (R_PPC64_GNU_VTENTRY,   /* type */
1985
         0,                      /* rightshift */
1986
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
1987
         0,                      /* bitsize */
1988
         FALSE,                 /* pc_relative */
1989
         0,                      /* bitpos */
1990
         complain_overflow_dont, /* complain_on_overflow */
1991
         NULL,                  /* special_function */
1992
         "R_PPC64_GNU_VTENTRY", /* name */
1993
         FALSE,                 /* partial_inplace */
1994
         0,                      /* src_mask */
1995
         0,                      /* dst_mask */
1996
         FALSE),                /* pcrel_offset */
1997
};
1998
 
1999
 
2000
/* Initialize the ppc64_elf_howto_table, so that linear accesses can
2001
   be done.  */
2002
 
2003
static void
2004
ppc_howto_init (void)
2005
{
2006
  unsigned int i, type;
2007
 
2008
  for (i = 0;
2009
       i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
2010
       i++)
2011
    {
2012
      type = ppc64_elf_howto_raw[i].type;
2013
      BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table)
2014
                          / sizeof (ppc64_elf_howto_table[0])));
2015
      ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
2016
    }
2017
}
2018
 
2019
static reloc_howto_type *
2020
ppc64_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2021
                             bfd_reloc_code_real_type code)
2022
{
2023
  enum elf_ppc64_reloc_type r = R_PPC64_NONE;
2024
 
2025
  if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2026
    /* Initialize howto table if needed.  */
2027
    ppc_howto_init ();
2028
 
2029
  switch (code)
2030
    {
2031
    default:
2032
      return NULL;
2033
 
2034
    case BFD_RELOC_NONE:                        r = R_PPC64_NONE;
2035
      break;
2036
    case BFD_RELOC_32:                          r = R_PPC64_ADDR32;
2037
      break;
2038
    case BFD_RELOC_PPC_BA26:                    r = R_PPC64_ADDR24;
2039
      break;
2040
    case BFD_RELOC_16:                          r = R_PPC64_ADDR16;
2041
      break;
2042
    case BFD_RELOC_LO16:                        r = R_PPC64_ADDR16_LO;
2043
      break;
2044
    case BFD_RELOC_HI16:                        r = R_PPC64_ADDR16_HI;
2045
      break;
2046
    case BFD_RELOC_HI16_S:                      r = R_PPC64_ADDR16_HA;
2047
      break;
2048
    case BFD_RELOC_PPC_BA16:                    r = R_PPC64_ADDR14;
2049
      break;
2050
    case BFD_RELOC_PPC_BA16_BRTAKEN:            r = R_PPC64_ADDR14_BRTAKEN;
2051
      break;
2052
    case BFD_RELOC_PPC_BA16_BRNTAKEN:           r = R_PPC64_ADDR14_BRNTAKEN;
2053
      break;
2054
    case BFD_RELOC_PPC_B26:                     r = R_PPC64_REL24;
2055
      break;
2056
    case BFD_RELOC_PPC_B16:                     r = R_PPC64_REL14;
2057
      break;
2058
    case BFD_RELOC_PPC_B16_BRTAKEN:             r = R_PPC64_REL14_BRTAKEN;
2059
      break;
2060
    case BFD_RELOC_PPC_B16_BRNTAKEN:            r = R_PPC64_REL14_BRNTAKEN;
2061
      break;
2062
    case BFD_RELOC_16_GOTOFF:                   r = R_PPC64_GOT16;
2063
      break;
2064
    case BFD_RELOC_LO16_GOTOFF:                 r = R_PPC64_GOT16_LO;
2065
      break;
2066
    case BFD_RELOC_HI16_GOTOFF:                 r = R_PPC64_GOT16_HI;
2067
      break;
2068
    case BFD_RELOC_HI16_S_GOTOFF:               r = R_PPC64_GOT16_HA;
2069
      break;
2070
    case BFD_RELOC_PPC_COPY:                    r = R_PPC64_COPY;
2071
      break;
2072
    case BFD_RELOC_PPC_GLOB_DAT:                r = R_PPC64_GLOB_DAT;
2073
      break;
2074
    case BFD_RELOC_32_PCREL:                    r = R_PPC64_REL32;
2075
      break;
2076
    case BFD_RELOC_32_PLTOFF:                   r = R_PPC64_PLT32;
2077
      break;
2078
    case BFD_RELOC_32_PLT_PCREL:                r = R_PPC64_PLTREL32;
2079
      break;
2080
    case BFD_RELOC_LO16_PLTOFF:                 r = R_PPC64_PLT16_LO;
2081
      break;
2082
    case BFD_RELOC_HI16_PLTOFF:                 r = R_PPC64_PLT16_HI;
2083
      break;
2084
    case BFD_RELOC_HI16_S_PLTOFF:               r = R_PPC64_PLT16_HA;
2085
      break;
2086
    case BFD_RELOC_16_BASEREL:                  r = R_PPC64_SECTOFF;
2087
      break;
2088
    case BFD_RELOC_LO16_BASEREL:                r = R_PPC64_SECTOFF_LO;
2089
      break;
2090
    case BFD_RELOC_HI16_BASEREL:                r = R_PPC64_SECTOFF_HI;
2091
      break;
2092
    case BFD_RELOC_HI16_S_BASEREL:              r = R_PPC64_SECTOFF_HA;
2093
      break;
2094
    case BFD_RELOC_CTOR:                        r = R_PPC64_ADDR64;
2095
      break;
2096
    case BFD_RELOC_64:                          r = R_PPC64_ADDR64;
2097
      break;
2098
    case BFD_RELOC_PPC64_HIGHER:                r = R_PPC64_ADDR16_HIGHER;
2099
      break;
2100
    case BFD_RELOC_PPC64_HIGHER_S:              r = R_PPC64_ADDR16_HIGHERA;
2101
      break;
2102
    case BFD_RELOC_PPC64_HIGHEST:               r = R_PPC64_ADDR16_HIGHEST;
2103
      break;
2104
    case BFD_RELOC_PPC64_HIGHEST_S:             r = R_PPC64_ADDR16_HIGHESTA;
2105
      break;
2106
    case BFD_RELOC_64_PCREL:                    r = R_PPC64_REL64;
2107
      break;
2108
    case BFD_RELOC_64_PLTOFF:                   r = R_PPC64_PLT64;
2109
      break;
2110
    case BFD_RELOC_64_PLT_PCREL:                r = R_PPC64_PLTREL64;
2111
      break;
2112
    case BFD_RELOC_PPC_TOC16:                   r = R_PPC64_TOC16;
2113
      break;
2114
    case BFD_RELOC_PPC64_TOC16_LO:              r = R_PPC64_TOC16_LO;
2115
      break;
2116
    case BFD_RELOC_PPC64_TOC16_HI:              r = R_PPC64_TOC16_HI;
2117
      break;
2118
    case BFD_RELOC_PPC64_TOC16_HA:              r = R_PPC64_TOC16_HA;
2119
      break;
2120
    case BFD_RELOC_PPC64_TOC:                   r = R_PPC64_TOC;
2121
      break;
2122
    case BFD_RELOC_PPC64_PLTGOT16:              r = R_PPC64_PLTGOT16;
2123
      break;
2124
    case BFD_RELOC_PPC64_PLTGOT16_LO:           r = R_PPC64_PLTGOT16_LO;
2125
      break;
2126
    case BFD_RELOC_PPC64_PLTGOT16_HI:           r = R_PPC64_PLTGOT16_HI;
2127
      break;
2128
    case BFD_RELOC_PPC64_PLTGOT16_HA:           r = R_PPC64_PLTGOT16_HA;
2129
      break;
2130
    case BFD_RELOC_PPC64_ADDR16_DS:             r = R_PPC64_ADDR16_DS;
2131
      break;
2132
    case BFD_RELOC_PPC64_ADDR16_LO_DS:          r = R_PPC64_ADDR16_LO_DS;
2133
      break;
2134
    case BFD_RELOC_PPC64_GOT16_DS:              r = R_PPC64_GOT16_DS;
2135
      break;
2136
    case BFD_RELOC_PPC64_GOT16_LO_DS:           r = R_PPC64_GOT16_LO_DS;
2137
      break;
2138
    case BFD_RELOC_PPC64_PLT16_LO_DS:           r = R_PPC64_PLT16_LO_DS;
2139
      break;
2140
    case BFD_RELOC_PPC64_SECTOFF_DS:            r = R_PPC64_SECTOFF_DS;
2141
      break;
2142
    case BFD_RELOC_PPC64_SECTOFF_LO_DS:         r = R_PPC64_SECTOFF_LO_DS;
2143
      break;
2144
    case BFD_RELOC_PPC64_TOC16_DS:              r = R_PPC64_TOC16_DS;
2145
      break;
2146
    case BFD_RELOC_PPC64_TOC16_LO_DS:           r = R_PPC64_TOC16_LO_DS;
2147
      break;
2148
    case BFD_RELOC_PPC64_PLTGOT16_DS:           r = R_PPC64_PLTGOT16_DS;
2149
      break;
2150
    case BFD_RELOC_PPC64_PLTGOT16_LO_DS:        r = R_PPC64_PLTGOT16_LO_DS;
2151
      break;
2152
    case BFD_RELOC_PPC_TLS:                     r = R_PPC64_TLS;
2153
      break;
2154
    case BFD_RELOC_PPC_TLSGD:                   r = R_PPC64_TLSGD;
2155
      break;
2156
    case BFD_RELOC_PPC_TLSLD:                   r = R_PPC64_TLSLD;
2157
      break;
2158
    case BFD_RELOC_PPC_DTPMOD:                  r = R_PPC64_DTPMOD64;
2159
      break;
2160
    case BFD_RELOC_PPC_TPREL16:                 r = R_PPC64_TPREL16;
2161
      break;
2162
    case BFD_RELOC_PPC_TPREL16_LO:              r = R_PPC64_TPREL16_LO;
2163
      break;
2164
    case BFD_RELOC_PPC_TPREL16_HI:              r = R_PPC64_TPREL16_HI;
2165
      break;
2166
    case BFD_RELOC_PPC_TPREL16_HA:              r = R_PPC64_TPREL16_HA;
2167
      break;
2168
    case BFD_RELOC_PPC_TPREL:                   r = R_PPC64_TPREL64;
2169
      break;
2170
    case BFD_RELOC_PPC_DTPREL16:                r = R_PPC64_DTPREL16;
2171
      break;
2172
    case BFD_RELOC_PPC_DTPREL16_LO:             r = R_PPC64_DTPREL16_LO;
2173
      break;
2174
    case BFD_RELOC_PPC_DTPREL16_HI:             r = R_PPC64_DTPREL16_HI;
2175
      break;
2176
    case BFD_RELOC_PPC_DTPREL16_HA:             r = R_PPC64_DTPREL16_HA;
2177
      break;
2178
    case BFD_RELOC_PPC_DTPREL:                  r = R_PPC64_DTPREL64;
2179
      break;
2180
    case BFD_RELOC_PPC_GOT_TLSGD16:             r = R_PPC64_GOT_TLSGD16;
2181
      break;
2182
    case BFD_RELOC_PPC_GOT_TLSGD16_LO:          r = R_PPC64_GOT_TLSGD16_LO;
2183
      break;
2184
    case BFD_RELOC_PPC_GOT_TLSGD16_HI:          r = R_PPC64_GOT_TLSGD16_HI;
2185
      break;
2186
    case BFD_RELOC_PPC_GOT_TLSGD16_HA:          r = R_PPC64_GOT_TLSGD16_HA;
2187
      break;
2188
    case BFD_RELOC_PPC_GOT_TLSLD16:             r = R_PPC64_GOT_TLSLD16;
2189
      break;
2190
    case BFD_RELOC_PPC_GOT_TLSLD16_LO:          r = R_PPC64_GOT_TLSLD16_LO;
2191
      break;
2192
    case BFD_RELOC_PPC_GOT_TLSLD16_HI:          r = R_PPC64_GOT_TLSLD16_HI;
2193
      break;
2194
    case BFD_RELOC_PPC_GOT_TLSLD16_HA:          r = R_PPC64_GOT_TLSLD16_HA;
2195
      break;
2196
    case BFD_RELOC_PPC_GOT_TPREL16:             r = R_PPC64_GOT_TPREL16_DS;
2197
      break;
2198
    case BFD_RELOC_PPC_GOT_TPREL16_LO:          r = R_PPC64_GOT_TPREL16_LO_DS;
2199
      break;
2200
    case BFD_RELOC_PPC_GOT_TPREL16_HI:          r = R_PPC64_GOT_TPREL16_HI;
2201
      break;
2202
    case BFD_RELOC_PPC_GOT_TPREL16_HA:          r = R_PPC64_GOT_TPREL16_HA;
2203
      break;
2204
    case BFD_RELOC_PPC_GOT_DTPREL16:            r = R_PPC64_GOT_DTPREL16_DS;
2205
      break;
2206
    case BFD_RELOC_PPC_GOT_DTPREL16_LO:         r = R_PPC64_GOT_DTPREL16_LO_DS;
2207
      break;
2208
    case BFD_RELOC_PPC_GOT_DTPREL16_HI:         r = R_PPC64_GOT_DTPREL16_HI;
2209
      break;
2210
    case BFD_RELOC_PPC_GOT_DTPREL16_HA:         r = R_PPC64_GOT_DTPREL16_HA;
2211
      break;
2212
    case BFD_RELOC_PPC64_TPREL16_DS:            r = R_PPC64_TPREL16_DS;
2213
      break;
2214
    case BFD_RELOC_PPC64_TPREL16_LO_DS:         r = R_PPC64_TPREL16_LO_DS;
2215
      break;
2216
    case BFD_RELOC_PPC64_TPREL16_HIGHER:        r = R_PPC64_TPREL16_HIGHER;
2217
      break;
2218
    case BFD_RELOC_PPC64_TPREL16_HIGHERA:       r = R_PPC64_TPREL16_HIGHERA;
2219
      break;
2220
    case BFD_RELOC_PPC64_TPREL16_HIGHEST:       r = R_PPC64_TPREL16_HIGHEST;
2221
      break;
2222
    case BFD_RELOC_PPC64_TPREL16_HIGHESTA:      r = R_PPC64_TPREL16_HIGHESTA;
2223
      break;
2224
    case BFD_RELOC_PPC64_DTPREL16_DS:           r = R_PPC64_DTPREL16_DS;
2225
      break;
2226
    case BFD_RELOC_PPC64_DTPREL16_LO_DS:        r = R_PPC64_DTPREL16_LO_DS;
2227
      break;
2228
    case BFD_RELOC_PPC64_DTPREL16_HIGHER:       r = R_PPC64_DTPREL16_HIGHER;
2229
      break;
2230
    case BFD_RELOC_PPC64_DTPREL16_HIGHERA:      r = R_PPC64_DTPREL16_HIGHERA;
2231
      break;
2232
    case BFD_RELOC_PPC64_DTPREL16_HIGHEST:      r = R_PPC64_DTPREL16_HIGHEST;
2233
      break;
2234
    case BFD_RELOC_PPC64_DTPREL16_HIGHESTA:     r = R_PPC64_DTPREL16_HIGHESTA;
2235
      break;
2236
    case BFD_RELOC_16_PCREL:                    r = R_PPC64_REL16;
2237
      break;
2238
    case BFD_RELOC_LO16_PCREL:                  r = R_PPC64_REL16_LO;
2239
      break;
2240
    case BFD_RELOC_HI16_PCREL:                  r = R_PPC64_REL16_HI;
2241
      break;
2242
    case BFD_RELOC_HI16_S_PCREL:                r = R_PPC64_REL16_HA;
2243
      break;
2244
    case BFD_RELOC_VTABLE_INHERIT:              r = R_PPC64_GNU_VTINHERIT;
2245
      break;
2246
    case BFD_RELOC_VTABLE_ENTRY:                r = R_PPC64_GNU_VTENTRY;
2247
      break;
2248
    }
2249
 
2250
  return ppc64_elf_howto_table[r];
2251
};
2252
 
2253
static reloc_howto_type *
2254
ppc64_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2255
                             const char *r_name)
2256
{
2257
  unsigned int i;
2258
 
2259
  for (i = 0;
2260
       i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
2261
       i++)
2262
    if (ppc64_elf_howto_raw[i].name != NULL
2263
        && strcasecmp (ppc64_elf_howto_raw[i].name, r_name) == 0)
2264
      return &ppc64_elf_howto_raw[i];
2265
 
2266
  return NULL;
2267
}
2268
 
2269
/* Set the howto pointer for a PowerPC ELF reloc.  */
2270
 
2271
static void
2272
ppc64_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2273
                         Elf_Internal_Rela *dst)
2274
{
2275
  unsigned int type;
2276
 
2277
  /* Initialize howto table if needed.  */
2278
  if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2279
    ppc_howto_init ();
2280
 
2281
  type = ELF64_R_TYPE (dst->r_info);
2282
  if (type >= (sizeof (ppc64_elf_howto_table)
2283
               / sizeof (ppc64_elf_howto_table[0])))
2284
    {
2285
      (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
2286
                             abfd, (int) type);
2287
      type = R_PPC64_NONE;
2288
    }
2289
  cache_ptr->howto = ppc64_elf_howto_table[type];
2290
}
2291
 
2292
/* Handle the R_PPC64_ADDR16_HA and similar relocs.  */
2293
 
2294
static bfd_reloc_status_type
2295
ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2296
                    void *data, asection *input_section,
2297
                    bfd *output_bfd, char **error_message)
2298
{
2299
  /* If this is a relocatable link (output_bfd test tells us), just
2300
     call the generic function.  Any adjustment will be done at final
2301
     link time.  */
2302
  if (output_bfd != NULL)
2303
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2304
                                  input_section, output_bfd, error_message);
2305
 
2306
  /* Adjust the addend for sign extension of the low 16 bits.
2307
     We won't actually be using the low 16 bits, so trashing them
2308
     doesn't matter.  */
2309
  reloc_entry->addend += 0x8000;
2310
  return bfd_reloc_continue;
2311
}
2312
 
2313
static bfd_reloc_status_type
2314
ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2315
                        void *data, asection *input_section,
2316
                        bfd *output_bfd, char **error_message)
2317
{
2318
  if (output_bfd != NULL)
2319
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2320
                                  input_section, output_bfd, error_message);
2321
 
2322
  if (strcmp (symbol->section->name, ".opd") == 0
2323
      && (symbol->section->owner->flags & DYNAMIC) == 0)
2324
    {
2325
      bfd_vma dest = opd_entry_value (symbol->section,
2326
                                      symbol->value + reloc_entry->addend,
2327
                                      NULL, NULL);
2328
      if (dest != (bfd_vma) -1)
2329
        reloc_entry->addend = dest - (symbol->value
2330
                                      + symbol->section->output_section->vma
2331
                                      + symbol->section->output_offset);
2332
    }
2333
  return bfd_reloc_continue;
2334
}
2335
 
2336
static bfd_reloc_status_type
2337
ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2338
                         void *data, asection *input_section,
2339
                         bfd *output_bfd, char **error_message)
2340
{
2341
  long insn;
2342
  enum elf_ppc64_reloc_type r_type;
2343
  bfd_size_type octets;
2344
  /* Disabled until we sort out how ld should choose 'y' vs 'at'.  */
2345
  bfd_boolean is_power4 = FALSE;
2346
 
2347
  /* If this is a relocatable link (output_bfd test tells us), just
2348
     call the generic function.  Any adjustment will be done at final
2349
     link time.  */
2350
  if (output_bfd != NULL)
2351
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2352
                                  input_section, output_bfd, error_message);
2353
 
2354
  octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2355
  insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2356
  insn &= ~(0x01 << 21);
2357
  r_type = reloc_entry->howto->type;
2358
  if (r_type == R_PPC64_ADDR14_BRTAKEN
2359
      || r_type == R_PPC64_REL14_BRTAKEN)
2360
    insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field.  */
2361
 
2362
  if (is_power4)
2363
    {
2364
      /* Set 'a' bit.  This is 0b00010 in BO field for branch
2365
         on CR(BI) insns (BO == 001at or 011at), and 0b01000
2366
         for branch on CTR insns (BO == 1a00t or 1a01t).  */
2367
      if ((insn & (0x14 << 21)) == (0x04 << 21))
2368
        insn |= 0x02 << 21;
2369
      else if ((insn & (0x14 << 21)) == (0x10 << 21))
2370
        insn |= 0x08 << 21;
2371
      else
2372
        goto out;
2373
    }
2374
  else
2375
    {
2376
      bfd_vma target = 0;
2377
      bfd_vma from;
2378
 
2379
      if (!bfd_is_com_section (symbol->section))
2380
        target = symbol->value;
2381
      target += symbol->section->output_section->vma;
2382
      target += symbol->section->output_offset;
2383
      target += reloc_entry->addend;
2384
 
2385
      from = (reloc_entry->address
2386
              + input_section->output_offset
2387
              + input_section->output_section->vma);
2388
 
2389
      /* Invert 'y' bit if not the default.  */
2390
      if ((bfd_signed_vma) (target - from) < 0)
2391
        insn ^= 0x01 << 21;
2392
    }
2393
  bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2394
 out:
2395
  return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
2396
                                 input_section, output_bfd, error_message);
2397
}
2398
 
2399
static bfd_reloc_status_type
2400
ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2401
                         void *data, asection *input_section,
2402
                         bfd *output_bfd, char **error_message)
2403
{
2404
  /* If this is a relocatable link (output_bfd test tells us), just
2405
     call the generic function.  Any adjustment will be done at final
2406
     link time.  */
2407
  if (output_bfd != NULL)
2408
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2409
                                  input_section, output_bfd, error_message);
2410
 
2411
  /* Subtract the symbol section base address.  */
2412
  reloc_entry->addend -= symbol->section->output_section->vma;
2413
  return bfd_reloc_continue;
2414
}
2415
 
2416
static bfd_reloc_status_type
2417
ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2418
                            void *data, asection *input_section,
2419
                            bfd *output_bfd, char **error_message)
2420
{
2421
  /* If this is a relocatable link (output_bfd test tells us), just
2422
     call the generic function.  Any adjustment will be done at final
2423
     link time.  */
2424
  if (output_bfd != NULL)
2425
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2426
                                  input_section, output_bfd, error_message);
2427
 
2428
  /* Subtract the symbol section base address.  */
2429
  reloc_entry->addend -= symbol->section->output_section->vma;
2430
 
2431
  /* Adjust the addend for sign extension of the low 16 bits.  */
2432
  reloc_entry->addend += 0x8000;
2433
  return bfd_reloc_continue;
2434
}
2435
 
2436
static bfd_reloc_status_type
2437
ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2438
                     void *data, asection *input_section,
2439
                     bfd *output_bfd, char **error_message)
2440
{
2441
  bfd_vma TOCstart;
2442
 
2443
  /* If this is a relocatable link (output_bfd test tells us), just
2444
     call the generic function.  Any adjustment will be done at final
2445
     link time.  */
2446
  if (output_bfd != NULL)
2447
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2448
                                  input_section, output_bfd, error_message);
2449
 
2450
  TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2451
  if (TOCstart == 0)
2452
    TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2453
 
2454
  /* Subtract the TOC base address.  */
2455
  reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2456
  return bfd_reloc_continue;
2457
}
2458
 
2459
static bfd_reloc_status_type
2460
ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2461
                        void *data, asection *input_section,
2462
                        bfd *output_bfd, char **error_message)
2463
{
2464
  bfd_vma TOCstart;
2465
 
2466
  /* If this is a relocatable link (output_bfd test tells us), just
2467
     call the generic function.  Any adjustment will be done at final
2468
     link time.  */
2469
  if (output_bfd != NULL)
2470
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2471
                                  input_section, output_bfd, error_message);
2472
 
2473
  TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2474
  if (TOCstart == 0)
2475
    TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2476
 
2477
  /* Subtract the TOC base address.  */
2478
  reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2479
 
2480
  /* Adjust the addend for sign extension of the low 16 bits.  */
2481
  reloc_entry->addend += 0x8000;
2482
  return bfd_reloc_continue;
2483
}
2484
 
2485
static bfd_reloc_status_type
2486
ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2487
                       void *data, asection *input_section,
2488
                       bfd *output_bfd, char **error_message)
2489
{
2490
  bfd_vma TOCstart;
2491
  bfd_size_type octets;
2492
 
2493
  /* If this is a relocatable link (output_bfd test tells us), just
2494
     call the generic function.  Any adjustment will be done at final
2495
     link time.  */
2496
  if (output_bfd != NULL)
2497
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2498
                                  input_section, output_bfd, error_message);
2499
 
2500
  TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2501
  if (TOCstart == 0)
2502
    TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2503
 
2504
  octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2505
  bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
2506
  return bfd_reloc_ok;
2507
}
2508
 
2509
static bfd_reloc_status_type
2510
ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2511
                           void *data, asection *input_section,
2512
                           bfd *output_bfd, char **error_message)
2513
{
2514
  /* If this is a relocatable link (output_bfd test tells us), just
2515
     call the generic function.  Any adjustment will be done at final
2516
     link time.  */
2517
  if (output_bfd != NULL)
2518
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2519
                                  input_section, output_bfd, error_message);
2520
 
2521
  if (error_message != NULL)
2522
    {
2523
      static char buf[60];
2524
      sprintf (buf, "generic linker can't handle %s",
2525
               reloc_entry->howto->name);
2526
      *error_message = buf;
2527
    }
2528
  return bfd_reloc_dangerous;
2529
}
2530
 
2531
/* Track GOT entries needed for a given symbol.  We might need more
2532
   than one got entry per symbol.  */
2533
struct got_entry
2534
{
2535
  struct got_entry *next;
2536
 
2537
  /* The symbol addend that we'll be placing in the GOT.  */
2538
  bfd_vma addend;
2539
 
2540
  /* Unlike other ELF targets, we use separate GOT entries for the same
2541
     symbol referenced from different input files.  This is to support
2542
     automatic multiple TOC/GOT sections, where the TOC base can vary
2543
     from one input file to another.  After partitioning into TOC groups
2544
     we merge entries within the group.
2545
 
2546
     Point to the BFD owning this GOT entry.  */
2547
  bfd *owner;
2548
 
2549
  /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
2550
     TLS_TPREL or TLS_DTPREL for tls entries.  */
2551
  unsigned char tls_type;
2552
 
2553
  /* Non-zero if got.ent points to real entry.  */
2554
  unsigned char is_indirect;
2555
 
2556
  /* Reference count until size_dynamic_sections, GOT offset thereafter.  */
2557
  union
2558
    {
2559
      bfd_signed_vma refcount;
2560
      bfd_vma offset;
2561
      struct got_entry *ent;
2562
    } got;
2563
};
2564
 
2565
/* The same for PLT.  */
2566
struct plt_entry
2567
{
2568
  struct plt_entry *next;
2569
 
2570
  bfd_vma addend;
2571
 
2572
  union
2573
    {
2574
      bfd_signed_vma refcount;
2575
      bfd_vma offset;
2576
    } plt;
2577
};
2578
 
2579
struct ppc64_elf_obj_tdata
2580
{
2581
  struct elf_obj_tdata elf;
2582
 
2583
  /* Shortcuts to dynamic linker sections.  */
2584
  asection *got;
2585
  asection *relgot;
2586
 
2587
  /* Used during garbage collection.  We attach global symbols defined
2588
     on removed .opd entries to this section so that the sym is removed.  */
2589
  asection *deleted_section;
2590
 
2591
  /* TLS local dynamic got entry handling.  Support for multiple GOT
2592
     sections means we potentially need one of these for each input bfd.  */
2593
  struct got_entry tlsld_got;
2594
 
2595
  /* A copy of relocs before they are modified for --emit-relocs.  */
2596
  Elf_Internal_Rela *opd_relocs;
2597
 
2598
  /* Nonzero if this bfd has small toc/got relocs, ie. that expect
2599
     the reloc to be in the range -32768 to 32767.  */
2600
  unsigned int has_small_toc_reloc;
2601
};
2602
 
2603
#define ppc64_elf_tdata(bfd) \
2604
  ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
2605
 
2606
#define ppc64_tlsld_got(bfd) \
2607
  (&ppc64_elf_tdata (bfd)->tlsld_got)
2608
 
2609
#define is_ppc64_elf(bfd) \
2610
  (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2611
   && elf_object_id (bfd) == PPC64_ELF_DATA)
2612
 
2613
/* Override the generic function because we store some extras.  */
2614
 
2615
static bfd_boolean
2616
ppc64_elf_mkobject (bfd *abfd)
2617
{
2618
  return bfd_elf_allocate_object (abfd, sizeof (struct ppc64_elf_obj_tdata),
2619
                                  PPC64_ELF_DATA);
2620
}
2621
 
2622
/* Fix bad default arch selected for a 64 bit input bfd when the
2623
   default is 32 bit.  */
2624
 
2625
static bfd_boolean
2626
ppc64_elf_object_p (bfd *abfd)
2627
{
2628
  if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 32)
2629
    {
2630
      Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2631
 
2632
      if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
2633
        {
2634
          /* Relies on arch after 32 bit default being 64 bit default.  */
2635
          abfd->arch_info = abfd->arch_info->next;
2636
          BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
2637
        }
2638
    }
2639
  return TRUE;
2640
}
2641
 
2642
/* Support for core dump NOTE sections.  */
2643
 
2644
static bfd_boolean
2645
ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2646
{
2647
  size_t offset, size;
2648
 
2649
  if (note->descsz != 504)
2650
    return FALSE;
2651
 
2652
  /* pr_cursig */
2653
  elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2654
 
2655
  /* pr_pid */
2656
  elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 32);
2657
 
2658
  /* pr_reg */
2659
  offset = 112;
2660
  size = 384;
2661
 
2662
  /* Make a ".reg/999" section.  */
2663
  return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2664
                                          size, note->descpos + offset);
2665
}
2666
 
2667
static bfd_boolean
2668
ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2669
{
2670
  if (note->descsz != 136)
2671
    return FALSE;
2672
 
2673
  elf_tdata (abfd)->core_pid
2674
    = bfd_get_32 (abfd, note->descdata + 24);
2675
  elf_tdata (abfd)->core_program
2676
    = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
2677
  elf_tdata (abfd)->core_command
2678
    = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
2679
 
2680
  return TRUE;
2681
}
2682
 
2683
static char *
2684
ppc64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
2685
                           ...)
2686
{
2687
  switch (note_type)
2688
    {
2689
    default:
2690
      return NULL;
2691
 
2692
    case NT_PRPSINFO:
2693
      {
2694
        char data[136];
2695
        va_list ap;
2696
 
2697
        va_start (ap, note_type);
2698
        memset (data, 0, 40);
2699
        strncpy (data + 40, va_arg (ap, const char *), 16);
2700
        strncpy (data + 56, va_arg (ap, const char *), 80);
2701
        va_end (ap);
2702
        return elfcore_write_note (abfd, buf, bufsiz,
2703
                                   "CORE", note_type, data, sizeof (data));
2704
      }
2705
 
2706
    case NT_PRSTATUS:
2707
      {
2708
        char data[504];
2709
        va_list ap;
2710
        long pid;
2711
        int cursig;
2712
        const void *greg;
2713
 
2714
        va_start (ap, note_type);
2715
        memset (data, 0, 112);
2716
        pid = va_arg (ap, long);
2717
        bfd_put_32 (abfd, pid, data + 32);
2718
        cursig = va_arg (ap, int);
2719
        bfd_put_16 (abfd, cursig, data + 12);
2720
        greg = va_arg (ap, const void *);
2721
        memcpy (data + 112, greg, 384);
2722
        memset (data + 496, 0, 8);
2723
        va_end (ap);
2724
        return elfcore_write_note (abfd, buf, bufsiz,
2725
                                   "CORE", note_type, data, sizeof (data));
2726
      }
2727
    }
2728
}
2729
 
2730
/* Merge backend specific data from an object file to the output
2731
   object file when linking.  */
2732
 
2733
static bfd_boolean
2734
ppc64_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
2735
{
2736
  /* Check if we have the same endianness.  */
2737
  if (ibfd->xvec->byteorder != obfd->xvec->byteorder
2738
      && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
2739
      && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
2740
    {
2741
      const char *msg;
2742
 
2743
      if (bfd_big_endian (ibfd))
2744
        msg = _("%B: compiled for a big endian system "
2745
                "and target is little endian");
2746
      else
2747
        msg = _("%B: compiled for a little endian system "
2748
                "and target is big endian");
2749
 
2750
      (*_bfd_error_handler) (msg, ibfd);
2751
 
2752
      bfd_set_error (bfd_error_wrong_format);
2753
      return FALSE;
2754
    }
2755
 
2756
  return TRUE;
2757
}
2758
 
2759
/* Add extra PPC sections.  */
2760
 
2761
static const struct bfd_elf_special_section ppc64_elf_special_sections[]=
2762
{
2763
  { STRING_COMMA_LEN (".plt"),    0, SHT_NOBITS,   0 },
2764
  { STRING_COMMA_LEN (".sbss"),  -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
2765
  { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2766
  { STRING_COMMA_LEN (".toc"),    0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2767
  { STRING_COMMA_LEN (".toc1"),   0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2768
  { STRING_COMMA_LEN (".tocbss"), 0, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
2769
  { NULL,                     0,  0, 0,            0 }
2770
};
2771
 
2772
enum _ppc64_sec_type {
2773
  sec_normal = 0,
2774
  sec_opd = 1,
2775
  sec_toc = 2
2776
};
2777
 
2778
struct _ppc64_elf_section_data
2779
{
2780
  struct bfd_elf_section_data elf;
2781
 
2782
  union
2783
  {
2784
    /* An array with one entry for each opd function descriptor.  */
2785
    struct _opd_sec_data
2786
    {
2787
      /* Points to the function code section for local opd entries.  */
2788
      asection **func_sec;
2789
 
2790
      /* After editing .opd, adjust references to opd local syms.  */
2791
      long *adjust;
2792
    } opd;
2793
 
2794
    /* An array for toc sections, indexed by offset/8.  */
2795
    struct _toc_sec_data
2796
    {
2797
      /* Specifies the relocation symbol index used at a given toc offset.  */
2798
      unsigned *symndx;
2799
 
2800
      /* And the relocation addend.  */
2801
      bfd_vma *add;
2802
    } toc;
2803
  } u;
2804
 
2805
  enum _ppc64_sec_type sec_type:2;
2806
 
2807
  /* Flag set when small branches are detected.  Used to
2808
     select suitable defaults for the stub group size.  */
2809
  unsigned int has_14bit_branch:1;
2810
};
2811
 
2812
#define ppc64_elf_section_data(sec) \
2813
  ((struct _ppc64_elf_section_data *) elf_section_data (sec))
2814
 
2815
static bfd_boolean
2816
ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
2817
{
2818
  if (!sec->used_by_bfd)
2819
    {
2820
      struct _ppc64_elf_section_data *sdata;
2821
      bfd_size_type amt = sizeof (*sdata);
2822
 
2823
      sdata = bfd_zalloc (abfd, amt);
2824
      if (sdata == NULL)
2825
        return FALSE;
2826
      sec->used_by_bfd = sdata;
2827
    }
2828
 
2829
  return _bfd_elf_new_section_hook (abfd, sec);
2830
}
2831
 
2832
static struct _opd_sec_data *
2833
get_opd_info (asection * sec)
2834
{
2835
  if (sec != NULL
2836
      && ppc64_elf_section_data (sec) != NULL
2837
      && ppc64_elf_section_data (sec)->sec_type == sec_opd)
2838
    return &ppc64_elf_section_data (sec)->u.opd;
2839
  return NULL;
2840
}
2841
 
2842
/* Parameters for the qsort hook.  */
2843
static bfd_boolean synthetic_relocatable;
2844
 
2845
/* qsort comparison function for ppc64_elf_get_synthetic_symtab.  */
2846
 
2847
static int
2848
compare_symbols (const void *ap, const void *bp)
2849
{
2850
  const asymbol *a = * (const asymbol **) ap;
2851
  const asymbol *b = * (const asymbol **) bp;
2852
 
2853
  /* Section symbols first.  */
2854
  if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
2855
    return -1;
2856
  if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
2857
    return 1;
2858
 
2859
  /* then .opd symbols.  */
2860
  if (strcmp (a->section->name, ".opd") == 0
2861
      && strcmp (b->section->name, ".opd") != 0)
2862
    return -1;
2863
  if (strcmp (a->section->name, ".opd") != 0
2864
      && strcmp (b->section->name, ".opd") == 0)
2865
    return 1;
2866
 
2867
  /* then other code symbols.  */
2868
  if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2869
      == (SEC_CODE | SEC_ALLOC)
2870
      && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2871
         != (SEC_CODE | SEC_ALLOC))
2872
    return -1;
2873
 
2874
  if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2875
      != (SEC_CODE | SEC_ALLOC)
2876
      && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2877
         == (SEC_CODE | SEC_ALLOC))
2878
    return 1;
2879
 
2880
  if (synthetic_relocatable)
2881
    {
2882
      if (a->section->id < b->section->id)
2883
        return -1;
2884
 
2885
      if (a->section->id > b->section->id)
2886
        return 1;
2887
    }
2888
 
2889
  if (a->value + a->section->vma < b->value + b->section->vma)
2890
    return -1;
2891
 
2892
  if (a->value + a->section->vma > b->value + b->section->vma)
2893
    return 1;
2894
 
2895
  /* For syms with the same value, prefer strong dynamic global function
2896
     syms over other syms.  */
2897
  if ((a->flags & BSF_GLOBAL) != 0 && (b->flags & BSF_GLOBAL) == 0)
2898
    return -1;
2899
 
2900
  if ((a->flags & BSF_GLOBAL) == 0 && (b->flags & BSF_GLOBAL) != 0)
2901
    return 1;
2902
 
2903
  if ((a->flags & BSF_FUNCTION) != 0 && (b->flags & BSF_FUNCTION) == 0)
2904
    return -1;
2905
 
2906
  if ((a->flags & BSF_FUNCTION) == 0 && (b->flags & BSF_FUNCTION) != 0)
2907
    return 1;
2908
 
2909
  if ((a->flags & BSF_WEAK) == 0 && (b->flags & BSF_WEAK) != 0)
2910
    return -1;
2911
 
2912
  if ((a->flags & BSF_WEAK) != 0 && (b->flags & BSF_WEAK) == 0)
2913
    return 1;
2914
 
2915
  if ((a->flags & BSF_DYNAMIC) != 0 && (b->flags & BSF_DYNAMIC) == 0)
2916
    return -1;
2917
 
2918
  if ((a->flags & BSF_DYNAMIC) == 0 && (b->flags & BSF_DYNAMIC) != 0)
2919
    return 1;
2920
 
2921
  return 0;
2922
}
2923
 
2924
/* Search SYMS for a symbol of the given VALUE.  */
2925
 
2926
static asymbol *
2927
sym_exists_at (asymbol **syms, long lo, long hi, int id, bfd_vma value)
2928
{
2929
  long mid;
2930
 
2931
  if (id == -1)
2932
    {
2933
      while (lo < hi)
2934
        {
2935
          mid = (lo + hi) >> 1;
2936
          if (syms[mid]->value + syms[mid]->section->vma < value)
2937
            lo = mid + 1;
2938
          else if (syms[mid]->value + syms[mid]->section->vma > value)
2939
            hi = mid;
2940
          else
2941
            return syms[mid];
2942
        }
2943
    }
2944
  else
2945
    {
2946
      while (lo < hi)
2947
        {
2948
          mid = (lo + hi) >> 1;
2949
          if (syms[mid]->section->id < id)
2950
            lo = mid + 1;
2951
          else if (syms[mid]->section->id > id)
2952
            hi = mid;
2953
          else if (syms[mid]->value < value)
2954
            lo = mid + 1;
2955
          else if (syms[mid]->value > value)
2956
            hi = mid;
2957
          else
2958
            return syms[mid];
2959
        }
2960
    }
2961
  return NULL;
2962
}
2963
 
2964
static bfd_boolean
2965
section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
2966
{
2967
  bfd_vma vma = *(bfd_vma *) ptr;
2968
  return ((section->flags & SEC_ALLOC) != 0
2969
          && section->vma <= vma
2970
          && vma < section->vma + section->size);
2971
}
2972
 
2973
/* Create synthetic symbols, effectively restoring "dot-symbol" function
2974
   entry syms.  Also generate @plt symbols for the glink branch table.  */
2975
 
2976
static long
2977
ppc64_elf_get_synthetic_symtab (bfd *abfd,
2978
                                long static_count, asymbol **static_syms,
2979
                                long dyn_count, asymbol **dyn_syms,
2980
                                asymbol **ret)
2981
{
2982
  asymbol *s;
2983
  long i;
2984
  long count;
2985
  char *names;
2986
  long symcount, codesecsym, codesecsymend, secsymend, opdsymend;
2987
  asection *opd;
2988
  bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
2989
  asymbol **syms;
2990
 
2991
  *ret = NULL;
2992
 
2993
  opd = bfd_get_section_by_name (abfd, ".opd");
2994
  if (opd == NULL)
2995
    return 0;
2996
 
2997
  symcount = static_count;
2998
  if (!relocatable)
2999
    symcount += dyn_count;
3000
  if (symcount == 0)
3001
    return 0;
3002
 
3003
  syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
3004
  if (syms == NULL)
3005
    return -1;
3006
 
3007
  if (!relocatable && static_count != 0 && dyn_count != 0)
3008
    {
3009
      /* Use both symbol tables.  */
3010
      memcpy (syms, static_syms, static_count * sizeof (*syms));
3011
      memcpy (syms + static_count, dyn_syms, (dyn_count + 1) * sizeof (*syms));
3012
    }
3013
  else if (!relocatable && static_count == 0)
3014
    memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
3015
  else
3016
    memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
3017
 
3018
  synthetic_relocatable = relocatable;
3019
  qsort (syms, symcount, sizeof (*syms), compare_symbols);
3020
 
3021
  if (!relocatable && symcount > 1)
3022
    {
3023
      long j;
3024
      /* Trim duplicate syms, since we may have merged the normal and
3025
         dynamic symbols.  Actually, we only care about syms that have
3026
         different values, so trim any with the same value.  */
3027
      for (i = 1, j = 1; i < symcount; ++i)
3028
        if (syms[i - 1]->value + syms[i - 1]->section->vma
3029
            != syms[i]->value + syms[i]->section->vma)
3030
          syms[j++] = syms[i];
3031
      symcount = j;
3032
    }
3033
 
3034
  i = 0;
3035
  if (strcmp (syms[i]->section->name, ".opd") == 0)
3036
    ++i;
3037
  codesecsym = i;
3038
 
3039
  for (; i < symcount; ++i)
3040
    if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3041
         != (SEC_CODE | SEC_ALLOC))
3042
        || (syms[i]->flags & BSF_SECTION_SYM) == 0)
3043
      break;
3044
  codesecsymend = i;
3045
 
3046
  for (; i < symcount; ++i)
3047
    if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
3048
      break;
3049
  secsymend = i;
3050
 
3051
  for (; i < symcount; ++i)
3052
    if (strcmp (syms[i]->section->name, ".opd") != 0)
3053
      break;
3054
  opdsymend = i;
3055
 
3056
  for (; i < symcount; ++i)
3057
    if ((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3058
        != (SEC_CODE | SEC_ALLOC))
3059
      break;
3060
  symcount = i;
3061
 
3062
  count = 0;
3063
 
3064
  if (relocatable)
3065
    {
3066
      bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3067
      arelent *r;
3068
      size_t size;
3069
      long relcount;
3070
 
3071
      if (opdsymend == secsymend)
3072
        goto done;
3073
 
3074
      slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3075
      relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
3076
      if (relcount == 0)
3077
        goto done;
3078
 
3079
      if (!(*slurp_relocs) (abfd, opd, static_syms, FALSE))
3080
        {
3081
          count = -1;
3082
          goto done;
3083
        }
3084
 
3085
      size = 0;
3086
      for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
3087
        {
3088
          asymbol *sym;
3089
 
3090
          while (r < opd->relocation + relcount
3091
                 && r->address < syms[i]->value + opd->vma)
3092
            ++r;
3093
 
3094
          if (r == opd->relocation + relcount)
3095
            break;
3096
 
3097
          if (r->address != syms[i]->value + opd->vma)
3098
            continue;
3099
 
3100
          if (r->howto->type != R_PPC64_ADDR64)
3101
            continue;
3102
 
3103
          sym = *r->sym_ptr_ptr;
3104
          if (!sym_exists_at (syms, opdsymend, symcount,
3105
                              sym->section->id, sym->value + r->addend))
3106
            {
3107
              ++count;
3108
              size += sizeof (asymbol);
3109
              size += strlen (syms[i]->name) + 2;
3110
            }
3111
        }
3112
 
3113
      s = *ret = bfd_malloc (size);
3114
      if (s == NULL)
3115
        {
3116
          count = -1;
3117
          goto done;
3118
        }
3119
 
3120
      names = (char *) (s + count);
3121
 
3122
      for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
3123
        {
3124
          asymbol *sym;
3125
 
3126
          while (r < opd->relocation + relcount
3127
                 && r->address < syms[i]->value + opd->vma)
3128
            ++r;
3129
 
3130
          if (r == opd->relocation + relcount)
3131
            break;
3132
 
3133
          if (r->address != syms[i]->value + opd->vma)
3134
            continue;
3135
 
3136
          if (r->howto->type != R_PPC64_ADDR64)
3137
            continue;
3138
 
3139
          sym = *r->sym_ptr_ptr;
3140
          if (!sym_exists_at (syms, opdsymend, symcount,
3141
                              sym->section->id, sym->value + r->addend))
3142
            {
3143
              size_t len;
3144
 
3145
              *s = *syms[i];
3146
              s->flags |= BSF_SYNTHETIC;
3147
              s->section = sym->section;
3148
              s->value = sym->value + r->addend;
3149
              s->name = names;
3150
              *names++ = '.';
3151
              len = strlen (syms[i]->name);
3152
              memcpy (names, syms[i]->name, len + 1);
3153
              names += len + 1;
3154
              /* Have udata.p point back to the original symbol this
3155
                 synthetic symbol was derived from.  */
3156
              s->udata.p = syms[i];
3157
              s++;
3158
            }
3159
        }
3160
    }
3161
  else
3162
    {
3163
      bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3164
      bfd_byte *contents;
3165
      size_t size;
3166
      long plt_count = 0;
3167
      bfd_vma glink_vma = 0, resolv_vma = 0;
3168
      asection *dynamic, *glink = NULL, *relplt = NULL;
3169
      arelent *p;
3170
 
3171
      if (!bfd_malloc_and_get_section (abfd, opd, &contents))
3172
        {
3173
          if (contents)
3174
            {
3175
            free_contents_and_exit:
3176
              free (contents);
3177
            }
3178
          count = -1;
3179
          goto done;
3180
        }
3181
 
3182
      size = 0;
3183
      for (i = secsymend; i < opdsymend; ++i)
3184
        {
3185
          bfd_vma ent;
3186
 
3187
          /* Ignore bogus symbols.  */
3188
          if (syms[i]->value > opd->size - 8)
3189
            continue;
3190
 
3191
          ent = bfd_get_64 (abfd, contents + syms[i]->value);
3192
          if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3193
            {
3194
              ++count;
3195
              size += sizeof (asymbol);
3196
              size += strlen (syms[i]->name) + 2;
3197
            }
3198
        }
3199
 
3200
      /* Get start of .glink stubs from DT_PPC64_GLINK.  */
3201
      if (dyn_count != 0
3202
          && (dynamic = bfd_get_section_by_name (abfd, ".dynamic")) != NULL)
3203
        {
3204
          bfd_byte *dynbuf, *extdyn, *extdynend;
3205
          size_t extdynsize;
3206
          void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
3207
 
3208
          if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
3209
            goto free_contents_and_exit;
3210
 
3211
          extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
3212
          swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
3213
 
3214
          extdyn = dynbuf;
3215
          extdynend = extdyn + dynamic->size;
3216
          for (; extdyn < extdynend; extdyn += extdynsize)
3217
            {
3218
              Elf_Internal_Dyn dyn;
3219
              (*swap_dyn_in) (abfd, extdyn, &dyn);
3220
 
3221
              if (dyn.d_tag == DT_NULL)
3222
                break;
3223
 
3224
              if (dyn.d_tag == DT_PPC64_GLINK)
3225
                {
3226
                  /* The first glink stub starts at offset 32; see comment in
3227
                     ppc64_elf_finish_dynamic_sections. */
3228
                  glink_vma = dyn.d_un.d_val + 32;
3229
                  /* The .glink section usually does not survive the final
3230
                     link; search for the section (usually .text) where the
3231
                     glink stubs now reside.  */
3232
                  glink = bfd_sections_find_if (abfd, section_covers_vma,
3233
                                                &glink_vma);
3234
                  break;
3235
                }
3236
            }
3237
 
3238
          free (dynbuf);
3239
        }
3240
 
3241
      if (glink != NULL)
3242
        {
3243
          /* Determine __glink trampoline by reading the relative branch
3244
             from the first glink stub.  */
3245
          bfd_byte buf[4];
3246
          if (bfd_get_section_contents (abfd, glink, buf,
3247
                                        glink_vma + 4 - glink->vma, 4))
3248
            {
3249
              unsigned int insn = bfd_get_32 (abfd, buf);
3250
              insn ^= B_DOT;
3251
              if ((insn & ~0x3fffffc) == 0)
3252
                resolv_vma = glink_vma + 4 + (insn ^ 0x2000000) - 0x2000000;
3253
            }
3254
 
3255
          if (resolv_vma)
3256
            size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
3257
 
3258
          relplt = bfd_get_section_by_name (abfd, ".rela.plt");
3259
          if (relplt != NULL)
3260
            {
3261
              slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3262
              if (! (*slurp_relocs) (abfd, relplt, dyn_syms, TRUE))
3263
                goto free_contents_and_exit;
3264
 
3265
              plt_count = relplt->size / sizeof (Elf64_External_Rela);
3266
              size += plt_count * sizeof (asymbol);
3267
 
3268
              p = relplt->relocation;
3269
              for (i = 0; i < plt_count; i++, p++)
3270
                {
3271
                  size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
3272
                  if (p->addend != 0)
3273
                    size += sizeof ("+0x") - 1 + 16;
3274
                }
3275
            }
3276
        }
3277
 
3278
      s = *ret = bfd_malloc (size);
3279
      if (s == NULL)
3280
        goto free_contents_and_exit;
3281
 
3282
      names = (char *) (s + count + plt_count + (resolv_vma != 0));
3283
 
3284
      for (i = secsymend; i < opdsymend; ++i)
3285
        {
3286
          bfd_vma ent;
3287
 
3288
          if (syms[i]->value > opd->size - 8)
3289
            continue;
3290
 
3291
          ent = bfd_get_64 (abfd, contents + syms[i]->value);
3292
          if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3293
            {
3294
              long lo, hi;
3295
              size_t len;
3296
              asection *sec = abfd->sections;
3297
 
3298
              *s = *syms[i];
3299
              lo = codesecsym;
3300
              hi = codesecsymend;
3301
              while (lo < hi)
3302
                {
3303
                  long mid = (lo + hi) >> 1;
3304
                  if (syms[mid]->section->vma < ent)
3305
                    lo = mid + 1;
3306
                  else if (syms[mid]->section->vma > ent)
3307
                    hi = mid;
3308
                  else
3309
                    {
3310
                      sec = syms[mid]->section;
3311
                      break;
3312
                    }
3313
                }
3314
 
3315
              if (lo >= hi && lo > codesecsym)
3316
                sec = syms[lo - 1]->section;
3317
 
3318
              for (; sec != NULL; sec = sec->next)
3319
                {
3320
                  if (sec->vma > ent)
3321
                    break;
3322
                  /* SEC_LOAD may not be set if SEC is from a separate debug
3323
                     info file.  */
3324
                  if ((sec->flags & SEC_ALLOC) == 0)
3325
                    break;
3326
                  if ((sec->flags & SEC_CODE) != 0)
3327
                    s->section = sec;
3328
                }
3329
              s->flags |= BSF_SYNTHETIC;
3330
              s->value = ent - s->section->vma;
3331
              s->name = names;
3332
              *names++ = '.';
3333
              len = strlen (syms[i]->name);
3334
              memcpy (names, syms[i]->name, len + 1);
3335
              names += len + 1;
3336
              /* Have udata.p point back to the original symbol this
3337
                 synthetic symbol was derived from.  */
3338
              s->udata.p = syms[i];
3339
              s++;
3340
            }
3341
        }
3342
      free (contents);
3343
 
3344
      if (glink != NULL && relplt != NULL)
3345
        {
3346
          if (resolv_vma)
3347
            {
3348
              /* Add a symbol for the main glink trampoline.  */
3349
              memset (s, 0, sizeof *s);
3350
              s->the_bfd = abfd;
3351
              s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
3352
              s->section = glink;
3353
              s->value = resolv_vma - glink->vma;
3354
              s->name = names;
3355
              memcpy (names, "__glink_PLTresolve", sizeof ("__glink_PLTresolve"));
3356
              names += sizeof ("__glink_PLTresolve");
3357
              s++;
3358
              count++;
3359
            }
3360
 
3361
          /* FIXME: It would be very much nicer to put sym@plt on the
3362
             stub rather than on the glink branch table entry.  The
3363
             objdump disassembler would then use a sensible symbol
3364
             name on plt calls.  The difficulty in doing so is
3365
             a) finding the stubs, and,
3366
             b) matching stubs against plt entries, and,
3367
             c) there can be multiple stubs for a given plt entry.
3368
 
3369
             Solving (a) could be done by code scanning, but older
3370
             ppc64 binaries used different stubs to current code.
3371
             (b) is the tricky one since you need to known the toc
3372
             pointer for at least one function that uses a pic stub to
3373
             be able to calculate the plt address referenced.
3374
             (c) means gdb would need to set multiple breakpoints (or
3375
             find the glink branch itself) when setting breakpoints
3376
             for pending shared library loads.  */
3377
          p = relplt->relocation;
3378
          for (i = 0; i < plt_count; i++, p++)
3379
            {
3380
              size_t len;
3381
 
3382
              *s = **p->sym_ptr_ptr;
3383
              /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set.  Since
3384
                 we are defining a symbol, ensure one of them is set.  */
3385
              if ((s->flags & BSF_LOCAL) == 0)
3386
                s->flags |= BSF_GLOBAL;
3387
              s->flags |= BSF_SYNTHETIC;
3388
              s->section = glink;
3389
              s->value = glink_vma - glink->vma;
3390
              s->name = names;
3391
              s->udata.p = NULL;
3392
              len = strlen ((*p->sym_ptr_ptr)->name);
3393
              memcpy (names, (*p->sym_ptr_ptr)->name, len);
3394
              names += len;
3395
              if (p->addend != 0)
3396
                {
3397
                  memcpy (names, "+0x", sizeof ("+0x") - 1);
3398
                  names += sizeof ("+0x") - 1;
3399
                  bfd_sprintf_vma (abfd, names, p->addend);
3400
                  names += strlen (names);
3401
                }
3402
              memcpy (names, "@plt", sizeof ("@plt"));
3403
              names += sizeof ("@plt");
3404
              s++;
3405
              glink_vma += 8;
3406
              if (i >= 0x8000)
3407
                glink_vma += 4;
3408
            }
3409
          count += plt_count;
3410
        }
3411
    }
3412
 
3413
 done:
3414
  free (syms);
3415
  return count;
3416
}
3417
 
3418
/* The following functions are specific to the ELF linker, while
3419
   functions above are used generally.  Those named ppc64_elf_* are
3420
   called by the main ELF linker code.  They appear in this file more
3421
   or less in the order in which they are called.  eg.
3422
   ppc64_elf_check_relocs is called early in the link process,
3423
   ppc64_elf_finish_dynamic_sections is one of the last functions
3424
   called.
3425
 
3426
   PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
3427
   functions have both a function code symbol and a function descriptor
3428
   symbol.  A call to foo in a relocatable object file looks like:
3429
 
3430
   .            .text
3431
   .    x:
3432
   .            bl      .foo
3433
   .            nop
3434
 
3435
   The function definition in another object file might be:
3436
 
3437
   .            .section .opd
3438
   .    foo:    .quad   .foo
3439
   .            .quad   .TOC.@tocbase
3440
   .            .quad   0
3441
   .
3442
   .            .text
3443
   .    .foo:   blr
3444
 
3445
   When the linker resolves the call during a static link, the branch
3446
   unsurprisingly just goes to .foo and the .opd information is unused.
3447
   If the function definition is in a shared library, things are a little
3448
   different:  The call goes via a plt call stub, the opd information gets
3449
   copied to the plt, and the linker patches the nop.
3450
 
3451
   .    x:
3452
   .            bl      .foo_stub
3453
   .            ld      2,40(1)
3454
   .
3455
   .
3456
   .    .foo_stub:
3457
   .            addis   12,2,Lfoo@toc@ha        # in practice, the call stub
3458
   .            addi    12,12,Lfoo@toc@l        # is slightly optimized, but
3459
   .            std     2,40(1)                 # this is the general idea
3460
   .            ld      11,0(12)
3461
   .            ld      2,8(12)
3462
   .            mtctr   11
3463
   .            ld      11,16(12)
3464
   .            bctr
3465
   .
3466
   .            .section .plt
3467
   .    Lfoo:   reloc (R_PPC64_JMP_SLOT, foo)
3468
 
3469
   The "reloc ()" notation is supposed to indicate that the linker emits
3470
   an R_PPC64_JMP_SLOT reloc against foo.  The dynamic linker does the opd
3471
   copying.
3472
 
3473
   What are the difficulties here?  Well, firstly, the relocations
3474
   examined by the linker in check_relocs are against the function code
3475
   sym .foo, while the dynamic relocation in the plt is emitted against
3476
   the function descriptor symbol, foo.  Somewhere along the line, we need
3477
   to carefully copy dynamic link information from one symbol to the other.
3478
   Secondly, the generic part of the elf linker will make .foo a dynamic
3479
   symbol as is normal for most other backends.  We need foo dynamic
3480
   instead, at least for an application final link.  However, when
3481
   creating a shared library containing foo, we need to have both symbols
3482
   dynamic so that references to .foo are satisfied during the early
3483
   stages of linking.  Otherwise the linker might decide to pull in a
3484
   definition from some other object, eg. a static library.
3485
 
3486
   Update: As of August 2004, we support a new convention.  Function
3487
   calls may use the function descriptor symbol, ie. "bl foo".  This
3488
   behaves exactly as "bl .foo".  */
3489
 
3490
/* Of those relocs that might be copied as dynamic relocs, this function
3491
   selects those that must be copied when linking a shared library,
3492
   even when the symbol is local.  */
3493
 
3494
static int
3495
must_be_dyn_reloc (struct bfd_link_info *info,
3496
                   enum elf_ppc64_reloc_type r_type)
3497
{
3498
  switch (r_type)
3499
    {
3500
    default:
3501
      return 1;
3502
 
3503
    case R_PPC64_REL32:
3504
    case R_PPC64_REL64:
3505
    case R_PPC64_REL30:
3506
      return 0;
3507
 
3508
    case R_PPC64_TPREL16:
3509
    case R_PPC64_TPREL16_LO:
3510
    case R_PPC64_TPREL16_HI:
3511
    case R_PPC64_TPREL16_HA:
3512
    case R_PPC64_TPREL16_DS:
3513
    case R_PPC64_TPREL16_LO_DS:
3514
    case R_PPC64_TPREL16_HIGHER:
3515
    case R_PPC64_TPREL16_HIGHERA:
3516
    case R_PPC64_TPREL16_HIGHEST:
3517
    case R_PPC64_TPREL16_HIGHESTA:
3518
    case R_PPC64_TPREL64:
3519
      return !info->executable;
3520
    }
3521
}
3522
 
3523
/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
3524
   copying dynamic variables from a shared lib into an app's dynbss
3525
   section, and instead use a dynamic relocation to point into the
3526
   shared lib.  With code that gcc generates, it's vital that this be
3527
   enabled;  In the PowerPC64 ABI, the address of a function is actually
3528
   the address of a function descriptor, which resides in the .opd
3529
   section.  gcc uses the descriptor directly rather than going via the
3530
   GOT as some other ABI's do, which means that initialized function
3531
   pointers must reference the descriptor.  Thus, a function pointer
3532
   initialized to the address of a function in a shared library will
3533
   either require a copy reloc, or a dynamic reloc.  Using a copy reloc
3534
   redefines the function descriptor symbol to point to the copy.  This
3535
   presents a problem as a plt entry for that function is also
3536
   initialized from the function descriptor symbol and the copy reloc
3537
   may not be initialized first.  */
3538
#define ELIMINATE_COPY_RELOCS 1
3539
 
3540
/* Section name for stubs is the associated section name plus this
3541
   string.  */
3542
#define STUB_SUFFIX ".stub"
3543
 
3544
/* Linker stubs.
3545
   ppc_stub_long_branch:
3546
   Used when a 14 bit branch (or even a 24 bit branch) can't reach its
3547
   destination, but a 24 bit branch in a stub section will reach.
3548
   .    b       dest
3549
 
3550
   ppc_stub_plt_branch:
3551
   Similar to the above, but a 24 bit branch in the stub section won't
3552
   reach its destination.
3553
   .    addis   %r12,%r2,xxx@toc@ha
3554
   .    ld      %r11,xxx@toc@l(%r12)
3555
   .    mtctr   %r11
3556
   .    bctr
3557
 
3558
   ppc_stub_plt_call:
3559
   Used to call a function in a shared library.  If it so happens that
3560
   the plt entry referenced crosses a 64k boundary, then an extra
3561
   "addi %r12,%r12,xxx@toc@l" will be inserted before the "mtctr".
3562
   .    addis   %r12,%r2,xxx@toc@ha
3563
   .    std     %r2,40(%r1)
3564
   .    ld      %r11,xxx+0@toc@l(%r12)
3565
   .    mtctr   %r11
3566
   .    ld      %r2,xxx+8@toc@l(%r12)
3567
   .    ld      %r11,xxx+16@toc@l(%r12)
3568
   .    bctr
3569
 
3570
   ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
3571
   code to adjust the value and save r2 to support multiple toc sections.
3572
   A ppc_stub_long_branch with an r2 offset looks like:
3573
   .    std     %r2,40(%r1)
3574
   .    addis   %r2,%r2,off@ha
3575
   .    addi    %r2,%r2,off@l
3576
   .    b       dest
3577
 
3578
   A ppc_stub_plt_branch with an r2 offset looks like:
3579
   .    std     %r2,40(%r1)
3580
   .    addis   %r12,%r2,xxx@toc@ha
3581
   .    ld      %r11,xxx@toc@l(%r12)
3582
   .    addis   %r2,%r2,off@ha
3583
   .    addi    %r2,%r2,off@l
3584
   .    mtctr   %r11
3585
   .    bctr
3586
 
3587
   In cases where the "addis" instruction would add zero, the "addis" is
3588
   omitted and following instructions modified slightly in some cases.
3589
*/
3590
 
3591
enum ppc_stub_type {
3592
  ppc_stub_none,
3593
  ppc_stub_long_branch,
3594
  ppc_stub_long_branch_r2off,
3595
  ppc_stub_plt_branch,
3596
  ppc_stub_plt_branch_r2off,
3597
  ppc_stub_plt_call
3598
};
3599
 
3600
struct ppc_stub_hash_entry {
3601
 
3602
  /* Base hash table entry structure.  */
3603
  struct bfd_hash_entry root;
3604
 
3605
  enum ppc_stub_type stub_type;
3606
 
3607
  /* The stub section.  */
3608
  asection *stub_sec;
3609
 
3610
  /* Offset within stub_sec of the beginning of this stub.  */
3611
  bfd_vma stub_offset;
3612
 
3613
  /* Given the symbol's value and its section we can determine its final
3614
     value when building the stubs (so the stub knows where to jump.  */
3615
  bfd_vma target_value;
3616
  asection *target_section;
3617
 
3618
  /* The symbol table entry, if any, that this was derived from.  */
3619
  struct ppc_link_hash_entry *h;
3620
  struct plt_entry *plt_ent;
3621
 
3622
  /* And the reloc addend that this was derived from.  */
3623
  bfd_vma addend;
3624
 
3625
  /* Where this stub is being called from, or, in the case of combined
3626
     stub sections, the first input section in the group.  */
3627
  asection *id_sec;
3628
};
3629
 
3630
struct ppc_branch_hash_entry {
3631
 
3632
  /* Base hash table entry structure.  */
3633
  struct bfd_hash_entry root;
3634
 
3635
  /* Offset within branch lookup table.  */
3636
  unsigned int offset;
3637
 
3638
  /* Generation marker.  */
3639
  unsigned int iter;
3640
};
3641
 
3642
struct ppc_link_hash_entry
3643
{
3644
  struct elf_link_hash_entry elf;
3645
 
3646
  union {
3647
    /* A pointer to the most recently used stub hash entry against this
3648
       symbol.  */
3649
    struct ppc_stub_hash_entry *stub_cache;
3650
 
3651
    /* A pointer to the next symbol starting with a '.'  */
3652
    struct ppc_link_hash_entry *next_dot_sym;
3653
  } u;
3654
 
3655
  /* Track dynamic relocs copied for this symbol.  */
3656
  struct elf_dyn_relocs *dyn_relocs;
3657
 
3658
  /* Link between function code and descriptor symbols.  */
3659
  struct ppc_link_hash_entry *oh;
3660
 
3661
  /* Flag function code and descriptor symbols.  */
3662
  unsigned int is_func:1;
3663
  unsigned int is_func_descriptor:1;
3664
  unsigned int fake:1;
3665
 
3666
  /* Whether global opd/toc sym has been adjusted or not.
3667
     After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
3668
     should be set for all globals defined in any opd/toc section.  */
3669
  unsigned int adjust_done:1;
3670
 
3671
  /* Set if we twiddled this symbol to weak at some stage.  */
3672
  unsigned int was_undefined:1;
3673
 
3674
  /* Contexts in which symbol is used in the GOT (or TOC).
3675
     TLS_GD .. TLS_EXPLICIT bits are or'd into the mask as the
3676
     corresponding relocs are encountered during check_relocs.
3677
     tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
3678
     indicate the corresponding GOT entry type is not needed.
3679
     tls_optimize may also set TLS_TPRELGD when a GD reloc turns into
3680
     a TPREL one.  We use a separate flag rather than setting TPREL
3681
     just for convenience in distinguishing the two cases.  */
3682
#define TLS_GD           1      /* GD reloc. */
3683
#define TLS_LD           2      /* LD reloc. */
3684
#define TLS_TPREL        4      /* TPREL reloc, => IE. */
3685
#define TLS_DTPREL       8      /* DTPREL reloc, => LD. */
3686
#define TLS_TLS         16      /* Any TLS reloc.  */
3687
#define TLS_EXPLICIT    32      /* Marks TOC section TLS relocs. */
3688
#define TLS_TPRELGD     64      /* TPREL reloc resulting from GD->IE. */
3689
#define PLT_IFUNC      128      /* STT_GNU_IFUNC.  */
3690
  unsigned char tls_mask;
3691
};
3692
 
3693
/* ppc64 ELF linker hash table.  */
3694
 
3695
struct ppc_link_hash_table
3696
{
3697
  struct elf_link_hash_table elf;
3698
 
3699
  /* The stub hash table.  */
3700
  struct bfd_hash_table stub_hash_table;
3701
 
3702
  /* Another hash table for plt_branch stubs.  */
3703
  struct bfd_hash_table branch_hash_table;
3704
 
3705
  /* Linker stub bfd.  */
3706
  bfd *stub_bfd;
3707
 
3708
  /* Linker call-backs.  */
3709
  asection * (*add_stub_section) (const char *, asection *);
3710
  void (*layout_sections_again) (void);
3711
 
3712
  /* Array to keep track of which stub sections have been created, and
3713
     information on stub grouping.  */
3714
  struct map_stub {
3715
    /* This is the section to which stubs in the group will be attached.  */
3716
    asection *link_sec;
3717
    /* The stub section.  */
3718
    asection *stub_sec;
3719
    /* Along with elf_gp, specifies the TOC pointer used in this group.  */
3720
    bfd_vma toc_off;
3721
  } *stub_group;
3722
 
3723
  /* Temp used when calculating TOC pointers.  */
3724
  bfd_vma toc_curr;
3725
  bfd *toc_bfd;
3726
  asection *toc_first_sec;
3727
 
3728
  /* Highest input section id.  */
3729
  int top_id;
3730
 
3731
  /* Highest output section index.  */
3732
  int top_index;
3733
 
3734
  /* Used when adding symbols.  */
3735
  struct ppc_link_hash_entry *dot_syms;
3736
 
3737
  /* List of input sections for each output section.  */
3738
  asection **input_list;
3739
 
3740
  /* Short-cuts to get to dynamic linker sections.  */
3741
  asection *got;
3742
  asection *plt;
3743
  asection *relplt;
3744
  asection *iplt;
3745
  asection *reliplt;
3746
  asection *dynbss;
3747
  asection *relbss;
3748
  asection *glink;
3749
  asection *sfpr;
3750
  asection *brlt;
3751
  asection *relbrlt;
3752
 
3753
  /* Shortcut to .__tls_get_addr and __tls_get_addr.  */
3754
  struct ppc_link_hash_entry *tls_get_addr;
3755
  struct ppc_link_hash_entry *tls_get_addr_fd;
3756
 
3757
  /* The size of reliplt used by got entry relocs.  */
3758
  bfd_size_type got_reli_size;
3759
 
3760
  /* Statistics.  */
3761
  unsigned long stub_count[ppc_stub_plt_call];
3762
 
3763
  /* Number of stubs against global syms.  */
3764
  unsigned long stub_globals;
3765
 
3766
  /* Set if we should emit symbols for stubs.  */
3767
  unsigned int emit_stub_syms:1;
3768
 
3769
  /* Set if __tls_get_addr optimization should not be done.  */
3770
  unsigned int no_tls_get_addr_opt:1;
3771
 
3772
  /* Support for multiple toc sections.  */
3773
  unsigned int do_multi_toc:1;
3774
  unsigned int multi_toc_needed:1;
3775
  unsigned int second_toc_pass:1;
3776
  unsigned int do_toc_opt:1;
3777
 
3778
  /* Set on error.  */
3779
  unsigned int stub_error:1;
3780
 
3781
  /* Temp used by ppc64_elf_process_dot_syms.  */
3782
  unsigned int twiddled_syms:1;
3783
 
3784
  /* Incremented every time we size stubs.  */
3785
  unsigned int stub_iteration;
3786
 
3787
  /* Small local sym cache.  */
3788
  struct sym_cache sym_cache;
3789
};
3790
 
3791
/* Rename some of the generic section flags to better document how they
3792
   are used here.  */
3793
 
3794
/* Nonzero if this section has TLS related relocations.  */
3795
#define has_tls_reloc sec_flg0
3796
 
3797
/* Nonzero if this section has a call to __tls_get_addr.  */
3798
#define has_tls_get_addr_call sec_flg1
3799
 
3800
/* Nonzero if this section has any toc or got relocs.  */
3801
#define has_toc_reloc sec_flg2
3802
 
3803
/* Nonzero if this section has a call to another section that uses
3804
   the toc or got.  */
3805
#define makes_toc_func_call sec_flg3
3806
 
3807
/* Recursion protection when determining above flag.  */
3808
#define call_check_in_progress sec_flg4
3809
#define call_check_done sec_flg5
3810
 
3811
/* Get the ppc64 ELF linker hash table from a link_info structure.  */
3812
 
3813
#define ppc_hash_table(p) \
3814
  (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
3815
  == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL)
3816
 
3817
#define ppc_stub_hash_lookup(table, string, create, copy) \
3818
  ((struct ppc_stub_hash_entry *) \
3819
   bfd_hash_lookup ((table), (string), (create), (copy)))
3820
 
3821
#define ppc_branch_hash_lookup(table, string, create, copy) \
3822
  ((struct ppc_branch_hash_entry *) \
3823
   bfd_hash_lookup ((table), (string), (create), (copy)))
3824
 
3825
/* Create an entry in the stub hash table.  */
3826
 
3827
static struct bfd_hash_entry *
3828
stub_hash_newfunc (struct bfd_hash_entry *entry,
3829
                   struct bfd_hash_table *table,
3830
                   const char *string)
3831
{
3832
  /* Allocate the structure if it has not already been allocated by a
3833
     subclass.  */
3834
  if (entry == NULL)
3835
    {
3836
      entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
3837
      if (entry == NULL)
3838
        return entry;
3839
    }
3840
 
3841
  /* Call the allocation method of the superclass.  */
3842
  entry = bfd_hash_newfunc (entry, table, string);
3843
  if (entry != NULL)
3844
    {
3845
      struct ppc_stub_hash_entry *eh;
3846
 
3847
      /* Initialize the local fields.  */
3848
      eh = (struct ppc_stub_hash_entry *) entry;
3849
      eh->stub_type = ppc_stub_none;
3850
      eh->stub_sec = NULL;
3851
      eh->stub_offset = 0;
3852
      eh->target_value = 0;
3853
      eh->target_section = NULL;
3854
      eh->h = NULL;
3855
      eh->id_sec = NULL;
3856
    }
3857
 
3858
  return entry;
3859
}
3860
 
3861
/* Create an entry in the branch hash table.  */
3862
 
3863
static struct bfd_hash_entry *
3864
branch_hash_newfunc (struct bfd_hash_entry *entry,
3865
                     struct bfd_hash_table *table,
3866
                     const char *string)
3867
{
3868
  /* Allocate the structure if it has not already been allocated by a
3869
     subclass.  */
3870
  if (entry == NULL)
3871
    {
3872
      entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
3873
      if (entry == NULL)
3874
        return entry;
3875
    }
3876
 
3877
  /* Call the allocation method of the superclass.  */
3878
  entry = bfd_hash_newfunc (entry, table, string);
3879
  if (entry != NULL)
3880
    {
3881
      struct ppc_branch_hash_entry *eh;
3882
 
3883
      /* Initialize the local fields.  */
3884
      eh = (struct ppc_branch_hash_entry *) entry;
3885
      eh->offset = 0;
3886
      eh->iter = 0;
3887
    }
3888
 
3889
  return entry;
3890
}
3891
 
3892
/* Create an entry in a ppc64 ELF linker hash table.  */
3893
 
3894
static struct bfd_hash_entry *
3895
link_hash_newfunc (struct bfd_hash_entry *entry,
3896
                   struct bfd_hash_table *table,
3897
                   const char *string)
3898
{
3899
  /* Allocate the structure if it has not already been allocated by a
3900
     subclass.  */
3901
  if (entry == NULL)
3902
    {
3903
      entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
3904
      if (entry == NULL)
3905
        return entry;
3906
    }
3907
 
3908
  /* Call the allocation method of the superclass.  */
3909
  entry = _bfd_elf_link_hash_newfunc (entry, table, string);
3910
  if (entry != NULL)
3911
    {
3912
      struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
3913
 
3914
      memset (&eh->u.stub_cache, 0,
3915
              (sizeof (struct ppc_link_hash_entry)
3916
               - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
3917
 
3918
      /* When making function calls, old ABI code references function entry
3919
         points (dot symbols), while new ABI code references the function
3920
         descriptor symbol.  We need to make any combination of reference and
3921
         definition work together, without breaking archive linking.
3922
 
3923
         For a defined function "foo" and an undefined call to "bar":
3924
         An old object defines "foo" and ".foo", references ".bar" (possibly
3925
         "bar" too).
3926
         A new object defines "foo" and references "bar".
3927
 
3928
         A new object thus has no problem with its undefined symbols being
3929
         satisfied by definitions in an old object.  On the other hand, the
3930
         old object won't have ".bar" satisfied by a new object.
3931
 
3932
         Keep a list of newly added dot-symbols.  */
3933
 
3934
      if (string[0] == '.')
3935
        {
3936
          struct ppc_link_hash_table *htab;
3937
 
3938
          htab = (struct ppc_link_hash_table *) table;
3939
          eh->u.next_dot_sym = htab->dot_syms;
3940
          htab->dot_syms = eh;
3941
        }
3942
    }
3943
 
3944
  return entry;
3945
}
3946
 
3947
/* Create a ppc64 ELF linker hash table.  */
3948
 
3949
static struct bfd_link_hash_table *
3950
ppc64_elf_link_hash_table_create (bfd *abfd)
3951
{
3952
  struct ppc_link_hash_table *htab;
3953
  bfd_size_type amt = sizeof (struct ppc_link_hash_table);
3954
 
3955
  htab = bfd_zmalloc (amt);
3956
  if (htab == NULL)
3957
    return NULL;
3958
 
3959
  if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
3960
                                      sizeof (struct ppc_link_hash_entry),
3961
                                      PPC64_ELF_DATA))
3962
    {
3963
      free (htab);
3964
      return NULL;
3965
    }
3966
 
3967
  /* Init the stub hash table too.  */
3968
  if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
3969
                            sizeof (struct ppc_stub_hash_entry)))
3970
    return NULL;
3971
 
3972
  /* And the branch hash table.  */
3973
  if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
3974
                            sizeof (struct ppc_branch_hash_entry)))
3975
    return NULL;
3976
 
3977
  /* Initializing two fields of the union is just cosmetic.  We really
3978
     only care about glist, but when compiled on a 32-bit host the
3979
     bfd_vma fields are larger.  Setting the bfd_vma to zero makes
3980
     debugger inspection of these fields look nicer.  */
3981
  htab->elf.init_got_refcount.refcount = 0;
3982
  htab->elf.init_got_refcount.glist = NULL;
3983
  htab->elf.init_plt_refcount.refcount = 0;
3984
  htab->elf.init_plt_refcount.glist = NULL;
3985
  htab->elf.init_got_offset.offset = 0;
3986
  htab->elf.init_got_offset.glist = NULL;
3987
  htab->elf.init_plt_offset.offset = 0;
3988
  htab->elf.init_plt_offset.glist = NULL;
3989
 
3990
  return &htab->elf.root;
3991
}
3992
 
3993
/* Free the derived linker hash table.  */
3994
 
3995
static void
3996
ppc64_elf_link_hash_table_free (struct bfd_link_hash_table *hash)
3997
{
3998
  struct ppc_link_hash_table *ret = (struct ppc_link_hash_table *) hash;
3999
 
4000
  bfd_hash_table_free (&ret->stub_hash_table);
4001
  bfd_hash_table_free (&ret->branch_hash_table);
4002
  _bfd_generic_link_hash_table_free (hash);
4003
}
4004
 
4005
/* Satisfy the ELF linker by filling in some fields in our fake bfd.  */
4006
 
4007
void
4008
ppc64_elf_init_stub_bfd (bfd *abfd, struct bfd_link_info *info)
4009
{
4010
  struct ppc_link_hash_table *htab;
4011
 
4012
  elf_elfheader (abfd)->e_ident[EI_CLASS] = ELFCLASS64;
4013
 
4014
/* Always hook our dynamic sections into the first bfd, which is the
4015
   linker created stub bfd.  This ensures that the GOT header is at
4016
   the start of the output TOC section.  */
4017
  htab = ppc_hash_table (info);
4018
  if (htab == NULL)
4019
    return;
4020
  htab->stub_bfd = abfd;
4021
  htab->elf.dynobj = abfd;
4022
}
4023
 
4024
/* Build a name for an entry in the stub hash table.  */
4025
 
4026
static char *
4027
ppc_stub_name (const asection *input_section,
4028
               const asection *sym_sec,
4029
               const struct ppc_link_hash_entry *h,
4030
               const Elf_Internal_Rela *rel)
4031
{
4032
  char *stub_name;
4033
  bfd_size_type len;
4034
 
4035
  /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
4036
     offsets from a sym as a branch target?  In fact, we could
4037
     probably assume the addend is always zero.  */
4038
  BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
4039
 
4040
  if (h)
4041
    {
4042
      len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
4043
      stub_name = bfd_malloc (len);
4044
      if (stub_name == NULL)
4045
        return stub_name;
4046
 
4047
      sprintf (stub_name, "%08x.%s+%x",
4048
               input_section->id & 0xffffffff,
4049
               h->elf.root.root.string,
4050
               (int) rel->r_addend & 0xffffffff);
4051
    }
4052
  else
4053
    {
4054
      len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
4055
      stub_name = bfd_malloc (len);
4056
      if (stub_name == NULL)
4057
        return stub_name;
4058
 
4059
      sprintf (stub_name, "%08x.%x:%x+%x",
4060
               input_section->id & 0xffffffff,
4061
               sym_sec->id & 0xffffffff,
4062
               (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
4063
               (int) rel->r_addend & 0xffffffff);
4064
    }
4065
  if (stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
4066
    stub_name[len - 2] = 0;
4067
  return stub_name;
4068
}
4069
 
4070
/* Look up an entry in the stub hash.  Stub entries are cached because
4071
   creating the stub name takes a bit of time.  */
4072
 
4073
static struct ppc_stub_hash_entry *
4074
ppc_get_stub_entry (const asection *input_section,
4075
                    const asection *sym_sec,
4076
                    struct ppc_link_hash_entry *h,
4077
                    const Elf_Internal_Rela *rel,
4078
                    struct ppc_link_hash_table *htab)
4079
{
4080
  struct ppc_stub_hash_entry *stub_entry;
4081
  const asection *id_sec;
4082
 
4083
  /* If this input section is part of a group of sections sharing one
4084
     stub section, then use the id of the first section in the group.
4085
     Stub names need to include a section id, as there may well be
4086
     more than one stub used to reach say, printf, and we need to
4087
     distinguish between them.  */
4088
  id_sec = htab->stub_group[input_section->id].link_sec;
4089
 
4090
  if (h != NULL && h->u.stub_cache != NULL
4091
      && h->u.stub_cache->h == h
4092
      && h->u.stub_cache->id_sec == id_sec)
4093
    {
4094
      stub_entry = h->u.stub_cache;
4095
    }
4096
  else
4097
    {
4098
      char *stub_name;
4099
 
4100
      stub_name = ppc_stub_name (id_sec, sym_sec, h, rel);
4101
      if (stub_name == NULL)
4102
        return NULL;
4103
 
4104
      stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
4105
                                         stub_name, FALSE, FALSE);
4106
      if (h != NULL)
4107
        h->u.stub_cache = stub_entry;
4108
 
4109
      free (stub_name);
4110
    }
4111
 
4112
  return stub_entry;
4113
}
4114
 
4115
/* Add a new stub entry to the stub hash.  Not all fields of the new
4116
   stub entry are initialised.  */
4117
 
4118
static struct ppc_stub_hash_entry *
4119
ppc_add_stub (const char *stub_name,
4120
              asection *section,
4121
              struct bfd_link_info *info)
4122
{
4123
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
4124
  asection *link_sec;
4125
  asection *stub_sec;
4126
  struct ppc_stub_hash_entry *stub_entry;
4127
 
4128
  link_sec = htab->stub_group[section->id].link_sec;
4129
  stub_sec = htab->stub_group[section->id].stub_sec;
4130
  if (stub_sec == NULL)
4131
    {
4132
      stub_sec = htab->stub_group[link_sec->id].stub_sec;
4133
      if (stub_sec == NULL)
4134
        {
4135
          size_t namelen;
4136
          bfd_size_type len;
4137
          char *s_name;
4138
 
4139
          namelen = strlen (link_sec->name);
4140
          len = namelen + sizeof (STUB_SUFFIX);
4141
          s_name = bfd_alloc (htab->stub_bfd, len);
4142
          if (s_name == NULL)
4143
            return NULL;
4144
 
4145
          memcpy (s_name, link_sec->name, namelen);
4146
          memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
4147
          stub_sec = (*htab->add_stub_section) (s_name, link_sec);
4148
          if (stub_sec == NULL)
4149
            return NULL;
4150
          htab->stub_group[link_sec->id].stub_sec = stub_sec;
4151
        }
4152
      htab->stub_group[section->id].stub_sec = stub_sec;
4153
    }
4154
 
4155
  /* Enter this entry into the linker stub hash table.  */
4156
  stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
4157
                                     TRUE, FALSE);
4158
  if (stub_entry == NULL)
4159
    {
4160
      info->callbacks->einfo (_("%B: cannot create stub entry %s\n"),
4161
                              section->owner, stub_name);
4162
      return NULL;
4163
    }
4164
 
4165
  stub_entry->stub_sec = stub_sec;
4166
  stub_entry->stub_offset = 0;
4167
  stub_entry->id_sec = link_sec;
4168
  return stub_entry;
4169
}
4170
 
4171
/* Create sections for linker generated code.  */
4172
 
4173
static bfd_boolean
4174
create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
4175
{
4176
  struct ppc_link_hash_table *htab;
4177
  flagword flags;
4178
 
4179
  htab = ppc_hash_table (info);
4180
  if (htab == NULL)
4181
    return FALSE;
4182
 
4183
  /* Create .sfpr for code to save and restore fp regs.  */
4184
  flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
4185
           | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4186
  htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
4187
                                                   flags);
4188
  if (htab->sfpr == NULL
4189
      || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
4190
    return FALSE;
4191
 
4192
  /* Create .glink for lazy dynamic linking support.  */
4193
  htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
4194
                                                    flags);
4195
  if (htab->glink == NULL
4196
      || ! bfd_set_section_alignment (dynobj, htab->glink, 3))
4197
    return FALSE;
4198
 
4199
  flags = SEC_ALLOC | SEC_LINKER_CREATED;
4200
  htab->iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags);
4201
  if (htab->iplt == NULL
4202
      || ! bfd_set_section_alignment (dynobj, htab->iplt, 3))
4203
    return FALSE;
4204
 
4205
  flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4206
           | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4207
  htab->reliplt = bfd_make_section_anyway_with_flags (dynobj,
4208
                                                      ".rela.iplt",
4209
                                                      flags);
4210
  if (htab->reliplt == NULL
4211
      || ! bfd_set_section_alignment (dynobj, htab->reliplt, 3))
4212
    return FALSE;
4213
 
4214
  /* Create branch lookup table for plt_branch stubs.  */
4215
  flags = (SEC_ALLOC | SEC_LOAD
4216
           | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4217
  htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
4218
                                                   flags);
4219
  if (htab->brlt == NULL
4220
      || ! bfd_set_section_alignment (dynobj, htab->brlt, 3))
4221
    return FALSE;
4222
 
4223
  if (!info->shared)
4224
    return TRUE;
4225
 
4226
  flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4227
           | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4228
  htab->relbrlt = bfd_make_section_anyway_with_flags (dynobj,
4229
                                                      ".rela.branch_lt",
4230
                                                      flags);
4231
  if (htab->relbrlt == NULL
4232
      || ! bfd_set_section_alignment (dynobj, htab->relbrlt, 3))
4233
    return FALSE;
4234
 
4235
  return TRUE;
4236
}
4237
 
4238
/* Create .got and .rela.got sections in ABFD, and .got in dynobj if
4239
   not already done.  */
4240
 
4241
static bfd_boolean
4242
create_got_section (bfd *abfd, struct bfd_link_info *info)
4243
{
4244
  asection *got, *relgot;
4245
  flagword flags;
4246
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
4247
 
4248
  if (!is_ppc64_elf (abfd))
4249
    return FALSE;
4250
  if (htab == NULL)
4251
    return FALSE;
4252
 
4253
  if (!htab->got)
4254
    {
4255
      if (! _bfd_elf_create_got_section (htab->elf.dynobj, info))
4256
        return FALSE;
4257
 
4258
      htab->got = bfd_get_section_by_name (htab->elf.dynobj, ".got");
4259
      if (!htab->got)
4260
        abort ();
4261
    }
4262
 
4263
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4264
           | SEC_LINKER_CREATED);
4265
 
4266
  got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
4267
  if (!got
4268
      || !bfd_set_section_alignment (abfd, got, 3))
4269
    return FALSE;
4270
 
4271
  relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
4272
                                               flags | SEC_READONLY);
4273
  if (!relgot
4274
      || ! bfd_set_section_alignment (abfd, relgot, 3))
4275
    return FALSE;
4276
 
4277
  ppc64_elf_tdata (abfd)->got = got;
4278
  ppc64_elf_tdata (abfd)->relgot = relgot;
4279
  return TRUE;
4280
}
4281
 
4282
/* Create the dynamic sections, and set up shortcuts.  */
4283
 
4284
static bfd_boolean
4285
ppc64_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
4286
{
4287
  struct ppc_link_hash_table *htab;
4288
 
4289
  if (!_bfd_elf_create_dynamic_sections (dynobj, info))
4290
    return FALSE;
4291
 
4292
  htab = ppc_hash_table (info);
4293
  if (htab == NULL)
4294
    return FALSE;
4295
 
4296
  if (!htab->got)
4297
    htab->got = bfd_get_section_by_name (dynobj, ".got");
4298
  htab->plt = bfd_get_section_by_name (dynobj, ".plt");
4299
  htab->relplt = bfd_get_section_by_name (dynobj, ".rela.plt");
4300
  htab->dynbss = bfd_get_section_by_name (dynobj, ".dynbss");
4301
  if (!info->shared)
4302
    htab->relbss = bfd_get_section_by_name (dynobj, ".rela.bss");
4303
 
4304
  if (!htab->got || !htab->plt || !htab->relplt || !htab->dynbss
4305
      || (!info->shared && !htab->relbss))
4306
    abort ();
4307
 
4308
  return TRUE;
4309
}
4310
 
4311
/* Follow indirect and warning symbol links.  */
4312
 
4313
static inline struct bfd_link_hash_entry *
4314
follow_link (struct bfd_link_hash_entry *h)
4315
{
4316
  while (h->type == bfd_link_hash_indirect
4317
         || h->type == bfd_link_hash_warning)
4318
    h = h->u.i.link;
4319
  return h;
4320
}
4321
 
4322
static inline struct elf_link_hash_entry *
4323
elf_follow_link (struct elf_link_hash_entry *h)
4324
{
4325
  return (struct elf_link_hash_entry *) follow_link (&h->root);
4326
}
4327
 
4328
static inline struct ppc_link_hash_entry *
4329
ppc_follow_link (struct ppc_link_hash_entry *h)
4330
{
4331
  return (struct ppc_link_hash_entry *) follow_link (&h->elf.root);
4332
}
4333
 
4334
/* Merge PLT info on FROM with that on TO.  */
4335
 
4336
static void
4337
move_plt_plist (struct ppc_link_hash_entry *from,
4338
                struct ppc_link_hash_entry *to)
4339
{
4340
  if (from->elf.plt.plist != NULL)
4341
    {
4342
      if (to->elf.plt.plist != NULL)
4343
        {
4344
          struct plt_entry **entp;
4345
          struct plt_entry *ent;
4346
 
4347
          for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
4348
            {
4349
              struct plt_entry *dent;
4350
 
4351
              for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
4352
                if (dent->addend == ent->addend)
4353
                  {
4354
                    dent->plt.refcount += ent->plt.refcount;
4355
                    *entp = ent->next;
4356
                    break;
4357
                  }
4358
              if (dent == NULL)
4359
                entp = &ent->next;
4360
            }
4361
          *entp = to->elf.plt.plist;
4362
        }
4363
 
4364
      to->elf.plt.plist = from->elf.plt.plist;
4365
      from->elf.plt.plist = NULL;
4366
    }
4367
}
4368
 
4369
/* Copy the extra info we tack onto an elf_link_hash_entry.  */
4370
 
4371
static void
4372
ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
4373
                                struct elf_link_hash_entry *dir,
4374
                                struct elf_link_hash_entry *ind)
4375
{
4376
  struct ppc_link_hash_entry *edir, *eind;
4377
 
4378
  edir = (struct ppc_link_hash_entry *) dir;
4379
  eind = (struct ppc_link_hash_entry *) ind;
4380
 
4381
  /* Copy over any dynamic relocs we may have on the indirect sym.  */
4382
  if (eind->dyn_relocs != NULL)
4383
    {
4384
      if (edir->dyn_relocs != NULL)
4385
        {
4386
          struct elf_dyn_relocs **pp;
4387
          struct elf_dyn_relocs *p;
4388
 
4389
          /* Add reloc counts against the indirect sym to the direct sym
4390
             list.  Merge any entries against the same section.  */
4391
          for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
4392
            {
4393
              struct elf_dyn_relocs *q;
4394
 
4395
              for (q = edir->dyn_relocs; q != NULL; q = q->next)
4396
                if (q->sec == p->sec)
4397
                  {
4398
                    q->pc_count += p->pc_count;
4399
                    q->count += p->count;
4400
                    *pp = p->next;
4401
                    break;
4402
                  }
4403
              if (q == NULL)
4404
                pp = &p->next;
4405
            }
4406
          *pp = edir->dyn_relocs;
4407
        }
4408
 
4409
      edir->dyn_relocs = eind->dyn_relocs;
4410
      eind->dyn_relocs = NULL;
4411
    }
4412
 
4413
  edir->is_func |= eind->is_func;
4414
  edir->is_func_descriptor |= eind->is_func_descriptor;
4415
  edir->tls_mask |= eind->tls_mask;
4416
  if (eind->oh != NULL)
4417
    edir->oh = ppc_follow_link (eind->oh);
4418
 
4419
  /* If called to transfer flags for a weakdef during processing
4420
     of elf_adjust_dynamic_symbol, don't copy NON_GOT_REF.
4421
     We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
4422
  if (!(ELIMINATE_COPY_RELOCS
4423
        && eind->elf.root.type != bfd_link_hash_indirect
4424
        && edir->elf.dynamic_adjusted))
4425
    edir->elf.non_got_ref |= eind->elf.non_got_ref;
4426
 
4427
  edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
4428
  edir->elf.ref_regular |= eind->elf.ref_regular;
4429
  edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4430
  edir->elf.needs_plt |= eind->elf.needs_plt;
4431
 
4432
  /* If we were called to copy over info for a weak sym, that's all.  */
4433
  if (eind->elf.root.type != bfd_link_hash_indirect)
4434
    return;
4435
 
4436
  /* Copy over got entries that we may have already seen to the
4437
     symbol which just became indirect.  */
4438
  if (eind->elf.got.glist != NULL)
4439
    {
4440
      if (edir->elf.got.glist != NULL)
4441
        {
4442
          struct got_entry **entp;
4443
          struct got_entry *ent;
4444
 
4445
          for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
4446
            {
4447
              struct got_entry *dent;
4448
 
4449
              for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
4450
                if (dent->addend == ent->addend
4451
                    && dent->owner == ent->owner
4452
                    && dent->tls_type == ent->tls_type)
4453
                  {
4454
                    dent->got.refcount += ent->got.refcount;
4455
                    *entp = ent->next;
4456
                    break;
4457
                  }
4458
              if (dent == NULL)
4459
                entp = &ent->next;
4460
            }
4461
          *entp = edir->elf.got.glist;
4462
        }
4463
 
4464
      edir->elf.got.glist = eind->elf.got.glist;
4465
      eind->elf.got.glist = NULL;
4466
    }
4467
 
4468
  /* And plt entries.  */
4469
  move_plt_plist (eind, edir);
4470
 
4471
  if (eind->elf.dynindx != -1)
4472
    {
4473
      if (edir->elf.dynindx != -1)
4474
        _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
4475
                                edir->elf.dynstr_index);
4476
      edir->elf.dynindx = eind->elf.dynindx;
4477
      edir->elf.dynstr_index = eind->elf.dynstr_index;
4478
      eind->elf.dynindx = -1;
4479
      eind->elf.dynstr_index = 0;
4480
    }
4481
}
4482
 
4483
/* Find the function descriptor hash entry from the given function code
4484
   hash entry FH.  Link the entries via their OH fields.  */
4485
 
4486
static struct ppc_link_hash_entry *
4487
lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
4488
{
4489
  struct ppc_link_hash_entry *fdh = fh->oh;
4490
 
4491
  if (fdh == NULL)
4492
    {
4493
      const char *fd_name = fh->elf.root.root.string + 1;
4494
 
4495
      fdh = (struct ppc_link_hash_entry *)
4496
        elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
4497
      if (fdh == NULL)
4498
        return fdh;
4499
 
4500
      fdh->is_func_descriptor = 1;
4501
      fdh->oh = fh;
4502
      fh->is_func = 1;
4503
      fh->oh = fdh;
4504
    }
4505
 
4506
  return ppc_follow_link (fdh);
4507
}
4508
 
4509
/* Make a fake function descriptor sym for the code sym FH.  */
4510
 
4511
static struct ppc_link_hash_entry *
4512
make_fdh (struct bfd_link_info *info,
4513
          struct ppc_link_hash_entry *fh)
4514
{
4515
  bfd *abfd;
4516
  asymbol *newsym;
4517
  struct bfd_link_hash_entry *bh;
4518
  struct ppc_link_hash_entry *fdh;
4519
 
4520
  abfd = fh->elf.root.u.undef.abfd;
4521
  newsym = bfd_make_empty_symbol (abfd);
4522
  newsym->name = fh->elf.root.root.string + 1;
4523
  newsym->section = bfd_und_section_ptr;
4524
  newsym->value = 0;
4525
  newsym->flags = BSF_WEAK;
4526
 
4527
  bh = NULL;
4528
  if (!_bfd_generic_link_add_one_symbol (info, abfd, newsym->name,
4529
                                         newsym->flags, newsym->section,
4530
                                         newsym->value, NULL, FALSE, FALSE,
4531
                                         &bh))
4532
    return NULL;
4533
 
4534
  fdh = (struct ppc_link_hash_entry *) bh;
4535
  fdh->elf.non_elf = 0;
4536
  fdh->fake = 1;
4537
  fdh->is_func_descriptor = 1;
4538
  fdh->oh = fh;
4539
  fh->is_func = 1;
4540
  fh->oh = fdh;
4541
  return fdh;
4542
}
4543
 
4544
/* Fix function descriptor symbols defined in .opd sections to be
4545
   function type.  */
4546
 
4547
static bfd_boolean
4548
ppc64_elf_add_symbol_hook (bfd *ibfd,
4549
                           struct bfd_link_info *info,
4550
                           Elf_Internal_Sym *isym,
4551
                           const char **name ATTRIBUTE_UNUSED,
4552
                           flagword *flags ATTRIBUTE_UNUSED,
4553
                           asection **sec,
4554
                           bfd_vma *value ATTRIBUTE_UNUSED)
4555
{
4556
  if ((ibfd->flags & DYNAMIC) == 0
4557
      && ELF_ST_BIND (isym->st_info) == STB_GNU_UNIQUE)
4558
    elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
4559
 
4560
  if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
4561
    {
4562
      if ((ibfd->flags & DYNAMIC) == 0)
4563
        elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
4564
    }
4565
  else if (ELF_ST_TYPE (isym->st_info) == STT_FUNC)
4566
    ;
4567
  else if (*sec != NULL
4568
           && strcmp ((*sec)->name, ".opd") == 0)
4569
    isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
4570
 
4571
  return TRUE;
4572
}
4573
 
4574
/* This function makes an old ABI object reference to ".bar" cause the
4575
   inclusion of a new ABI object archive that defines "bar".
4576
   NAME is a symbol defined in an archive.  Return a symbol in the hash
4577
   table that might be satisfied by the archive symbols.  */
4578
 
4579
static struct elf_link_hash_entry *
4580
ppc64_elf_archive_symbol_lookup (bfd *abfd,
4581
                                 struct bfd_link_info *info,
4582
                                 const char *name)
4583
{
4584
  struct elf_link_hash_entry *h;
4585
  char *dot_name;
4586
  size_t len;
4587
 
4588
  h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
4589
  if (h != NULL
4590
      /* Don't return this sym if it is a fake function descriptor
4591
         created by add_symbol_adjust.  */
4592
      && !(h->root.type == bfd_link_hash_undefweak
4593
           && ((struct ppc_link_hash_entry *) h)->fake))
4594
    return h;
4595
 
4596
  if (name[0] == '.')
4597
    return h;
4598
 
4599
  len = strlen (name);
4600
  dot_name = bfd_alloc (abfd, len + 2);
4601
  if (dot_name == NULL)
4602
    return (struct elf_link_hash_entry *) 0 - 1;
4603
  dot_name[0] = '.';
4604
  memcpy (dot_name + 1, name, len + 1);
4605
  h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
4606
  bfd_release (abfd, dot_name);
4607
  return h;
4608
}
4609
 
4610
/* This function satisfies all old ABI object references to ".bar" if a
4611
   new ABI object defines "bar".  Well, at least, undefined dot symbols
4612
   are made weak.  This stops later archive searches from including an
4613
   object if we already have a function descriptor definition.  It also
4614
   prevents the linker complaining about undefined symbols.
4615
   We also check and correct mismatched symbol visibility here.  The
4616
   most restrictive visibility of the function descriptor and the
4617
   function entry symbol is used.  */
4618
 
4619
static bfd_boolean
4620
add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
4621
{
4622
  struct ppc_link_hash_table *htab;
4623
  struct ppc_link_hash_entry *fdh;
4624
 
4625
  if (eh->elf.root.type == bfd_link_hash_indirect)
4626
    return TRUE;
4627
 
4628
  if (eh->elf.root.type == bfd_link_hash_warning)
4629
    eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
4630
 
4631
  if (eh->elf.root.root.string[0] != '.')
4632
    abort ();
4633
 
4634
  htab = ppc_hash_table (info);
4635
  if (htab == NULL)
4636
    return FALSE;
4637
 
4638
  fdh = lookup_fdh (eh, htab);
4639
  if (fdh == NULL)
4640
    {
4641
      if (!info->relocatable
4642
          && (eh->elf.root.type == bfd_link_hash_undefined
4643
              || eh->elf.root.type == bfd_link_hash_undefweak)
4644
          && eh->elf.ref_regular)
4645
        {
4646
          /* Make an undefweak function descriptor sym, which is enough to
4647
             pull in an --as-needed shared lib, but won't cause link
4648
             errors.  Archives are handled elsewhere.  */
4649
          fdh = make_fdh (info, eh);
4650
          if (fdh == NULL)
4651
            return FALSE;
4652
          fdh->elf.ref_regular = 1;
4653
        }
4654
    }
4655
  else
4656
    {
4657
      unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
4658
      unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
4659
      if (entry_vis < descr_vis)
4660
        fdh->elf.other += entry_vis - descr_vis;
4661
      else if (entry_vis > descr_vis)
4662
        eh->elf.other += descr_vis - entry_vis;
4663
 
4664
      if ((fdh->elf.root.type == bfd_link_hash_defined
4665
           || fdh->elf.root.type == bfd_link_hash_defweak)
4666
          && eh->elf.root.type == bfd_link_hash_undefined)
4667
        {
4668
          eh->elf.root.type = bfd_link_hash_undefweak;
4669
          eh->was_undefined = 1;
4670
          htab->twiddled_syms = 1;
4671
        }
4672
    }
4673
 
4674
  return TRUE;
4675
}
4676
 
4677
/* Process list of dot-symbols we made in link_hash_newfunc.  */
4678
 
4679
static bfd_boolean
4680
ppc64_elf_process_dot_syms (bfd *ibfd, struct bfd_link_info *info)
4681
{
4682
  struct ppc_link_hash_table *htab;
4683
  struct ppc_link_hash_entry **p, *eh;
4684
 
4685
  if (!is_ppc64_elf (info->output_bfd))
4686
    return TRUE;
4687
  htab = ppc_hash_table (info);
4688
  if (htab == NULL)
4689
    return FALSE;
4690
 
4691
  if (is_ppc64_elf (ibfd))
4692
    {
4693
      p = &htab->dot_syms;
4694
      while ((eh = *p) != NULL)
4695
        {
4696
          *p = NULL;
4697
          if (!add_symbol_adjust (eh, info))
4698
            return FALSE;
4699
          p = &eh->u.next_dot_sym;
4700
        }
4701
    }
4702
 
4703
  /* Clear the list for non-ppc64 input files.  */
4704
  p = &htab->dot_syms;
4705
  while ((eh = *p) != NULL)
4706
    {
4707
      *p = NULL;
4708
      p = &eh->u.next_dot_sym;
4709
    }
4710
 
4711
  /* We need to fix the undefs list for any syms we have twiddled to
4712
     undef_weak.  */
4713
  if (htab->twiddled_syms)
4714
    {
4715
      bfd_link_repair_undef_list (&htab->elf.root);
4716
      htab->twiddled_syms = 0;
4717
    }
4718
  return TRUE;
4719
}
4720
 
4721
/* Undo hash table changes when an --as-needed input file is determined
4722
   not to be needed.  */
4723
 
4724
static bfd_boolean
4725
ppc64_elf_as_needed_cleanup (bfd *ibfd ATTRIBUTE_UNUSED,
4726
                             struct bfd_link_info *info)
4727
{
4728
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
4729
 
4730
  if (htab == NULL)
4731
    return FALSE;
4732
 
4733
  htab->dot_syms = NULL;
4734
  return TRUE;
4735
}
4736
 
4737
/* If --just-symbols against a final linked binary, then assume we need
4738
   toc adjusting stubs when calling functions defined there.  */
4739
 
4740
static void
4741
ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
4742
{
4743
  if ((sec->flags & SEC_CODE) != 0
4744
      && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0
4745
      && is_ppc64_elf (sec->owner))
4746
    {
4747
      asection *got = bfd_get_section_by_name (sec->owner, ".got");
4748
      if (got != NULL
4749
          && got->size >= elf_backend_got_header_size
4750
          && bfd_get_section_by_name (sec->owner, ".opd") != NULL)
4751
        sec->has_toc_reloc = 1;
4752
    }
4753
  _bfd_elf_link_just_syms (sec, info);
4754
}
4755
 
4756
static struct plt_entry **
4757
update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
4758
                       unsigned long r_symndx, bfd_vma r_addend, int tls_type)
4759
{
4760
  struct got_entry **local_got_ents = elf_local_got_ents (abfd);
4761
  struct plt_entry **local_plt;
4762
  unsigned char *local_got_tls_masks;
4763
 
4764
  if (local_got_ents == NULL)
4765
    {
4766
      bfd_size_type size = symtab_hdr->sh_info;
4767
 
4768
      size *= (sizeof (*local_got_ents)
4769
               + sizeof (*local_plt)
4770
               + sizeof (*local_got_tls_masks));
4771
      local_got_ents = bfd_zalloc (abfd, size);
4772
      if (local_got_ents == NULL)
4773
        return NULL;
4774
      elf_local_got_ents (abfd) = local_got_ents;
4775
    }
4776
 
4777
  if ((tls_type & (PLT_IFUNC | TLS_EXPLICIT)) == 0)
4778
    {
4779
      struct got_entry *ent;
4780
 
4781
      for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
4782
        if (ent->addend == r_addend
4783
            && ent->owner == abfd
4784
            && ent->tls_type == tls_type)
4785
          break;
4786
      if (ent == NULL)
4787
        {
4788
          bfd_size_type amt = sizeof (*ent);
4789
          ent = bfd_alloc (abfd, amt);
4790
          if (ent == NULL)
4791
            return FALSE;
4792
          ent->next = local_got_ents[r_symndx];
4793
          ent->addend = r_addend;
4794
          ent->owner = abfd;
4795
          ent->tls_type = tls_type;
4796
          ent->is_indirect = FALSE;
4797
          ent->got.refcount = 0;
4798
          local_got_ents[r_symndx] = ent;
4799
        }
4800
      ent->got.refcount += 1;
4801
    }
4802
 
4803
  local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info);
4804
  local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
4805
  local_got_tls_masks[r_symndx] |= tls_type;
4806
 
4807
  return local_plt + r_symndx;
4808
}
4809
 
4810
static bfd_boolean
4811
update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend)
4812
{
4813
  struct plt_entry *ent;
4814
 
4815
  for (ent = *plist; ent != NULL; ent = ent->next)
4816
    if (ent->addend == addend)
4817
      break;
4818
  if (ent == NULL)
4819
    {
4820
      bfd_size_type amt = sizeof (*ent);
4821
      ent = bfd_alloc (abfd, amt);
4822
      if (ent == NULL)
4823
        return FALSE;
4824
      ent->next = *plist;
4825
      ent->addend = addend;
4826
      ent->plt.refcount = 0;
4827
      *plist = ent;
4828
    }
4829
  ent->plt.refcount += 1;
4830
  return TRUE;
4831
}
4832
 
4833
static bfd_boolean
4834
is_branch_reloc (enum elf_ppc64_reloc_type r_type)
4835
{
4836
  return (r_type == R_PPC64_REL24
4837
          || r_type == R_PPC64_REL14
4838
          || r_type == R_PPC64_REL14_BRTAKEN
4839
          || r_type == R_PPC64_REL14_BRNTAKEN
4840
          || r_type == R_PPC64_ADDR24
4841
          || r_type == R_PPC64_ADDR14
4842
          || r_type == R_PPC64_ADDR14_BRTAKEN
4843
          || r_type == R_PPC64_ADDR14_BRNTAKEN);
4844
}
4845
 
4846
/* Look through the relocs for a section during the first phase, and
4847
   calculate needed space in the global offset table, procedure
4848
   linkage table, and dynamic reloc sections.  */
4849
 
4850
static bfd_boolean
4851
ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
4852
                        asection *sec, const Elf_Internal_Rela *relocs)
4853
{
4854
  struct ppc_link_hash_table *htab;
4855
  Elf_Internal_Shdr *symtab_hdr;
4856
  struct elf_link_hash_entry **sym_hashes;
4857
  const Elf_Internal_Rela *rel;
4858
  const Elf_Internal_Rela *rel_end;
4859
  asection *sreloc;
4860
  asection **opd_sym_map;
4861
  struct elf_link_hash_entry *tga, *dottga;
4862
 
4863
  if (info->relocatable)
4864
    return TRUE;
4865
 
4866
  /* Don't do anything special with non-loaded, non-alloced sections.
4867
     In particular, any relocs in such sections should not affect GOT
4868
     and PLT reference counting (ie. we don't allow them to create GOT
4869
     or PLT entries), there's no possibility or desire to optimize TLS
4870
     relocs, and there's not much point in propagating relocs to shared
4871
     libs that the dynamic linker won't relocate.  */
4872
  if ((sec->flags & SEC_ALLOC) == 0)
4873
    return TRUE;
4874
 
4875
  BFD_ASSERT (is_ppc64_elf (abfd));
4876
 
4877
  htab = ppc_hash_table (info);
4878
  if (htab == NULL)
4879
    return FALSE;
4880
 
4881
  tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
4882
                              FALSE, FALSE, TRUE);
4883
  dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
4884
                                 FALSE, FALSE, TRUE);
4885
  symtab_hdr = &elf_symtab_hdr (abfd);
4886
  sym_hashes = elf_sym_hashes (abfd);
4887
  sreloc = NULL;
4888
  opd_sym_map = NULL;
4889
  if (strcmp (sec->name, ".opd") == 0)
4890
    {
4891
      /* Garbage collection needs some extra help with .opd sections.
4892
         We don't want to necessarily keep everything referenced by
4893
         relocs in .opd, as that would keep all functions.  Instead,
4894
         if we reference an .opd symbol (a function descriptor), we
4895
         want to keep the function code symbol's section.  This is
4896
         easy for global symbols, but for local syms we need to keep
4897
         information about the associated function section.  */
4898
      bfd_size_type amt;
4899
 
4900
      amt = sec->size * sizeof (*opd_sym_map) / 8;
4901
      opd_sym_map = bfd_zalloc (abfd, amt);
4902
      if (opd_sym_map == NULL)
4903
        return FALSE;
4904
      ppc64_elf_section_data (sec)->u.opd.func_sec = opd_sym_map;
4905
      BFD_ASSERT (ppc64_elf_section_data (sec)->sec_type == sec_normal);
4906
      ppc64_elf_section_data (sec)->sec_type = sec_opd;
4907
    }
4908
 
4909
  if (htab->sfpr == NULL
4910
      && !create_linkage_sections (htab->elf.dynobj, info))
4911
    return FALSE;
4912
 
4913
  rel_end = relocs + sec->reloc_count;
4914
  for (rel = relocs; rel < rel_end; rel++)
4915
    {
4916
      unsigned long r_symndx;
4917
      struct elf_link_hash_entry *h;
4918
      enum elf_ppc64_reloc_type r_type;
4919
      int tls_type;
4920
      struct _ppc64_elf_section_data *ppc64_sec;
4921
      struct plt_entry **ifunc;
4922
 
4923
      r_symndx = ELF64_R_SYM (rel->r_info);
4924
      if (r_symndx < symtab_hdr->sh_info)
4925
        h = NULL;
4926
      else
4927
        {
4928
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4929
          h = elf_follow_link (h);
4930
        }
4931
 
4932
      tls_type = 0;
4933
      ifunc = NULL;
4934
      if (h != NULL)
4935
        {
4936
          if (h->type == STT_GNU_IFUNC)
4937
            {
4938
              h->needs_plt = 1;
4939
              ifunc = &h->plt.plist;
4940
            }
4941
        }
4942
      else
4943
        {
4944
          Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
4945
                                                          abfd, r_symndx);
4946
          if (isym == NULL)
4947
            return FALSE;
4948
 
4949
          if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
4950
            {
4951
              ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
4952
                                             rel->r_addend, PLT_IFUNC);
4953
              if (ifunc == NULL)
4954
                return FALSE;
4955
            }
4956
        }
4957
      r_type = ELF64_R_TYPE (rel->r_info);
4958
      if (is_branch_reloc (r_type))
4959
        {
4960
          if (h != NULL && (h == tga || h == dottga))
4961
            {
4962
              if (rel != relocs
4963
                  && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD
4964
                      || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD))
4965
                /* We have a new-style __tls_get_addr call with a marker
4966
                   reloc.  */
4967
                ;
4968
              else
4969
                /* Mark this section as having an old-style call.  */
4970
                sec->has_tls_get_addr_call = 1;
4971
            }
4972
 
4973
          /* STT_GNU_IFUNC symbols must have a PLT entry.  */
4974
          if (ifunc != NULL
4975
              && !update_plt_info (abfd, ifunc, rel->r_addend))
4976
            return FALSE;
4977
        }
4978
 
4979
      switch (r_type)
4980
        {
4981
        case R_PPC64_TLSGD:
4982
        case R_PPC64_TLSLD:
4983
          /* These special tls relocs tie a call to __tls_get_addr with
4984
             its parameter symbol.  */
4985
          break;
4986
 
4987
        case R_PPC64_GOT_TLSLD16:
4988
        case R_PPC64_GOT_TLSLD16_LO:
4989
        case R_PPC64_GOT_TLSLD16_HI:
4990
        case R_PPC64_GOT_TLSLD16_HA:
4991
          tls_type = TLS_TLS | TLS_LD;
4992
          goto dogottls;
4993
 
4994
        case R_PPC64_GOT_TLSGD16:
4995
        case R_PPC64_GOT_TLSGD16_LO:
4996
        case R_PPC64_GOT_TLSGD16_HI:
4997
        case R_PPC64_GOT_TLSGD16_HA:
4998
          tls_type = TLS_TLS | TLS_GD;
4999
          goto dogottls;
5000
 
5001
        case R_PPC64_GOT_TPREL16_DS:
5002
        case R_PPC64_GOT_TPREL16_LO_DS:
5003
        case R_PPC64_GOT_TPREL16_HI:
5004
        case R_PPC64_GOT_TPREL16_HA:
5005
          if (!info->executable)
5006
            info->flags |= DF_STATIC_TLS;
5007
          tls_type = TLS_TLS | TLS_TPREL;
5008
          goto dogottls;
5009
 
5010
        case R_PPC64_GOT_DTPREL16_DS:
5011
        case R_PPC64_GOT_DTPREL16_LO_DS:
5012
        case R_PPC64_GOT_DTPREL16_HI:
5013
        case R_PPC64_GOT_DTPREL16_HA:
5014
          tls_type = TLS_TLS | TLS_DTPREL;
5015
        dogottls:
5016
          sec->has_tls_reloc = 1;
5017
          /* Fall thru */
5018
 
5019
        case R_PPC64_GOT16:
5020
        case R_PPC64_GOT16_DS:
5021
        case R_PPC64_GOT16_HA:
5022
        case R_PPC64_GOT16_HI:
5023
        case R_PPC64_GOT16_LO:
5024
        case R_PPC64_GOT16_LO_DS:
5025
          /* This symbol requires a global offset table entry.  */
5026
          sec->has_toc_reloc = 1;
5027
          if (r_type == R_PPC64_GOT_TLSLD16
5028
              || r_type == R_PPC64_GOT_TLSGD16
5029
              || r_type == R_PPC64_GOT_TPREL16_DS
5030
              || r_type == R_PPC64_GOT_DTPREL16_DS
5031
              || r_type == R_PPC64_GOT16
5032
              || r_type == R_PPC64_GOT16_DS)
5033
            {
5034
              htab->do_multi_toc = 1;
5035
              ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
5036
            }
5037
 
5038
          if (ppc64_elf_tdata (abfd)->got == NULL
5039
              && !create_got_section (abfd, info))
5040
            return FALSE;
5041
 
5042
          if (h != NULL)
5043
            {
5044
              struct ppc_link_hash_entry *eh;
5045
              struct got_entry *ent;
5046
 
5047
              eh = (struct ppc_link_hash_entry *) h;
5048
              for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
5049
                if (ent->addend == rel->r_addend
5050
                    && ent->owner == abfd
5051
                    && ent->tls_type == tls_type)
5052
                  break;
5053
              if (ent == NULL)
5054
                {
5055
                  bfd_size_type amt = sizeof (*ent);
5056
                  ent = bfd_alloc (abfd, amt);
5057
                  if (ent == NULL)
5058
                    return FALSE;
5059
                  ent->next = eh->elf.got.glist;
5060
                  ent->addend = rel->r_addend;
5061
                  ent->owner = abfd;
5062
                  ent->tls_type = tls_type;
5063
                  ent->is_indirect = FALSE;
5064
                  ent->got.refcount = 0;
5065
                  eh->elf.got.glist = ent;
5066
                }
5067
              ent->got.refcount += 1;
5068
              eh->tls_mask |= tls_type;
5069
            }
5070
          else
5071
            /* This is a global offset table entry for a local symbol.  */
5072
            if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5073
                                        rel->r_addend, tls_type))
5074
              return FALSE;
5075
          break;
5076
 
5077
        case R_PPC64_PLT16_HA:
5078
        case R_PPC64_PLT16_HI:
5079
        case R_PPC64_PLT16_LO:
5080
        case R_PPC64_PLT32:
5081
        case R_PPC64_PLT64:
5082
          /* This symbol requires a procedure linkage table entry.  We
5083
             actually build the entry in adjust_dynamic_symbol,
5084
             because this might be a case of linking PIC code without
5085
             linking in any dynamic objects, in which case we don't
5086
             need to generate a procedure linkage table after all.  */
5087
          if (h == NULL)
5088
            {
5089
              /* It does not make sense to have a procedure linkage
5090
                 table entry for a local symbol.  */
5091
              bfd_set_error (bfd_error_bad_value);
5092
              return FALSE;
5093
            }
5094
          else
5095
            {
5096
              if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5097
                return FALSE;
5098
              h->needs_plt = 1;
5099
              if (h->root.root.string[0] == '.'
5100
                  && h->root.root.string[1] != '\0')
5101
                ((struct ppc_link_hash_entry *) h)->is_func = 1;
5102
            }
5103
          break;
5104
 
5105
          /* The following relocations don't need to propagate the
5106
             relocation if linking a shared object since they are
5107
             section relative.  */
5108
        case R_PPC64_SECTOFF:
5109
        case R_PPC64_SECTOFF_LO:
5110
        case R_PPC64_SECTOFF_HI:
5111
        case R_PPC64_SECTOFF_HA:
5112
        case R_PPC64_SECTOFF_DS:
5113
        case R_PPC64_SECTOFF_LO_DS:
5114
        case R_PPC64_DTPREL16:
5115
        case R_PPC64_DTPREL16_LO:
5116
        case R_PPC64_DTPREL16_HI:
5117
        case R_PPC64_DTPREL16_HA:
5118
        case R_PPC64_DTPREL16_DS:
5119
        case R_PPC64_DTPREL16_LO_DS:
5120
        case R_PPC64_DTPREL16_HIGHER:
5121
        case R_PPC64_DTPREL16_HIGHERA:
5122
        case R_PPC64_DTPREL16_HIGHEST:
5123
        case R_PPC64_DTPREL16_HIGHESTA:
5124
          break;
5125
 
5126
          /* Nor do these.  */
5127
        case R_PPC64_REL16:
5128
        case R_PPC64_REL16_LO:
5129
        case R_PPC64_REL16_HI:
5130
        case R_PPC64_REL16_HA:
5131
          break;
5132
 
5133
        case R_PPC64_TOC16:
5134
        case R_PPC64_TOC16_DS:
5135
          htab->do_multi_toc = 1;
5136
          ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
5137
        case R_PPC64_TOC16_LO:
5138
        case R_PPC64_TOC16_HI:
5139
        case R_PPC64_TOC16_HA:
5140
        case R_PPC64_TOC16_LO_DS:
5141
          sec->has_toc_reloc = 1;
5142
          break;
5143
 
5144
          /* This relocation describes the C++ object vtable hierarchy.
5145
             Reconstruct it for later use during GC.  */
5146
        case R_PPC64_GNU_VTINHERIT:
5147
          if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
5148
            return FALSE;
5149
          break;
5150
 
5151
          /* This relocation describes which C++ vtable entries are actually
5152
             used.  Record for later use during GC.  */
5153
        case R_PPC64_GNU_VTENTRY:
5154
          BFD_ASSERT (h != NULL);
5155
          if (h != NULL
5156
              && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
5157
            return FALSE;
5158
          break;
5159
 
5160
        case R_PPC64_REL14:
5161
        case R_PPC64_REL14_BRTAKEN:
5162
        case R_PPC64_REL14_BRNTAKEN:
5163
          {
5164
            asection *dest = NULL;
5165
 
5166
            /* Heuristic: If jumping outside our section, chances are
5167
               we are going to need a stub.  */
5168
            if (h != NULL)
5169
              {
5170
                /* If the sym is weak it may be overridden later, so
5171
                   don't assume we know where a weak sym lives.  */
5172
                if (h->root.type == bfd_link_hash_defined)
5173
                  dest = h->root.u.def.section;
5174
              }
5175
            else
5176
              {
5177
                Elf_Internal_Sym *isym;
5178
 
5179
                isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5180
                                              abfd, r_symndx);
5181
                if (isym == NULL)
5182
                  return FALSE;
5183
 
5184
                dest = bfd_section_from_elf_index (abfd, isym->st_shndx);
5185
              }
5186
 
5187
            if (dest != sec)
5188
              ppc64_elf_section_data (sec)->has_14bit_branch = 1;
5189
          }
5190
          /* Fall through.  */
5191
 
5192
        case R_PPC64_REL24:
5193
          if (h != NULL && ifunc == NULL)
5194
            {
5195
              /* We may need a .plt entry if the function this reloc
5196
                 refers to is in a shared lib.  */
5197
              if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5198
                return FALSE;
5199
              h->needs_plt = 1;
5200
              if (h->root.root.string[0] == '.'
5201
                  && h->root.root.string[1] != '\0')
5202
                ((struct ppc_link_hash_entry *) h)->is_func = 1;
5203
              if (h == tga || h == dottga)
5204
                sec->has_tls_reloc = 1;
5205
            }
5206
          break;
5207
 
5208
        case R_PPC64_TPREL64:
5209
          tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
5210
          if (!info->executable)
5211
            info->flags |= DF_STATIC_TLS;
5212
          goto dotlstoc;
5213
 
5214
        case R_PPC64_DTPMOD64:
5215
          if (rel + 1 < rel_end
5216
              && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
5217
              && rel[1].r_offset == rel->r_offset + 8)
5218
            tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
5219
          else
5220
            tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
5221
          goto dotlstoc;
5222
 
5223
        case R_PPC64_DTPREL64:
5224
          tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
5225
          if (rel != relocs
5226
              && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
5227
              && rel[-1].r_offset == rel->r_offset - 8)
5228
            /* This is the second reloc of a dtpmod, dtprel pair.
5229
               Don't mark with TLS_DTPREL.  */
5230
            goto dodyn;
5231
 
5232
        dotlstoc:
5233
          sec->has_tls_reloc = 1;
5234
          if (h != NULL)
5235
            {
5236
              struct ppc_link_hash_entry *eh;
5237
              eh = (struct ppc_link_hash_entry *) h;
5238
              eh->tls_mask |= tls_type;
5239
            }
5240
          else
5241
            if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5242
                                        rel->r_addend, tls_type))
5243
              return FALSE;
5244
 
5245
          ppc64_sec = ppc64_elf_section_data (sec);
5246
          if (ppc64_sec->sec_type != sec_toc)
5247
            {
5248
              bfd_size_type amt;
5249
 
5250
              /* One extra to simplify get_tls_mask.  */
5251
              amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
5252
              ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
5253
              if (ppc64_sec->u.toc.symndx == NULL)
5254
                return FALSE;
5255
              amt = sec->size * sizeof (bfd_vma) / 8;
5256
              ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
5257
              if (ppc64_sec->u.toc.add == NULL)
5258
                return FALSE;
5259
              BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
5260
              ppc64_sec->sec_type = sec_toc;
5261
            }
5262
          BFD_ASSERT (rel->r_offset % 8 == 0);
5263
          ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
5264
          ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
5265
 
5266
          /* Mark the second slot of a GD or LD entry.
5267
             -1 to indicate GD and -2 to indicate LD.  */
5268
          if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
5269
            ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
5270
          else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
5271
            ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
5272
          goto dodyn;
5273
 
5274
        case R_PPC64_TPREL16:
5275
        case R_PPC64_TPREL16_LO:
5276
        case R_PPC64_TPREL16_HI:
5277
        case R_PPC64_TPREL16_HA:
5278
        case R_PPC64_TPREL16_DS:
5279
        case R_PPC64_TPREL16_LO_DS:
5280
        case R_PPC64_TPREL16_HIGHER:
5281
        case R_PPC64_TPREL16_HIGHERA:
5282
        case R_PPC64_TPREL16_HIGHEST:
5283
        case R_PPC64_TPREL16_HIGHESTA:
5284
          if (info->shared)
5285
            {
5286
              if (!info->executable)
5287
                info->flags |= DF_STATIC_TLS;
5288
              goto dodyn;
5289
            }
5290
          break;
5291
 
5292
        case R_PPC64_ADDR64:
5293
          if (opd_sym_map != NULL
5294
              && rel + 1 < rel_end
5295
              && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
5296
            {
5297
              if (h != NULL)
5298
                {
5299
                  if (h->root.root.string[0] == '.'
5300
                      && h->root.root.string[1] != 0
5301
                      && lookup_fdh ((struct ppc_link_hash_entry *) h, htab))
5302
                    ;
5303
                  else
5304
                    ((struct ppc_link_hash_entry *) h)->is_func = 1;
5305
                }
5306
              else
5307
                {
5308
                  asection *s;
5309
                  Elf_Internal_Sym *isym;
5310
 
5311
                  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5312
                                                abfd, r_symndx);
5313
                  if (isym == NULL)
5314
                    return FALSE;
5315
 
5316
                  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5317
                  if (s != NULL && s != sec)
5318
                    opd_sym_map[rel->r_offset / 8] = s;
5319
                }
5320
            }
5321
          /* Fall through.  */
5322
 
5323
        case R_PPC64_REL30:
5324
        case R_PPC64_REL32:
5325
        case R_PPC64_REL64:
5326
        case R_PPC64_ADDR14:
5327
        case R_PPC64_ADDR14_BRNTAKEN:
5328
        case R_PPC64_ADDR14_BRTAKEN:
5329
        case R_PPC64_ADDR16:
5330
        case R_PPC64_ADDR16_DS:
5331
        case R_PPC64_ADDR16_HA:
5332
        case R_PPC64_ADDR16_HI:
5333
        case R_PPC64_ADDR16_HIGHER:
5334
        case R_PPC64_ADDR16_HIGHERA:
5335
        case R_PPC64_ADDR16_HIGHEST:
5336
        case R_PPC64_ADDR16_HIGHESTA:
5337
        case R_PPC64_ADDR16_LO:
5338
        case R_PPC64_ADDR16_LO_DS:
5339
        case R_PPC64_ADDR24:
5340
        case R_PPC64_ADDR32:
5341
        case R_PPC64_UADDR16:
5342
        case R_PPC64_UADDR32:
5343
        case R_PPC64_UADDR64:
5344
        case R_PPC64_TOC:
5345
          if (h != NULL && !info->shared)
5346
            /* We may need a copy reloc.  */
5347
            h->non_got_ref = 1;
5348
 
5349
          /* Don't propagate .opd relocs.  */
5350
          if (NO_OPD_RELOCS && opd_sym_map != NULL)
5351
            break;
5352
 
5353
          /* If we are creating a shared library, and this is a reloc
5354
             against a global symbol, or a non PC relative reloc
5355
             against a local symbol, then we need to copy the reloc
5356
             into the shared library.  However, if we are linking with
5357
             -Bsymbolic, we do not need to copy a reloc against a
5358
             global symbol which is defined in an object we are
5359
             including in the link (i.e., DEF_REGULAR is set).  At
5360
             this point we have not seen all the input files, so it is
5361
             possible that DEF_REGULAR is not set now but will be set
5362
             later (it is never cleared).  In case of a weak definition,
5363
             DEF_REGULAR may be cleared later by a strong definition in
5364
             a shared library.  We account for that possibility below by
5365
             storing information in the dyn_relocs field of the hash
5366
             table entry.  A similar situation occurs when creating
5367
             shared libraries and symbol visibility changes render the
5368
             symbol local.
5369
 
5370
             If on the other hand, we are creating an executable, we
5371
             may need to keep relocations for symbols satisfied by a
5372
             dynamic library if we manage to avoid copy relocs for the
5373
             symbol.  */
5374
        dodyn:
5375
          if ((info->shared
5376
               && (must_be_dyn_reloc (info, r_type)
5377
                   || (h != NULL
5378
                       && (! info->symbolic
5379
                           || h->root.type == bfd_link_hash_defweak
5380
                           || !h->def_regular))))
5381
              || (ELIMINATE_COPY_RELOCS
5382
                  && !info->shared
5383
                  && h != NULL
5384
                  && (h->root.type == bfd_link_hash_defweak
5385
                      || !h->def_regular))
5386
              || (!info->shared
5387
                  && ifunc != NULL))
5388
            {
5389
              struct elf_dyn_relocs *p;
5390
              struct elf_dyn_relocs **head;
5391
 
5392
              /* We must copy these reloc types into the output file.
5393
                 Create a reloc section in dynobj and make room for
5394
                 this reloc.  */
5395
              if (sreloc == NULL)
5396
                {
5397
                  sreloc = _bfd_elf_make_dynamic_reloc_section
5398
                    (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
5399
 
5400
                  if (sreloc == NULL)
5401
                    return FALSE;
5402
                }
5403
 
5404
              /* If this is a global symbol, we count the number of
5405
                 relocations we need for this symbol.  */
5406
              if (h != NULL)
5407
                {
5408
                  head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
5409
                }
5410
              else
5411
                {
5412
                  /* Track dynamic relocs needed for local syms too.
5413
                     We really need local syms available to do this
5414
                     easily.  Oh well.  */
5415
                  asection *s;
5416
                  void *vpp;
5417
                  Elf_Internal_Sym *isym;
5418
 
5419
                  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5420
                                                abfd, r_symndx);
5421
                  if (isym == NULL)
5422
                    return FALSE;
5423
 
5424
                  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5425
                  if (s == NULL)
5426
                    s = sec;
5427
 
5428
                  vpp = &elf_section_data (s)->local_dynrel;
5429
                  head = (struct elf_dyn_relocs **) vpp;
5430
                }
5431
 
5432
              p = *head;
5433
              if (p == NULL || p->sec != sec)
5434
                {
5435
                  p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5436
                  if (p == NULL)
5437
                    return FALSE;
5438
                  p->next = *head;
5439
                  *head = p;
5440
                  p->sec = sec;
5441
                  p->count = 0;
5442
                  p->pc_count = 0;
5443
                }
5444
 
5445
              p->count += 1;
5446
              if (!must_be_dyn_reloc (info, r_type))
5447
                p->pc_count += 1;
5448
            }
5449
          break;
5450
 
5451
        default:
5452
          break;
5453
        }
5454
    }
5455
 
5456
  return TRUE;
5457
}
5458
 
5459
/* OFFSET in OPD_SEC specifies a function descriptor.  Return the address
5460
   of the code entry point, and its section.  */
5461
 
5462
static bfd_vma
5463
opd_entry_value (asection *opd_sec,
5464
                 bfd_vma offset,
5465
                 asection **code_sec,
5466
                 bfd_vma *code_off)
5467
{
5468
  bfd *opd_bfd = opd_sec->owner;
5469
  Elf_Internal_Rela *relocs;
5470
  Elf_Internal_Rela *lo, *hi, *look;
5471
  bfd_vma val;
5472
 
5473
  /* No relocs implies we are linking a --just-symbols object.  */
5474
  if (opd_sec->reloc_count == 0)
5475
    {
5476
      char buf[8];
5477
 
5478
      if (!bfd_get_section_contents (opd_bfd, opd_sec, buf, offset, 8))
5479
        return (bfd_vma) -1;
5480
 
5481
      val = bfd_get_64 (opd_bfd, buf);
5482
      if (code_sec != NULL)
5483
        {
5484
          asection *sec, *likely = NULL;
5485
          for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
5486
            if (sec->vma <= val
5487
                && (sec->flags & SEC_LOAD) != 0
5488
                && (sec->flags & SEC_ALLOC) != 0)
5489
              likely = sec;
5490
          if (likely != NULL)
5491
            {
5492
              *code_sec = likely;
5493
              if (code_off != NULL)
5494
                *code_off = val - likely->vma;
5495
            }
5496
        }
5497
      return val;
5498
    }
5499
 
5500
  BFD_ASSERT (is_ppc64_elf (opd_bfd));
5501
 
5502
  relocs = ppc64_elf_tdata (opd_bfd)->opd_relocs;
5503
  if (relocs == NULL)
5504
    relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
5505
 
5506
  /* Go find the opd reloc at the sym address.  */
5507
  lo = relocs;
5508
  BFD_ASSERT (lo != NULL);
5509
  hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
5510
  val = (bfd_vma) -1;
5511
  while (lo < hi)
5512
    {
5513
      look = lo + (hi - lo) / 2;
5514
      if (look->r_offset < offset)
5515
        lo = look + 1;
5516
      else if (look->r_offset > offset)
5517
        hi = look;
5518
      else
5519
        {
5520
          Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd);
5521
 
5522
          if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
5523
              && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
5524
            {
5525
              unsigned long symndx = ELF64_R_SYM (look->r_info);
5526
              asection *sec;
5527
 
5528
              if (symndx < symtab_hdr->sh_info)
5529
                {
5530
                  Elf_Internal_Sym *sym;
5531
 
5532
                  sym = (Elf_Internal_Sym *) symtab_hdr->contents;
5533
                  if (sym == NULL)
5534
                    {
5535
                      sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
5536
                                                  symtab_hdr->sh_info,
5537
                                                  0, NULL, NULL, NULL);
5538
                      if (sym == NULL)
5539
                        break;
5540
                      symtab_hdr->contents = (bfd_byte *) sym;
5541
                    }
5542
 
5543
                  sym += symndx;
5544
                  val = sym->st_value;
5545
                  sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
5546
                  BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
5547
                }
5548
              else
5549
                {
5550
                  struct elf_link_hash_entry **sym_hashes;
5551
                  struct elf_link_hash_entry *rh;
5552
 
5553
                  sym_hashes = elf_sym_hashes (opd_bfd);
5554
                  rh = sym_hashes[symndx - symtab_hdr->sh_info];
5555
                  rh = elf_follow_link (rh);
5556
                  BFD_ASSERT (rh->root.type == bfd_link_hash_defined
5557
                              || rh->root.type == bfd_link_hash_defweak);
5558
                  val = rh->root.u.def.value;
5559
                  sec = rh->root.u.def.section;
5560
                }
5561
              val += look->r_addend;
5562
              if (code_off != NULL)
5563
                *code_off = val;
5564
              if (code_sec != NULL)
5565
                *code_sec = sec;
5566
              if (sec != NULL && sec->output_section != NULL)
5567
                val += sec->output_section->vma + sec->output_offset;
5568
            }
5569
          break;
5570
        }
5571
    }
5572
 
5573
  return val;
5574
}
5575
 
5576
/* Return true if symbol is defined in a regular object file.  */
5577
 
5578
static bfd_boolean
5579
is_static_defined (struct elf_link_hash_entry *h)
5580
{
5581
  return ((h->root.type == bfd_link_hash_defined
5582
           || h->root.type == bfd_link_hash_defweak)
5583
          && h->root.u.def.section != NULL
5584
          && h->root.u.def.section->output_section != NULL);
5585
}
5586
 
5587
/* If FDH is a function descriptor symbol, return the associated code
5588
   entry symbol if it is defined.  Return NULL otherwise.  */
5589
 
5590
static struct ppc_link_hash_entry *
5591
defined_code_entry (struct ppc_link_hash_entry *fdh)
5592
{
5593
  if (fdh->is_func_descriptor)
5594
    {
5595
      struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
5596
      if (fh->elf.root.type == bfd_link_hash_defined
5597
          || fh->elf.root.type == bfd_link_hash_defweak)
5598
        return fh;
5599
    }
5600
  return NULL;
5601
}
5602
 
5603
/* If FH is a function code entry symbol, return the associated
5604
   function descriptor symbol if it is defined.  Return NULL otherwise.  */
5605
 
5606
static struct ppc_link_hash_entry *
5607
defined_func_desc (struct ppc_link_hash_entry *fh)
5608
{
5609
  if (fh->oh != NULL
5610
      && fh->oh->is_func_descriptor)
5611
    {
5612
      struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
5613
      if (fdh->elf.root.type == bfd_link_hash_defined
5614
          || fdh->elf.root.type == bfd_link_hash_defweak)
5615
        return fdh;
5616
    }
5617
  return NULL;
5618
}
5619
 
5620
/* Mark all our entry sym sections, both opd and code section.  */
5621
 
5622
static void
5623
ppc64_elf_gc_keep (struct bfd_link_info *info)
5624
{
5625
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
5626
  struct bfd_sym_chain *sym;
5627
 
5628
  if (htab == NULL)
5629
    return;
5630
 
5631
  for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
5632
    {
5633
      struct ppc_link_hash_entry *eh, *fh;
5634
      asection *sec;
5635
 
5636
      eh = (struct ppc_link_hash_entry *)
5637
        elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, TRUE);
5638
      if (eh == NULL)
5639
        continue;
5640
      if (eh->elf.root.type != bfd_link_hash_defined
5641
          && eh->elf.root.type != bfd_link_hash_defweak)
5642
        continue;
5643
 
5644
      fh = defined_code_entry (eh);
5645
      if (fh != NULL)
5646
        {
5647
          sec = fh->elf.root.u.def.section;
5648
          sec->flags |= SEC_KEEP;
5649
        }
5650
      else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5651
               && opd_entry_value (eh->elf.root.u.def.section,
5652
                                   eh->elf.root.u.def.value,
5653
                                   &sec, NULL) != (bfd_vma) -1)
5654
        sec->flags |= SEC_KEEP;
5655
 
5656
      sec = eh->elf.root.u.def.section;
5657
      sec->flags |= SEC_KEEP;
5658
    }
5659
}
5660
 
5661
/* Mark sections containing dynamically referenced symbols.  When
5662
   building shared libraries, we must assume that any visible symbol is
5663
   referenced.  */
5664
 
5665
static bfd_boolean
5666
ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
5667
{
5668
  struct bfd_link_info *info = (struct bfd_link_info *) inf;
5669
  struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
5670
  struct ppc_link_hash_entry *fdh;
5671
 
5672
  if (eh->elf.root.type == bfd_link_hash_warning)
5673
    eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
5674
 
5675
  /* Dynamic linking info is on the func descriptor sym.  */
5676
  fdh = defined_func_desc (eh);
5677
  if (fdh != NULL)
5678
    eh = fdh;
5679
 
5680
  if ((eh->elf.root.type == bfd_link_hash_defined
5681
       || eh->elf.root.type == bfd_link_hash_defweak)
5682
      && (eh->elf.ref_dynamic
5683
          || (!info->executable
5684
              && eh->elf.def_regular
5685
              && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
5686
              && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN)))
5687
    {
5688
      asection *code_sec;
5689
      struct ppc_link_hash_entry *fh;
5690
 
5691
      eh->elf.root.u.def.section->flags |= SEC_KEEP;
5692
 
5693
      /* Function descriptor syms cause the associated
5694
         function code sym section to be marked.  */
5695
      fh = defined_code_entry (eh);
5696
      if (fh != NULL)
5697
        {
5698
          code_sec = fh->elf.root.u.def.section;
5699
          code_sec->flags |= SEC_KEEP;
5700
        }
5701
      else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5702
               && opd_entry_value (eh->elf.root.u.def.section,
5703
                                   eh->elf.root.u.def.value,
5704
                                   &code_sec, NULL) != (bfd_vma) -1)
5705
        code_sec->flags |= SEC_KEEP;
5706
    }
5707
 
5708
  return TRUE;
5709
}
5710
 
5711
/* Return the section that should be marked against GC for a given
5712
   relocation.  */
5713
 
5714
static asection *
5715
ppc64_elf_gc_mark_hook (asection *sec,
5716
                        struct bfd_link_info *info,
5717
                        Elf_Internal_Rela *rel,
5718
                        struct elf_link_hash_entry *h,
5719
                        Elf_Internal_Sym *sym)
5720
{
5721
  asection *rsec;
5722
 
5723
  /* Syms return NULL if we're marking .opd, so we avoid marking all
5724
     function sections, as all functions are referenced in .opd.  */
5725
  rsec = NULL;
5726
  if (get_opd_info (sec) != NULL)
5727
    return rsec;
5728
 
5729
  if (h != NULL)
5730
    {
5731
      enum elf_ppc64_reloc_type r_type;
5732
      struct ppc_link_hash_entry *eh, *fh, *fdh;
5733
 
5734
      r_type = ELF64_R_TYPE (rel->r_info);
5735
      switch (r_type)
5736
        {
5737
        case R_PPC64_GNU_VTINHERIT:
5738
        case R_PPC64_GNU_VTENTRY:
5739
          break;
5740
 
5741
        default:
5742
          switch (h->root.type)
5743
            {
5744
            case bfd_link_hash_defined:
5745
            case bfd_link_hash_defweak:
5746
              eh = (struct ppc_link_hash_entry *) h;
5747
              fdh = defined_func_desc (eh);
5748
              if (fdh != NULL)
5749
                eh = fdh;
5750
 
5751
              /* Function descriptor syms cause the associated
5752
                 function code sym section to be marked.  */
5753
              fh = defined_code_entry (eh);
5754
              if (fh != NULL)
5755
                {
5756
                  /* They also mark their opd section.  */
5757
                  eh->elf.root.u.def.section->gc_mark = 1;
5758
 
5759
                  rsec = fh->elf.root.u.def.section;
5760
                }
5761
              else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5762
                       && opd_entry_value (eh->elf.root.u.def.section,
5763
                                           eh->elf.root.u.def.value,
5764
                                           &rsec, NULL) != (bfd_vma) -1)
5765
                eh->elf.root.u.def.section->gc_mark = 1;
5766
              else
5767
                rsec = h->root.u.def.section;
5768
              break;
5769
 
5770
            case bfd_link_hash_common:
5771
              rsec = h->root.u.c.p->section;
5772
              break;
5773
 
5774
            default:
5775
              return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
5776
            }
5777
        }
5778
    }
5779
  else
5780
    {
5781
      struct _opd_sec_data *opd;
5782
 
5783
      rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
5784
      opd = get_opd_info (rsec);
5785
      if (opd != NULL && opd->func_sec != NULL)
5786
        {
5787
          rsec->gc_mark = 1;
5788
 
5789
          rsec = opd->func_sec[(sym->st_value + rel->r_addend) / 8];
5790
        }
5791
    }
5792
 
5793
  return rsec;
5794
}
5795
 
5796
/* Update the .got, .plt. and dynamic reloc reference counts for the
5797
   section being removed.  */
5798
 
5799
static bfd_boolean
5800
ppc64_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
5801
                         asection *sec, const Elf_Internal_Rela *relocs)
5802
{
5803
  struct ppc_link_hash_table *htab;
5804
  Elf_Internal_Shdr *symtab_hdr;
5805
  struct elf_link_hash_entry **sym_hashes;
5806
  struct got_entry **local_got_ents;
5807
  const Elf_Internal_Rela *rel, *relend;
5808
 
5809
  if (info->relocatable)
5810
    return TRUE;
5811
 
5812
  if ((sec->flags & SEC_ALLOC) == 0)
5813
    return TRUE;
5814
 
5815
  elf_section_data (sec)->local_dynrel = NULL;
5816
 
5817
  htab = ppc_hash_table (info);
5818
  if (htab == NULL)
5819
    return FALSE;
5820
 
5821
  symtab_hdr = &elf_symtab_hdr (abfd);
5822
  sym_hashes = elf_sym_hashes (abfd);
5823
  local_got_ents = elf_local_got_ents (abfd);
5824
 
5825
  relend = relocs + sec->reloc_count;
5826
  for (rel = relocs; rel < relend; rel++)
5827
    {
5828
      unsigned long r_symndx;
5829
      enum elf_ppc64_reloc_type r_type;
5830
      struct elf_link_hash_entry *h = NULL;
5831
      unsigned char tls_type = 0;
5832
 
5833
      r_symndx = ELF64_R_SYM (rel->r_info);
5834
      r_type = ELF64_R_TYPE (rel->r_info);
5835
      if (r_symndx >= symtab_hdr->sh_info)
5836
        {
5837
          struct ppc_link_hash_entry *eh;
5838
          struct elf_dyn_relocs **pp;
5839
          struct elf_dyn_relocs *p;
5840
 
5841
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5842
          h = elf_follow_link (h);
5843
          eh = (struct ppc_link_hash_entry *) h;
5844
 
5845
          for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
5846
            if (p->sec == sec)
5847
              {
5848
                /* Everything must go for SEC.  */
5849
                *pp = p->next;
5850
                break;
5851
              }
5852
        }
5853
 
5854
      if (is_branch_reloc (r_type))
5855
        {
5856
          struct plt_entry **ifunc = NULL;
5857
          if (h != NULL)
5858
            {
5859
              if (h->type == STT_GNU_IFUNC)
5860
                ifunc = &h->plt.plist;
5861
            }
5862
          else if (local_got_ents != NULL)
5863
            {
5864
              struct plt_entry **local_plt = (struct plt_entry **)
5865
                (local_got_ents + symtab_hdr->sh_info);
5866
              unsigned char *local_got_tls_masks = (unsigned char *)
5867
                (local_plt + symtab_hdr->sh_info);
5868
              if ((local_got_tls_masks[r_symndx] & PLT_IFUNC) != 0)
5869
                ifunc = local_plt + r_symndx;
5870
            }
5871
          if (ifunc != NULL)
5872
            {
5873
              struct plt_entry *ent;
5874
 
5875
              for (ent = *ifunc; ent != NULL; ent = ent->next)
5876
                if (ent->addend == rel->r_addend)
5877
                  break;
5878
              if (ent == NULL)
5879
                abort ();
5880
              if (ent->plt.refcount > 0)
5881
                ent->plt.refcount -= 1;
5882
              continue;
5883
            }
5884
        }
5885
 
5886
      switch (r_type)
5887
        {
5888
        case R_PPC64_GOT_TLSLD16:
5889
        case R_PPC64_GOT_TLSLD16_LO:
5890
        case R_PPC64_GOT_TLSLD16_HI:
5891
        case R_PPC64_GOT_TLSLD16_HA:
5892
          tls_type = TLS_TLS | TLS_LD;
5893
          goto dogot;
5894
 
5895
        case R_PPC64_GOT_TLSGD16:
5896
        case R_PPC64_GOT_TLSGD16_LO:
5897
        case R_PPC64_GOT_TLSGD16_HI:
5898
        case R_PPC64_GOT_TLSGD16_HA:
5899
          tls_type = TLS_TLS | TLS_GD;
5900
          goto dogot;
5901
 
5902
        case R_PPC64_GOT_TPREL16_DS:
5903
        case R_PPC64_GOT_TPREL16_LO_DS:
5904
        case R_PPC64_GOT_TPREL16_HI:
5905
        case R_PPC64_GOT_TPREL16_HA:
5906
          tls_type = TLS_TLS | TLS_TPREL;
5907
          goto dogot;
5908
 
5909
        case R_PPC64_GOT_DTPREL16_DS:
5910
        case R_PPC64_GOT_DTPREL16_LO_DS:
5911
        case R_PPC64_GOT_DTPREL16_HI:
5912
        case R_PPC64_GOT_DTPREL16_HA:
5913
          tls_type = TLS_TLS | TLS_DTPREL;
5914
          goto dogot;
5915
 
5916
        case R_PPC64_GOT16:
5917
        case R_PPC64_GOT16_DS:
5918
        case R_PPC64_GOT16_HA:
5919
        case R_PPC64_GOT16_HI:
5920
        case R_PPC64_GOT16_LO:
5921
        case R_PPC64_GOT16_LO_DS:
5922
        dogot:
5923
          {
5924
            struct got_entry *ent;
5925
 
5926
            if (h != NULL)
5927
              ent = h->got.glist;
5928
            else
5929
              ent = local_got_ents[r_symndx];
5930
 
5931
            for (; ent != NULL; ent = ent->next)
5932
              if (ent->addend == rel->r_addend
5933
                  && ent->owner == abfd
5934
                  && ent->tls_type == tls_type)
5935
                break;
5936
            if (ent == NULL)
5937
              abort ();
5938
            if (ent->got.refcount > 0)
5939
              ent->got.refcount -= 1;
5940
          }
5941
          break;
5942
 
5943
        case R_PPC64_PLT16_HA:
5944
        case R_PPC64_PLT16_HI:
5945
        case R_PPC64_PLT16_LO:
5946
        case R_PPC64_PLT32:
5947
        case R_PPC64_PLT64:
5948
        case R_PPC64_REL14:
5949
        case R_PPC64_REL14_BRNTAKEN:
5950
        case R_PPC64_REL14_BRTAKEN:
5951
        case R_PPC64_REL24:
5952
          if (h != NULL)
5953
            {
5954
              struct plt_entry *ent;
5955
 
5956
              for (ent = h->plt.plist; ent != NULL; ent = ent->next)
5957
                if (ent->addend == rel->r_addend)
5958
                  break;
5959
              if (ent != NULL && ent->plt.refcount > 0)
5960
                ent->plt.refcount -= 1;
5961
            }
5962
          break;
5963
 
5964
        default:
5965
          break;
5966
        }
5967
    }
5968
  return TRUE;
5969
}
5970
 
5971
/* The maximum size of .sfpr.  */
5972
#define SFPR_MAX (218*4)
5973
 
5974
struct sfpr_def_parms
5975
{
5976
  const char name[12];
5977
  unsigned char lo, hi;
5978
  bfd_byte * (*write_ent) (bfd *, bfd_byte *, int);
5979
  bfd_byte * (*write_tail) (bfd *, bfd_byte *, int);
5980
};
5981
 
5982
/* Auto-generate _save*, _rest* functions in .sfpr.  */
5983
 
5984
static bfd_boolean
5985
sfpr_define (struct bfd_link_info *info, const struct sfpr_def_parms *parm)
5986
{
5987
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
5988
  unsigned int i;
5989
  size_t len = strlen (parm->name);
5990
  bfd_boolean writing = FALSE;
5991
  char sym[16];
5992
 
5993
  if (htab == NULL)
5994
    return FALSE;
5995
 
5996
  memcpy (sym, parm->name, len);
5997
  sym[len + 2] = 0;
5998
 
5999
  for (i = parm->lo; i <= parm->hi; i++)
6000
    {
6001
      struct elf_link_hash_entry *h;
6002
 
6003
      sym[len + 0] = i / 10 + '0';
6004
      sym[len + 1] = i % 10 + '0';
6005
      h = elf_link_hash_lookup (&htab->elf, sym, FALSE, FALSE, TRUE);
6006
      if (h != NULL
6007
          && !h->def_regular)
6008
        {
6009
          h->root.type = bfd_link_hash_defined;
6010
          h->root.u.def.section = htab->sfpr;
6011
          h->root.u.def.value = htab->sfpr->size;
6012
          h->type = STT_FUNC;
6013
          h->def_regular = 1;
6014
          _bfd_elf_link_hash_hide_symbol (info, h, TRUE);
6015
          writing = TRUE;
6016
          if (htab->sfpr->contents == NULL)
6017
            {
6018
              htab->sfpr->contents = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
6019
              if (htab->sfpr->contents == NULL)
6020
                return FALSE;
6021
            }
6022
        }
6023
      if (writing)
6024
        {
6025
          bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
6026
          if (i != parm->hi)
6027
            p = (*parm->write_ent) (htab->elf.dynobj, p, i);
6028
          else
6029
            p = (*parm->write_tail) (htab->elf.dynobj, p, i);
6030
          htab->sfpr->size = p - htab->sfpr->contents;
6031
        }
6032
    }
6033
 
6034
  return TRUE;
6035
}
6036
 
6037
static bfd_byte *
6038
savegpr0 (bfd *abfd, bfd_byte *p, int r)
6039
{
6040
  bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6041
  return p + 4;
6042
}
6043
 
6044
static bfd_byte *
6045
savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
6046
{
6047
  p = savegpr0 (abfd, p, r);
6048
  bfd_put_32 (abfd, STD_R0_0R1 + 16, p);
6049
  p = p + 4;
6050
  bfd_put_32 (abfd, BLR, p);
6051
  return p + 4;
6052
}
6053
 
6054
static bfd_byte *
6055
restgpr0 (bfd *abfd, bfd_byte *p, int r)
6056
{
6057
  bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6058
  return p + 4;
6059
}
6060
 
6061
static bfd_byte *
6062
restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
6063
{
6064
  bfd_put_32 (abfd, LD_R0_0R1 + 16, p);
6065
  p = p + 4;
6066
  p = restgpr0 (abfd, p, r);
6067
  bfd_put_32 (abfd, MTLR_R0, p);
6068
  p = p + 4;
6069
  if (r == 29)
6070
    {
6071
      p = restgpr0 (abfd, p, 30);
6072
      p = restgpr0 (abfd, p, 31);
6073
    }
6074
  bfd_put_32 (abfd, BLR, p);
6075
  return p + 4;
6076
}
6077
 
6078
static bfd_byte *
6079
savegpr1 (bfd *abfd, bfd_byte *p, int r)
6080
{
6081
  bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6082
  return p + 4;
6083
}
6084
 
6085
static bfd_byte *
6086
savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
6087
{
6088
  p = savegpr1 (abfd, p, r);
6089
  bfd_put_32 (abfd, BLR, p);
6090
  return p + 4;
6091
}
6092
 
6093
static bfd_byte *
6094
restgpr1 (bfd *abfd, bfd_byte *p, int r)
6095
{
6096
  bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6097
  return p + 4;
6098
}
6099
 
6100
static bfd_byte *
6101
restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
6102
{
6103
  p = restgpr1 (abfd, p, r);
6104
  bfd_put_32 (abfd, BLR, p);
6105
  return p + 4;
6106
}
6107
 
6108
static bfd_byte *
6109
savefpr (bfd *abfd, bfd_byte *p, int r)
6110
{
6111
  bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6112
  return p + 4;
6113
}
6114
 
6115
static bfd_byte *
6116
savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
6117
{
6118
  p = savefpr (abfd, p, r);
6119
  bfd_put_32 (abfd, STD_R0_0R1 + 16, p);
6120
  p = p + 4;
6121
  bfd_put_32 (abfd, BLR, p);
6122
  return p + 4;
6123
}
6124
 
6125
static bfd_byte *
6126
restfpr (bfd *abfd, bfd_byte *p, int r)
6127
{
6128
  bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6129
  return p + 4;
6130
}
6131
 
6132
static bfd_byte *
6133
restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
6134
{
6135
  bfd_put_32 (abfd, LD_R0_0R1 + 16, p);
6136
  p = p + 4;
6137
  p = restfpr (abfd, p, r);
6138
  bfd_put_32 (abfd, MTLR_R0, p);
6139
  p = p + 4;
6140
  if (r == 29)
6141
    {
6142
      p = restfpr (abfd, p, 30);
6143
      p = restfpr (abfd, p, 31);
6144
    }
6145
  bfd_put_32 (abfd, BLR, p);
6146
  return p + 4;
6147
}
6148
 
6149
static bfd_byte *
6150
savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
6151
{
6152
  p = savefpr (abfd, p, r);
6153
  bfd_put_32 (abfd, BLR, p);
6154
  return p + 4;
6155
}
6156
 
6157
static bfd_byte *
6158
restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
6159
{
6160
  p = restfpr (abfd, p, r);
6161
  bfd_put_32 (abfd, BLR, p);
6162
  return p + 4;
6163
}
6164
 
6165
static bfd_byte *
6166
savevr (bfd *abfd, bfd_byte *p, int r)
6167
{
6168
  bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6169
  p = p + 4;
6170
  bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
6171
  return p + 4;
6172
}
6173
 
6174
static bfd_byte *
6175
savevr_tail (bfd *abfd, bfd_byte *p, int r)
6176
{
6177
  p = savevr (abfd, p, r);
6178
  bfd_put_32 (abfd, BLR, p);
6179
  return p + 4;
6180
}
6181
 
6182
static bfd_byte *
6183
restvr (bfd *abfd, bfd_byte *p, int r)
6184
{
6185
  bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6186
  p = p + 4;
6187
  bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
6188
  return p + 4;
6189
}
6190
 
6191
static bfd_byte *
6192
restvr_tail (bfd *abfd, bfd_byte *p, int r)
6193
{
6194
  p = restvr (abfd, p, r);
6195
  bfd_put_32 (abfd, BLR, p);
6196
  return p + 4;
6197
}
6198
 
6199
/* Called via elf_link_hash_traverse to transfer dynamic linking
6200
   information on function code symbol entries to their corresponding
6201
   function descriptor symbol entries.  */
6202
 
6203
static bfd_boolean
6204
func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
6205
{
6206
  struct bfd_link_info *info;
6207
  struct ppc_link_hash_table *htab;
6208
  struct plt_entry *ent;
6209
  struct ppc_link_hash_entry *fh;
6210
  struct ppc_link_hash_entry *fdh;
6211
  bfd_boolean force_local;
6212
 
6213
  fh = (struct ppc_link_hash_entry *) h;
6214
  if (fh->elf.root.type == bfd_link_hash_indirect)
6215
    return TRUE;
6216
 
6217
  if (fh->elf.root.type == bfd_link_hash_warning)
6218
    fh = (struct ppc_link_hash_entry *) fh->elf.root.u.i.link;
6219
 
6220
  info = inf;
6221
  htab = ppc_hash_table (info);
6222
  if (htab == NULL)
6223
    return FALSE;
6224
 
6225
  /* Resolve undefined references to dot-symbols as the value
6226
     in the function descriptor, if we have one in a regular object.
6227
     This is to satisfy cases like ".quad .foo".  Calls to functions
6228
     in dynamic objects are handled elsewhere.  */
6229
  if (fh->elf.root.type == bfd_link_hash_undefweak
6230
      && fh->was_undefined
6231
      && (fdh = defined_func_desc (fh)) != NULL
6232
      && get_opd_info (fdh->elf.root.u.def.section) != NULL
6233
      && opd_entry_value (fdh->elf.root.u.def.section,
6234
                          fdh->elf.root.u.def.value,
6235
                          &fh->elf.root.u.def.section,
6236
                          &fh->elf.root.u.def.value) != (bfd_vma) -1)
6237
    {
6238
      fh->elf.root.type = fdh->elf.root.type;
6239
      fh->elf.forced_local = 1;
6240
      fh->elf.def_regular = fdh->elf.def_regular;
6241
      fh->elf.def_dynamic = fdh->elf.def_dynamic;
6242
    }
6243
 
6244
  /* If this is a function code symbol, transfer dynamic linking
6245
     information to the function descriptor symbol.  */
6246
  if (!fh->is_func)
6247
    return TRUE;
6248
 
6249
  for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
6250
    if (ent->plt.refcount > 0)
6251
      break;
6252
  if (ent == NULL
6253
      || fh->elf.root.root.string[0] != '.'
6254
      || fh->elf.root.root.string[1] == '\0')
6255
    return TRUE;
6256
 
6257
  /* Find the corresponding function descriptor symbol.  Create it
6258
     as undefined if necessary.  */
6259
 
6260
  fdh = lookup_fdh (fh, htab);
6261
  if (fdh == NULL
6262
      && !info->executable
6263
      && (fh->elf.root.type == bfd_link_hash_undefined
6264
          || fh->elf.root.type == bfd_link_hash_undefweak))
6265
    {
6266
      fdh = make_fdh (info, fh);
6267
      if (fdh == NULL)
6268
        return FALSE;
6269
    }
6270
 
6271
  /* Fake function descriptors are made undefweak.  If the function
6272
     code symbol is strong undefined, make the fake sym the same.
6273
     If the function code symbol is defined, then force the fake
6274
     descriptor local;  We can't support overriding of symbols in a
6275
     shared library on a fake descriptor.  */
6276
 
6277
  if (fdh != NULL
6278
      && fdh->fake
6279
      && fdh->elf.root.type == bfd_link_hash_undefweak)
6280
    {
6281
      if (fh->elf.root.type == bfd_link_hash_undefined)
6282
        {
6283
          fdh->elf.root.type = bfd_link_hash_undefined;
6284
          bfd_link_add_undef (&htab->elf.root, &fdh->elf.root);
6285
        }
6286
      else if (fh->elf.root.type == bfd_link_hash_defined
6287
               || fh->elf.root.type == bfd_link_hash_defweak)
6288
        {
6289
          _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
6290
        }
6291
    }
6292
 
6293
  if (fdh != NULL
6294
      && !fdh->elf.forced_local
6295
      && (!info->executable
6296
          || fdh->elf.def_dynamic
6297
          || fdh->elf.ref_dynamic
6298
          || (fdh->elf.root.type == bfd_link_hash_undefweak
6299
              && ELF_ST_VISIBILITY (fdh->elf.other) == STV_DEFAULT)))
6300
    {
6301
      if (fdh->elf.dynindx == -1)
6302
        if (! bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
6303
          return FALSE;
6304
      fdh->elf.ref_regular |= fh->elf.ref_regular;
6305
      fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
6306
      fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
6307
      fdh->elf.non_got_ref |= fh->elf.non_got_ref;
6308
      if (ELF_ST_VISIBILITY (fh->elf.other) == STV_DEFAULT)
6309
        {
6310
          move_plt_plist (fh, fdh);
6311
          fdh->elf.needs_plt = 1;
6312
        }
6313
      fdh->is_func_descriptor = 1;
6314
      fdh->oh = fh;
6315
      fh->oh = fdh;
6316
    }
6317
 
6318
  /* Now that the info is on the function descriptor, clear the
6319
     function code sym info.  Any function code syms for which we
6320
     don't have a definition in a regular file, we force local.
6321
     This prevents a shared library from exporting syms that have
6322
     been imported from another library.  Function code syms that
6323
     are really in the library we must leave global to prevent the
6324
     linker dragging in a definition from a static library.  */
6325
  force_local = (!fh->elf.def_regular
6326
                 || fdh == NULL
6327
                 || !fdh->elf.def_regular
6328
                 || fdh->elf.forced_local);
6329
  _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
6330
 
6331
  return TRUE;
6332
}
6333
 
6334
/* Called near the start of bfd_elf_size_dynamic_sections.  We use
6335
   this hook to a) provide some gcc support functions, and b) transfer
6336
   dynamic linking information gathered so far on function code symbol
6337
   entries, to their corresponding function descriptor symbol entries.  */
6338
 
6339
static bfd_boolean
6340
ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
6341
                            struct bfd_link_info *info)
6342
{
6343
  struct ppc_link_hash_table *htab;
6344
  unsigned int i;
6345
  const struct sfpr_def_parms funcs[] =
6346
    {
6347
      { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
6348
      { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
6349
      { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
6350
      { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
6351
      { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
6352
      { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
6353
      { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
6354
      { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
6355
      { "._savef", 14, 31, savefpr, savefpr1_tail },
6356
      { "._restf", 14, 31, restfpr, restfpr1_tail },
6357
      { "_savevr_", 20, 31, savevr, savevr_tail },
6358
      { "_restvr_", 20, 31, restvr, restvr_tail }
6359
    };
6360
 
6361
  htab = ppc_hash_table (info);
6362
  if (htab == NULL)
6363
    return FALSE;
6364
 
6365
  if (htab->sfpr == NULL)
6366
    /* We don't have any relocs.  */
6367
    return TRUE;
6368
 
6369
  /* Provide any missing _save* and _rest* functions.  */
6370
  htab->sfpr->size = 0;
6371
  for (i = 0; i < sizeof (funcs) / sizeof (funcs[0]); i++)
6372
    if (!sfpr_define (info, &funcs[i]))
6373
      return FALSE;
6374
 
6375
  elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
6376
 
6377
  if (htab->sfpr->size == 0)
6378
    htab->sfpr->flags |= SEC_EXCLUDE;
6379
 
6380
  return TRUE;
6381
}
6382
 
6383
/* Adjust a symbol defined by a dynamic object and referenced by a
6384
   regular object.  The current definition is in some section of the
6385
   dynamic object, but we're not including those sections.  We have to
6386
   change the definition to something the rest of the link can
6387
   understand.  */
6388
 
6389
static bfd_boolean
6390
ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
6391
                                 struct elf_link_hash_entry *h)
6392
{
6393
  struct ppc_link_hash_table *htab;
6394
  asection *s;
6395
 
6396
  htab = ppc_hash_table (info);
6397
  if (htab == NULL)
6398
    return FALSE;
6399
 
6400
  /* Deal with function syms.  */
6401
  if (h->type == STT_FUNC
6402
      || h->type == STT_GNU_IFUNC
6403
      || h->needs_plt)
6404
    {
6405
      /* Clear procedure linkage table information for any symbol that
6406
         won't need a .plt entry.  */
6407
      struct plt_entry *ent;
6408
      for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6409
        if (ent->plt.refcount > 0)
6410
          break;
6411
      if (ent == NULL
6412
          || (h->type != STT_GNU_IFUNC
6413
              && (SYMBOL_CALLS_LOCAL (info, h)
6414
                  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
6415
                      && h->root.type == bfd_link_hash_undefweak))))
6416
        {
6417
          h->plt.plist = NULL;
6418
          h->needs_plt = 0;
6419
        }
6420
    }
6421
  else
6422
    h->plt.plist = NULL;
6423
 
6424
  /* If this is a weak symbol, and there is a real definition, the
6425
     processor independent code will have arranged for us to see the
6426
     real definition first, and we can just use the same value.  */
6427
  if (h->u.weakdef != NULL)
6428
    {
6429
      BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
6430
                  || h->u.weakdef->root.type == bfd_link_hash_defweak);
6431
      h->root.u.def.section = h->u.weakdef->root.u.def.section;
6432
      h->root.u.def.value = h->u.weakdef->root.u.def.value;
6433
      if (ELIMINATE_COPY_RELOCS)
6434
        h->non_got_ref = h->u.weakdef->non_got_ref;
6435
      return TRUE;
6436
    }
6437
 
6438
  /* If we are creating a shared library, we must presume that the
6439
     only references to the symbol are via the global offset table.
6440
     For such cases we need not do anything here; the relocations will
6441
     be handled correctly by relocate_section.  */
6442
  if (info->shared)
6443
    return TRUE;
6444
 
6445
  /* If there are no references to this symbol that do not use the
6446
     GOT, we don't need to generate a copy reloc.  */
6447
  if (!h->non_got_ref)
6448
    return TRUE;
6449
 
6450
  /* Don't generate a copy reloc for symbols defined in the executable.  */
6451
  if (!h->def_dynamic || !h->ref_regular || h->def_regular)
6452
    return TRUE;
6453
 
6454
  if (ELIMINATE_COPY_RELOCS)
6455
    {
6456
      struct ppc_link_hash_entry * eh;
6457
      struct elf_dyn_relocs *p;
6458
 
6459
      eh = (struct ppc_link_hash_entry *) h;
6460
      for (p = eh->dyn_relocs; p != NULL; p = p->next)
6461
        {
6462
          s = p->sec->output_section;
6463
          if (s != NULL && (s->flags & SEC_READONLY) != 0)
6464
            break;
6465
        }
6466
 
6467
      /* If we didn't find any dynamic relocs in read-only sections, then
6468
         we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
6469
      if (p == NULL)
6470
        {
6471
          h->non_got_ref = 0;
6472
          return TRUE;
6473
        }
6474
    }
6475
 
6476
  if (h->plt.plist != NULL)
6477
    {
6478
      /* We should never get here, but unfortunately there are versions
6479
         of gcc out there that improperly (for this ABI) put initialized
6480
         function pointers, vtable refs and suchlike in read-only
6481
         sections.  Allow them to proceed, but warn that this might
6482
         break at runtime.  */
6483
      info->callbacks->einfo
6484
        (_("copy reloc against `%s' requires lazy plt linking; "
6485
           "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
6486
         h->root.root.string);
6487
    }
6488
 
6489
  /* This is a reference to a symbol defined by a dynamic object which
6490
     is not a function.  */
6491
 
6492
  if (h->size == 0)
6493
    {
6494
      info->callbacks->einfo (_("dynamic variable `%s' is zero size\n"),
6495
                              h->root.root.string);
6496
      return TRUE;
6497
    }
6498
 
6499
  /* We must allocate the symbol in our .dynbss section, which will
6500
     become part of the .bss section of the executable.  There will be
6501
     an entry for this symbol in the .dynsym section.  The dynamic
6502
     object will contain position independent code, so all references
6503
     from the dynamic object to this symbol will go through the global
6504
     offset table.  The dynamic linker will use the .dynsym entry to
6505
     determine the address it must put in the global offset table, so
6506
     both the dynamic object and the regular object will refer to the
6507
     same memory location for the variable.  */
6508
 
6509
  /* We must generate a R_PPC64_COPY reloc to tell the dynamic linker
6510
     to copy the initial value out of the dynamic object and into the
6511
     runtime process image.  We need to remember the offset into the
6512
     .rela.bss section we are going to use.  */
6513
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
6514
    {
6515
      htab->relbss->size += sizeof (Elf64_External_Rela);
6516
      h->needs_copy = 1;
6517
    }
6518
 
6519
  s = htab->dynbss;
6520
 
6521
  return _bfd_elf_adjust_dynamic_copy (h, s);
6522
}
6523
 
6524
/* If given a function descriptor symbol, hide both the function code
6525
   sym and the descriptor.  */
6526
static void
6527
ppc64_elf_hide_symbol (struct bfd_link_info *info,
6528
                       struct elf_link_hash_entry *h,
6529
                       bfd_boolean force_local)
6530
{
6531
  struct ppc_link_hash_entry *eh;
6532
  _bfd_elf_link_hash_hide_symbol (info, h, force_local);
6533
 
6534
  eh = (struct ppc_link_hash_entry *) h;
6535
  if (eh->is_func_descriptor)
6536
    {
6537
      struct ppc_link_hash_entry *fh = eh->oh;
6538
 
6539
      if (fh == NULL)
6540
        {
6541
          const char *p, *q;
6542
          struct ppc_link_hash_table *htab;
6543
          char save;
6544
 
6545
          /* We aren't supposed to use alloca in BFD because on
6546
             systems which do not have alloca the version in libiberty
6547
             calls xmalloc, which might cause the program to crash
6548
             when it runs out of memory.  This function doesn't have a
6549
             return status, so there's no way to gracefully return an
6550
             error.  So cheat.  We know that string[-1] can be safely
6551
             accessed;  It's either a string in an ELF string table,
6552
             or allocated in an objalloc structure.  */
6553
 
6554
          p = eh->elf.root.root.string - 1;
6555
          save = *p;
6556
          *(char *) p = '.';
6557
          htab = ppc_hash_table (info);
6558
          if (htab == NULL)
6559
            return;
6560
 
6561
          fh = (struct ppc_link_hash_entry *)
6562
            elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
6563
          *(char *) p = save;
6564
 
6565
          /* Unfortunately, if it so happens that the string we were
6566
             looking for was allocated immediately before this string,
6567
             then we overwrote the string terminator.  That's the only
6568
             reason the lookup should fail.  */
6569
          if (fh == NULL)
6570
            {
6571
              q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
6572
              while (q >= eh->elf.root.root.string && *q == *p)
6573
                --q, --p;
6574
              if (q < eh->elf.root.root.string && *p == '.')
6575
                fh = (struct ppc_link_hash_entry *)
6576
                  elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
6577
            }
6578
          if (fh != NULL)
6579
            {
6580
              eh->oh = fh;
6581
              fh->oh = eh;
6582
            }
6583
        }
6584
      if (fh != NULL)
6585
        _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
6586
    }
6587
}
6588
 
6589
static bfd_boolean
6590
get_sym_h (struct elf_link_hash_entry **hp,
6591
           Elf_Internal_Sym **symp,
6592
           asection **symsecp,
6593
           unsigned char **tls_maskp,
6594
           Elf_Internal_Sym **locsymsp,
6595
           unsigned long r_symndx,
6596
           bfd *ibfd)
6597
{
6598
  Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
6599
 
6600
  if (r_symndx >= symtab_hdr->sh_info)
6601
    {
6602
      struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
6603
      struct elf_link_hash_entry *h;
6604
 
6605
      h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6606
      h = elf_follow_link (h);
6607
 
6608
      if (hp != NULL)
6609
        *hp = h;
6610
 
6611
      if (symp != NULL)
6612
        *symp = NULL;
6613
 
6614
      if (symsecp != NULL)
6615
        {
6616
          asection *symsec = NULL;
6617
          if (h->root.type == bfd_link_hash_defined
6618
              || h->root.type == bfd_link_hash_defweak)
6619
            symsec = h->root.u.def.section;
6620
          *symsecp = symsec;
6621
        }
6622
 
6623
      if (tls_maskp != NULL)
6624
        {
6625
          struct ppc_link_hash_entry *eh;
6626
 
6627
          eh = (struct ppc_link_hash_entry *) h;
6628
          *tls_maskp = &eh->tls_mask;
6629
        }
6630
    }
6631
  else
6632
    {
6633
      Elf_Internal_Sym *sym;
6634
      Elf_Internal_Sym *locsyms = *locsymsp;
6635
 
6636
      if (locsyms == NULL)
6637
        {
6638
          locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
6639
          if (locsyms == NULL)
6640
            locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
6641
                                            symtab_hdr->sh_info,
6642
                                            0, NULL, NULL, NULL);
6643
          if (locsyms == NULL)
6644
            return FALSE;
6645
          *locsymsp = locsyms;
6646
        }
6647
      sym = locsyms + r_symndx;
6648
 
6649
      if (hp != NULL)
6650
        *hp = NULL;
6651
 
6652
      if (symp != NULL)
6653
        *symp = sym;
6654
 
6655
      if (symsecp != NULL)
6656
        *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
6657
 
6658
      if (tls_maskp != NULL)
6659
        {
6660
          struct got_entry **lgot_ents;
6661
          unsigned char *tls_mask;
6662
 
6663
          tls_mask = NULL;
6664
          lgot_ents = elf_local_got_ents (ibfd);
6665
          if (lgot_ents != NULL)
6666
            {
6667
              struct plt_entry **local_plt = (struct plt_entry **)
6668
                (lgot_ents + symtab_hdr->sh_info);
6669
              unsigned char *lgot_masks = (unsigned char *)
6670
                (local_plt + symtab_hdr->sh_info);
6671
              tls_mask = &lgot_masks[r_symndx];
6672
            }
6673
          *tls_maskp = tls_mask;
6674
        }
6675
    }
6676
  return TRUE;
6677
}
6678
 
6679
/* Returns TLS_MASKP for the given REL symbol.  Function return is 0 on
6680
   error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
6681
   type suitable for optimization, and 1 otherwise.  */
6682
 
6683
static int
6684
get_tls_mask (unsigned char **tls_maskp,
6685
              unsigned long *toc_symndx,
6686
              bfd_vma *toc_addend,
6687
              Elf_Internal_Sym **locsymsp,
6688
              const Elf_Internal_Rela *rel,
6689
              bfd *ibfd)
6690
{
6691
  unsigned long r_symndx;
6692
  int next_r;
6693
  struct elf_link_hash_entry *h;
6694
  Elf_Internal_Sym *sym;
6695
  asection *sec;
6696
  bfd_vma off;
6697
 
6698
  r_symndx = ELF64_R_SYM (rel->r_info);
6699
  if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
6700
    return 0;
6701
 
6702
  if ((*tls_maskp != NULL && **tls_maskp != 0)
6703
      || sec == NULL
6704
      || ppc64_elf_section_data (sec) == NULL
6705
      || ppc64_elf_section_data (sec)->sec_type != sec_toc)
6706
    return 1;
6707
 
6708
  /* Look inside a TOC section too.  */
6709
  if (h != NULL)
6710
    {
6711
      BFD_ASSERT (h->root.type == bfd_link_hash_defined);
6712
      off = h->root.u.def.value;
6713
    }
6714
  else
6715
    off = sym->st_value;
6716
  off += rel->r_addend;
6717
  BFD_ASSERT (off % 8 == 0);
6718
  r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
6719
  next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
6720
  if (toc_symndx != NULL)
6721
    *toc_symndx = r_symndx;
6722
  if (toc_addend != NULL)
6723
    *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
6724
  if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
6725
    return 0;
6726
  if ((h == NULL || is_static_defined (h))
6727
      && (next_r == -1 || next_r == -2))
6728
    return 1 - next_r;
6729
  return 1;
6730
}
6731
 
6732
/* Adjust all global syms defined in opd sections.  In gcc generated
6733
   code for the old ABI, these will already have been done.  */
6734
 
6735
static bfd_boolean
6736
adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
6737
{
6738
  struct ppc_link_hash_entry *eh;
6739
  asection *sym_sec;
6740
  struct _opd_sec_data *opd;
6741
 
6742
  if (h->root.type == bfd_link_hash_indirect)
6743
    return TRUE;
6744
 
6745
  if (h->root.type == bfd_link_hash_warning)
6746
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
6747
 
6748
  if (h->root.type != bfd_link_hash_defined
6749
      && h->root.type != bfd_link_hash_defweak)
6750
    return TRUE;
6751
 
6752
  eh = (struct ppc_link_hash_entry *) h;
6753
  if (eh->adjust_done)
6754
    return TRUE;
6755
 
6756
  sym_sec = eh->elf.root.u.def.section;
6757
  opd = get_opd_info (sym_sec);
6758
  if (opd != NULL && opd->adjust != NULL)
6759
    {
6760
      long adjust = opd->adjust[eh->elf.root.u.def.value / 8];
6761
      if (adjust == -1)
6762
        {
6763
          /* This entry has been deleted.  */
6764
          asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
6765
          if (dsec == NULL)
6766
            {
6767
              for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
6768
                if (elf_discarded_section (dsec))
6769
                  {
6770
                    ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
6771
                    break;
6772
                  }
6773
            }
6774
          eh->elf.root.u.def.value = 0;
6775
          eh->elf.root.u.def.section = dsec;
6776
        }
6777
      else
6778
        eh->elf.root.u.def.value += adjust;
6779
      eh->adjust_done = 1;
6780
    }
6781
  return TRUE;
6782
}
6783
 
6784
/* Handles decrementing dynamic reloc counts for the reloc specified by
6785
   R_INFO in section SEC.  If LOCAL_SYMS is NULL, then H and SYM_SEC
6786
   have already been determined.  */
6787
 
6788
static bfd_boolean
6789
dec_dynrel_count (bfd_vma r_info,
6790
                  asection *sec,
6791
                  struct bfd_link_info *info,
6792
                  Elf_Internal_Sym **local_syms,
6793
                  struct elf_link_hash_entry *h,
6794
                  asection *sym_sec)
6795
{
6796
  enum elf_ppc64_reloc_type r_type;
6797
  struct elf_dyn_relocs *p;
6798
  struct elf_dyn_relocs **pp;
6799
 
6800
  /* Can this reloc be dynamic?  This switch, and later tests here
6801
     should be kept in sync with the code in check_relocs.  */
6802
  r_type = ELF64_R_TYPE (r_info);
6803
  switch (r_type)
6804
    {
6805
    default:
6806
      return TRUE;
6807
 
6808
    case R_PPC64_TPREL16:
6809
    case R_PPC64_TPREL16_LO:
6810
    case R_PPC64_TPREL16_HI:
6811
    case R_PPC64_TPREL16_HA:
6812
    case R_PPC64_TPREL16_DS:
6813
    case R_PPC64_TPREL16_LO_DS:
6814
    case R_PPC64_TPREL16_HIGHER:
6815
    case R_PPC64_TPREL16_HIGHERA:
6816
    case R_PPC64_TPREL16_HIGHEST:
6817
    case R_PPC64_TPREL16_HIGHESTA:
6818
      if (!info->shared)
6819
        return TRUE;
6820
 
6821
    case R_PPC64_TPREL64:
6822
    case R_PPC64_DTPMOD64:
6823
    case R_PPC64_DTPREL64:
6824
    case R_PPC64_ADDR64:
6825
    case R_PPC64_REL30:
6826
    case R_PPC64_REL32:
6827
    case R_PPC64_REL64:
6828
    case R_PPC64_ADDR14:
6829
    case R_PPC64_ADDR14_BRNTAKEN:
6830
    case R_PPC64_ADDR14_BRTAKEN:
6831
    case R_PPC64_ADDR16:
6832
    case R_PPC64_ADDR16_DS:
6833
    case R_PPC64_ADDR16_HA:
6834
    case R_PPC64_ADDR16_HI:
6835
    case R_PPC64_ADDR16_HIGHER:
6836
    case R_PPC64_ADDR16_HIGHERA:
6837
    case R_PPC64_ADDR16_HIGHEST:
6838
    case R_PPC64_ADDR16_HIGHESTA:
6839
    case R_PPC64_ADDR16_LO:
6840
    case R_PPC64_ADDR16_LO_DS:
6841
    case R_PPC64_ADDR24:
6842
    case R_PPC64_ADDR32:
6843
    case R_PPC64_UADDR16:
6844
    case R_PPC64_UADDR32:
6845
    case R_PPC64_UADDR64:
6846
    case R_PPC64_TOC:
6847
      break;
6848
    }
6849
 
6850
  if (local_syms != NULL)
6851
    {
6852
      unsigned long r_symndx;
6853
      Elf_Internal_Sym *sym;
6854
      bfd *ibfd = sec->owner;
6855
 
6856
      r_symndx = ELF64_R_SYM (r_info);
6857
      if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
6858
        return FALSE;
6859
    }
6860
 
6861
  if ((info->shared
6862
       && (must_be_dyn_reloc (info, r_type)
6863
           || (h != NULL
6864
               && (!info->symbolic
6865
                   || h->root.type == bfd_link_hash_defweak
6866
                   || !h->def_regular))))
6867
      || (ELIMINATE_COPY_RELOCS
6868
          && !info->shared
6869
          && h != NULL
6870
          && (h->root.type == bfd_link_hash_defweak
6871
              || !h->def_regular)))
6872
    ;
6873
  else
6874
    return TRUE;
6875
 
6876
  if (h != NULL)
6877
    pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
6878
  else
6879
    {
6880
      if (sym_sec != NULL)
6881
        {
6882
          void *vpp = &elf_section_data (sym_sec)->local_dynrel;
6883
          pp = (struct elf_dyn_relocs **) vpp;
6884
        }
6885
      else
6886
        {
6887
          void *vpp = &elf_section_data (sec)->local_dynrel;
6888
          pp = (struct elf_dyn_relocs **) vpp;
6889
        }
6890
 
6891
      /* elf_gc_sweep may have already removed all dyn relocs associated
6892
         with local syms for a given section.  Don't report a dynreloc
6893
         miscount.  */
6894
      if (*pp == NULL)
6895
        return TRUE;
6896
    }
6897
 
6898
  while ((p = *pp) != NULL)
6899
    {
6900
      if (p->sec == sec)
6901
        {
6902
          if (!must_be_dyn_reloc (info, r_type))
6903
            p->pc_count -= 1;
6904
          p->count -= 1;
6905
          if (p->count == 0)
6906
            *pp = p->next;
6907
          return TRUE;
6908
        }
6909
      pp = &p->next;
6910
    }
6911
 
6912
  info->callbacks->einfo (_("dynreloc miscount for %B, section %A\n"),
6913
                          sec->owner, sec);
6914
  bfd_set_error (bfd_error_bad_value);
6915
  return FALSE;
6916
}
6917
 
6918
/* Remove unused Official Procedure Descriptor entries.  Currently we
6919
   only remove those associated with functions in discarded link-once
6920
   sections, or weakly defined functions that have been overridden.  It
6921
   would be possible to remove many more entries for statically linked
6922
   applications.  */
6923
 
6924
bfd_boolean
6925
ppc64_elf_edit_opd (struct bfd_link_info *info, bfd_boolean non_overlapping)
6926
{
6927
  bfd *ibfd;
6928
  bfd_boolean some_edited = FALSE;
6929
  asection *need_pad = NULL;
6930
 
6931
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
6932
    {
6933
      asection *sec;
6934
      Elf_Internal_Rela *relstart, *rel, *relend;
6935
      Elf_Internal_Shdr *symtab_hdr;
6936
      Elf_Internal_Sym *local_syms;
6937
      bfd_vma offset;
6938
      struct _opd_sec_data *opd;
6939
      bfd_boolean need_edit, add_aux_fields;
6940
      bfd_size_type cnt_16b = 0;
6941
 
6942
      if (!is_ppc64_elf (ibfd))
6943
        continue;
6944
 
6945
      sec = bfd_get_section_by_name (ibfd, ".opd");
6946
      if (sec == NULL || sec->size == 0)
6947
        continue;
6948
 
6949
      if (sec->sec_info_type == ELF_INFO_TYPE_JUST_SYMS)
6950
        continue;
6951
 
6952
      if (sec->output_section == bfd_abs_section_ptr)
6953
        continue;
6954
 
6955
      /* Look through the section relocs.  */
6956
      if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
6957
        continue;
6958
 
6959
      local_syms = NULL;
6960
      symtab_hdr = &elf_symtab_hdr (ibfd);
6961
 
6962
      /* Read the relocations.  */
6963
      relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
6964
                                            info->keep_memory);
6965
      if (relstart == NULL)
6966
        return FALSE;
6967
 
6968
      /* First run through the relocs to check they are sane, and to
6969
         determine whether we need to edit this opd section.  */
6970
      need_edit = FALSE;
6971
      need_pad = sec;
6972
      offset = 0;
6973
      relend = relstart + sec->reloc_count;
6974
      for (rel = relstart; rel < relend; )
6975
        {
6976
          enum elf_ppc64_reloc_type r_type;
6977
          unsigned long r_symndx;
6978
          asection *sym_sec;
6979
          struct elf_link_hash_entry *h;
6980
          Elf_Internal_Sym *sym;
6981
 
6982
          /* .opd contains a regular array of 16 or 24 byte entries.  We're
6983
             only interested in the reloc pointing to a function entry
6984
             point.  */
6985
          if (rel->r_offset != offset
6986
              || rel + 1 >= relend
6987
              || (rel + 1)->r_offset != offset + 8)
6988
            {
6989
              /* If someone messes with .opd alignment then after a
6990
                 "ld -r" we might have padding in the middle of .opd.
6991
                 Also, there's nothing to prevent someone putting
6992
                 something silly in .opd with the assembler.  No .opd
6993
                 optimization for them!  */
6994
            broken_opd:
6995
              (*_bfd_error_handler)
6996
                (_("%B: .opd is not a regular array of opd entries"), ibfd);
6997
              need_edit = FALSE;
6998
              break;
6999
            }
7000
 
7001
          if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
7002
              || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
7003
            {
7004
              (*_bfd_error_handler)
7005
                (_("%B: unexpected reloc type %u in .opd section"),
7006
                 ibfd, r_type);
7007
              need_edit = FALSE;
7008
              break;
7009
            }
7010
 
7011
          r_symndx = ELF64_R_SYM (rel->r_info);
7012
          if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7013
                          r_symndx, ibfd))
7014
            goto error_ret;
7015
 
7016
          if (sym_sec == NULL || sym_sec->owner == NULL)
7017
            {
7018
              const char *sym_name;
7019
              if (h != NULL)
7020
                sym_name = h->root.root.string;
7021
              else
7022
                sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7023
                                             sym_sec);
7024
 
7025
              (*_bfd_error_handler)
7026
                (_("%B: undefined sym `%s' in .opd section"),
7027
                 ibfd, sym_name);
7028
              need_edit = FALSE;
7029
              break;
7030
            }
7031
 
7032
          /* opd entries are always for functions defined in the
7033
             current input bfd.  If the symbol isn't defined in the
7034
             input bfd, then we won't be using the function in this
7035
             bfd;  It must be defined in a linkonce section in another
7036
             bfd, or is weak.  It's also possible that we are
7037
             discarding the function due to a linker script /DISCARD/,
7038
             which we test for via the output_section.  */
7039
          if (sym_sec->owner != ibfd
7040
              || sym_sec->output_section == bfd_abs_section_ptr)
7041
            need_edit = TRUE;
7042
 
7043
          rel += 2;
7044
          if (rel == relend
7045
              || (rel + 1 == relend && rel->r_offset == offset + 16))
7046
            {
7047
              if (sec->size == offset + 24)
7048
                {
7049
                  need_pad = NULL;
7050
                  break;
7051
                }
7052
              if (rel == relend && sec->size == offset + 16)
7053
                {
7054
                  cnt_16b++;
7055
                  break;
7056
                }
7057
              goto broken_opd;
7058
            }
7059
 
7060
          if (rel->r_offset == offset + 24)
7061
            offset += 24;
7062
          else if (rel->r_offset != offset + 16)
7063
            goto broken_opd;
7064
          else if (rel + 1 < relend
7065
                   && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
7066
                   && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
7067
            {
7068
              offset += 16;
7069
              cnt_16b++;
7070
            }
7071
          else if (rel + 2 < relend
7072
                   && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_ADDR64
7073
                   && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC)
7074
            {
7075
              offset += 24;
7076
              rel += 1;
7077
            }
7078
          else
7079
            goto broken_opd;
7080
        }
7081
 
7082
      add_aux_fields = non_overlapping && cnt_16b > 0;
7083
 
7084
      if (need_edit || add_aux_fields)
7085
        {
7086
          Elf_Internal_Rela *write_rel;
7087
          Elf_Internal_Shdr *rel_hdr;
7088
          bfd_byte *rptr, *wptr;
7089
          bfd_byte *new_contents;
7090
          bfd_boolean skip;
7091
          long opd_ent_size;
7092
          bfd_size_type amt;
7093
 
7094
          new_contents = NULL;
7095
          amt = sec->size * sizeof (long) / 8;
7096
          opd = &ppc64_elf_section_data (sec)->u.opd;
7097
          opd->adjust = bfd_zalloc (sec->owner, amt);
7098
          if (opd->adjust == NULL)
7099
            return FALSE;
7100
          ppc64_elf_section_data (sec)->sec_type = sec_opd;
7101
 
7102
          /* This seems a waste of time as input .opd sections are all
7103
             zeros as generated by gcc, but I suppose there's no reason
7104
             this will always be so.  We might start putting something in
7105
             the third word of .opd entries.  */
7106
          if ((sec->flags & SEC_IN_MEMORY) == 0)
7107
            {
7108
              bfd_byte *loc;
7109
              if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
7110
                {
7111
                  if (loc != NULL)
7112
                    free (loc);
7113
                error_ret:
7114
                  if (local_syms != NULL
7115
                      && symtab_hdr->contents != (unsigned char *) local_syms)
7116
                    free (local_syms);
7117
                  if (elf_section_data (sec)->relocs != relstart)
7118
                    free (relstart);
7119
                  return FALSE;
7120
                }
7121
              sec->contents = loc;
7122
              sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7123
            }
7124
 
7125
          elf_section_data (sec)->relocs = relstart;
7126
 
7127
          new_contents = sec->contents;
7128
          if (add_aux_fields)
7129
            {
7130
              new_contents = bfd_malloc (sec->size + cnt_16b * 8);
7131
              if (new_contents == NULL)
7132
                return FALSE;
7133
              need_pad = FALSE;
7134
            }
7135
          wptr = new_contents;
7136
          rptr = sec->contents;
7137
 
7138
          write_rel = relstart;
7139
          skip = FALSE;
7140
          offset = 0;
7141
          opd_ent_size = 0;
7142
          for (rel = relstart; rel < relend; rel++)
7143
            {
7144
              unsigned long r_symndx;
7145
              asection *sym_sec;
7146
              struct elf_link_hash_entry *h;
7147
              Elf_Internal_Sym *sym;
7148
 
7149
              r_symndx = ELF64_R_SYM (rel->r_info);
7150
              if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7151
                              r_symndx, ibfd))
7152
                goto error_ret;
7153
 
7154
              if (rel->r_offset == offset)
7155
                {
7156
                  struct ppc_link_hash_entry *fdh = NULL;
7157
 
7158
                  /* See if the .opd entry is full 24 byte or
7159
                     16 byte (with fd_aux entry overlapped with next
7160
                     fd_func).  */
7161
                  opd_ent_size = 24;
7162
                  if ((rel + 2 == relend && sec->size == offset + 16)
7163
                      || (rel + 3 < relend
7164
                          && rel[2].r_offset == offset + 16
7165
                          && rel[3].r_offset == offset + 24
7166
                          && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_ADDR64
7167
                          && ELF64_R_TYPE (rel[3].r_info) == R_PPC64_TOC))
7168
                    opd_ent_size = 16;
7169
 
7170
                  if (h != NULL
7171
                      && h->root.root.string[0] == '.')
7172
                    {
7173
                      struct ppc_link_hash_table *htab;
7174
 
7175
                      htab = ppc_hash_table (info);
7176
                      if (htab != NULL)
7177
                        fdh = lookup_fdh ((struct ppc_link_hash_entry *) h,
7178
                                          htab);
7179
                      if (fdh != NULL
7180
                          && fdh->elf.root.type != bfd_link_hash_defined
7181
                          && fdh->elf.root.type != bfd_link_hash_defweak)
7182
                        fdh = NULL;
7183
                    }
7184
 
7185
                  skip = (sym_sec->owner != ibfd
7186
                          || sym_sec->output_section == bfd_abs_section_ptr);
7187
                  if (skip)
7188
                    {
7189
                      if (fdh != NULL && sym_sec->owner == ibfd)
7190
                        {
7191
                          /* Arrange for the function descriptor sym
7192
                             to be dropped.  */
7193
                          fdh->elf.root.u.def.value = 0;
7194
                          fdh->elf.root.u.def.section = sym_sec;
7195
                        }
7196
                      opd->adjust[rel->r_offset / 8] = -1;
7197
                    }
7198
                  else
7199
                    {
7200
                      /* We'll be keeping this opd entry.  */
7201
 
7202
                      if (fdh != NULL)
7203
                        {
7204
                          /* Redefine the function descriptor symbol to
7205
                             this location in the opd section.  It is
7206
                             necessary to update the value here rather
7207
                             than using an array of adjustments as we do
7208
                             for local symbols, because various places
7209
                             in the generic ELF code use the value
7210
                             stored in u.def.value.  */
7211
                          fdh->elf.root.u.def.value = wptr - new_contents;
7212
                          fdh->adjust_done = 1;
7213
                        }
7214
 
7215
                      /* Local syms are a bit tricky.  We could
7216
                         tweak them as they can be cached, but
7217
                         we'd need to look through the local syms
7218
                         for the function descriptor sym which we
7219
                         don't have at the moment.  So keep an
7220
                         array of adjustments.  */
7221
                      opd->adjust[rel->r_offset / 8]
7222
                        = (wptr - new_contents) - (rptr - sec->contents);
7223
 
7224
                      if (wptr != rptr)
7225
                        memcpy (wptr, rptr, opd_ent_size);
7226
                      wptr += opd_ent_size;
7227
                      if (add_aux_fields && opd_ent_size == 16)
7228
                        {
7229
                          memset (wptr, '\0', 8);
7230
                          wptr += 8;
7231
                        }
7232
                    }
7233
                  rptr += opd_ent_size;
7234
                  offset += opd_ent_size;
7235
                }
7236
 
7237
              if (skip)
7238
                {
7239
                  if (!NO_OPD_RELOCS
7240
                      && !info->relocatable
7241
                      && !dec_dynrel_count (rel->r_info, sec, info,
7242
                                            NULL, h, sym_sec))
7243
                    goto error_ret;
7244
                }
7245
              else
7246
                {
7247
                  /* We need to adjust any reloc offsets to point to the
7248
                     new opd entries.  While we're at it, we may as well
7249
                     remove redundant relocs.  */
7250
                  rel->r_offset += opd->adjust[(offset - opd_ent_size) / 8];
7251
                  if (write_rel != rel)
7252
                    memcpy (write_rel, rel, sizeof (*rel));
7253
                  ++write_rel;
7254
                }
7255
            }
7256
 
7257
          sec->size = wptr - new_contents;
7258
          sec->reloc_count = write_rel - relstart;
7259
          if (add_aux_fields)
7260
            {
7261
              free (sec->contents);
7262
              sec->contents = new_contents;
7263
            }
7264
 
7265
          /* Fudge the header size too, as this is used later in
7266
             elf_bfd_final_link if we are emitting relocs.  */
7267
          rel_hdr = _bfd_elf_single_rel_hdr (sec);
7268
          rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize;
7269
          some_edited = TRUE;
7270
        }
7271
      else if (elf_section_data (sec)->relocs != relstart)
7272
        free (relstart);
7273
 
7274
      if (local_syms != NULL
7275
          && symtab_hdr->contents != (unsigned char *) local_syms)
7276
        {
7277
          if (!info->keep_memory)
7278
            free (local_syms);
7279
          else
7280
            symtab_hdr->contents = (unsigned char *) local_syms;
7281
        }
7282
    }
7283
 
7284
  if (some_edited)
7285
    elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
7286
 
7287
  /* If we are doing a final link and the last .opd entry is just 16 byte
7288
     long, add a 8 byte padding after it.  */
7289
  if (need_pad != NULL && !info->relocatable)
7290
    {
7291
      bfd_byte *p;
7292
 
7293
      if ((need_pad->flags & SEC_IN_MEMORY) == 0)
7294
        {
7295
          BFD_ASSERT (need_pad->size > 0);
7296
 
7297
          p = bfd_malloc (need_pad->size + 8);
7298
          if (p == NULL)
7299
            return FALSE;
7300
 
7301
          if (! bfd_get_section_contents (need_pad->owner, need_pad,
7302
                                          p, 0, need_pad->size))
7303
            return FALSE;
7304
 
7305
          need_pad->contents = p;
7306
          need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7307
        }
7308
      else
7309
        {
7310
          p = bfd_realloc (need_pad->contents, need_pad->size + 8);
7311
          if (p == NULL)
7312
            return FALSE;
7313
 
7314
          need_pad->contents = p;
7315
        }
7316
 
7317
      memset (need_pad->contents + need_pad->size, 0, 8);
7318
      need_pad->size += 8;
7319
    }
7320
 
7321
  return TRUE;
7322
}
7323
 
7324
/* Set htab->tls_get_addr and call the generic ELF tls_setup function.  */
7325
 
7326
asection *
7327
ppc64_elf_tls_setup (struct bfd_link_info *info,
7328
                     int no_tls_get_addr_opt,
7329
                     int *no_multi_toc)
7330
{
7331
  struct ppc_link_hash_table *htab;
7332
 
7333
  htab = ppc_hash_table (info);
7334
  if (htab == NULL)
7335
    return NULL;
7336
 
7337
  if (*no_multi_toc)
7338
    htab->do_multi_toc = 0;
7339
  else if (!htab->do_multi_toc)
7340
    *no_multi_toc = 1;
7341
 
7342
  htab->tls_get_addr = ((struct ppc_link_hash_entry *)
7343
                        elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
7344
                                              FALSE, FALSE, TRUE));
7345
  /* Move dynamic linking info to the function descriptor sym.  */
7346
  if (htab->tls_get_addr != NULL)
7347
    func_desc_adjust (&htab->tls_get_addr->elf, info);
7348
  htab->tls_get_addr_fd = ((struct ppc_link_hash_entry *)
7349
                           elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
7350
                                                 FALSE, FALSE, TRUE));
7351
  if (!no_tls_get_addr_opt)
7352
    {
7353
      struct elf_link_hash_entry *opt, *opt_fd, *tga, *tga_fd;
7354
 
7355
      opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt",
7356
                                  FALSE, FALSE, TRUE);
7357
      if (opt != NULL)
7358
        func_desc_adjust (opt, info);
7359
      opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
7360
                                     FALSE, FALSE, TRUE);
7361
      if (opt_fd != NULL
7362
          && (opt_fd->root.type == bfd_link_hash_defined
7363
              || opt_fd->root.type == bfd_link_hash_defweak))
7364
        {
7365
          /* If glibc supports an optimized __tls_get_addr call stub,
7366
             signalled by the presence of __tls_get_addr_opt, and we'll
7367
             be calling __tls_get_addr via a plt call stub, then
7368
             make __tls_get_addr point to __tls_get_addr_opt.  */
7369
          tga_fd = &htab->tls_get_addr_fd->elf;
7370
          if (htab->elf.dynamic_sections_created
7371
              && tga_fd != NULL
7372
              && (tga_fd->type == STT_FUNC
7373
                  || tga_fd->needs_plt)
7374
              && !(SYMBOL_CALLS_LOCAL (info, tga_fd)
7375
                   || (ELF_ST_VISIBILITY (tga_fd->other) != STV_DEFAULT
7376
                       && tga_fd->root.type == bfd_link_hash_undefweak)))
7377
            {
7378
              struct plt_entry *ent;
7379
 
7380
              for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next)
7381
                if (ent->plt.refcount > 0)
7382
                  break;
7383
              if (ent != NULL)
7384
                {
7385
                  tga_fd->root.type = bfd_link_hash_indirect;
7386
                  tga_fd->root.u.i.link = &opt_fd->root;
7387
                  ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd);
7388
                  if (opt_fd->dynindx != -1)
7389
                    {
7390
                      /* Use __tls_get_addr_opt in dynamic relocations.  */
7391
                      opt_fd->dynindx = -1;
7392
                      _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
7393
                                              opt_fd->dynstr_index);
7394
                      if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd))
7395
                        return NULL;
7396
                    }
7397
                  htab->tls_get_addr_fd = (struct ppc_link_hash_entry *) opt_fd;
7398
                  tga = &htab->tls_get_addr->elf;
7399
                  if (opt != NULL && tga != NULL)
7400
                    {
7401
                      tga->root.type = bfd_link_hash_indirect;
7402
                      tga->root.u.i.link = &opt->root;
7403
                      ppc64_elf_copy_indirect_symbol (info, opt, tga);
7404
                      _bfd_elf_link_hash_hide_symbol (info, opt,
7405
                                                      tga->forced_local);
7406
                      htab->tls_get_addr = (struct ppc_link_hash_entry *) opt;
7407
                    }
7408
                  htab->tls_get_addr_fd->oh = htab->tls_get_addr;
7409
                  htab->tls_get_addr_fd->is_func_descriptor = 1;
7410
                  if (htab->tls_get_addr != NULL)
7411
                    {
7412
                      htab->tls_get_addr->oh = htab->tls_get_addr_fd;
7413
                      htab->tls_get_addr->is_func = 1;
7414
                    }
7415
                }
7416
            }
7417
        }
7418
      else
7419
        no_tls_get_addr_opt = TRUE;
7420
    }
7421
  htab->no_tls_get_addr_opt = no_tls_get_addr_opt;
7422
  return _bfd_elf_tls_setup (info->output_bfd, info);
7423
}
7424
 
7425
/* Return TRUE iff REL is a branch reloc with a global symbol matching
7426
   HASH1 or HASH2.  */
7427
 
7428
static bfd_boolean
7429
branch_reloc_hash_match (const bfd *ibfd,
7430
                         const Elf_Internal_Rela *rel,
7431
                         const struct ppc_link_hash_entry *hash1,
7432
                         const struct ppc_link_hash_entry *hash2)
7433
{
7434
  Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
7435
  enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
7436
  unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
7437
 
7438
  if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
7439
    {
7440
      struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7441
      struct elf_link_hash_entry *h;
7442
 
7443
      h = sym_hashes[r_symndx - symtab_hdr->sh_info];
7444
      h = elf_follow_link (h);
7445
      if (h == &hash1->elf || h == &hash2->elf)
7446
        return TRUE;
7447
    }
7448
  return FALSE;
7449
}
7450
 
7451
/* Run through all the TLS relocs looking for optimization
7452
   opportunities.  The linker has been hacked (see ppc64elf.em) to do
7453
   a preliminary section layout so that we know the TLS segment
7454
   offsets.  We can't optimize earlier because some optimizations need
7455
   to know the tp offset, and we need to optimize before allocating
7456
   dynamic relocations.  */
7457
 
7458
bfd_boolean
7459
ppc64_elf_tls_optimize (struct bfd_link_info *info)
7460
{
7461
  bfd *ibfd;
7462
  asection *sec;
7463
  struct ppc_link_hash_table *htab;
7464
  unsigned char *toc_ref;
7465
  int pass;
7466
 
7467
  if (info->relocatable || !info->executable)
7468
    return TRUE;
7469
 
7470
  htab = ppc_hash_table (info);
7471
  if (htab == NULL)
7472
    return FALSE;
7473
 
7474
  /* Make two passes over the relocs.  On the first pass, mark toc
7475
     entries involved with tls relocs, and check that tls relocs
7476
     involved in setting up a tls_get_addr call are indeed followed by
7477
     such a call.  If they are not, we can't do any tls optimization.
7478
     On the second pass twiddle tls_mask flags to notify
7479
     relocate_section that optimization can be done, and adjust got
7480
     and plt refcounts.  */
7481
  toc_ref = NULL;
7482
  for (pass = 0; pass < 2; ++pass)
7483
    for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
7484
      {
7485
        Elf_Internal_Sym *locsyms = NULL;
7486
        asection *toc = bfd_get_section_by_name (ibfd, ".toc");
7487
 
7488
        for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7489
          if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
7490
            {
7491
              Elf_Internal_Rela *relstart, *rel, *relend;
7492
              bfd_boolean found_tls_get_addr_arg = 0;
7493
 
7494
              /* Read the relocations.  */
7495
              relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7496
                                                    info->keep_memory);
7497
              if (relstart == NULL)
7498
                return FALSE;
7499
 
7500
              relend = relstart + sec->reloc_count;
7501
              for (rel = relstart; rel < relend; rel++)
7502
                {
7503
                  enum elf_ppc64_reloc_type r_type;
7504
                  unsigned long r_symndx;
7505
                  struct elf_link_hash_entry *h;
7506
                  Elf_Internal_Sym *sym;
7507
                  asection *sym_sec;
7508
                  unsigned char *tls_mask;
7509
                  unsigned char tls_set, tls_clear, tls_type = 0;
7510
                  bfd_vma value;
7511
                  bfd_boolean ok_tprel, is_local;
7512
                  long toc_ref_index = 0;
7513
                  int expecting_tls_get_addr = 0;
7514
                  bfd_boolean ret = FALSE;
7515
 
7516
                  r_symndx = ELF64_R_SYM (rel->r_info);
7517
                  if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
7518
                                  r_symndx, ibfd))
7519
                    {
7520
                    err_free_rel:
7521
                      if (elf_section_data (sec)->relocs != relstart)
7522
                        free (relstart);
7523
                      if (toc_ref != NULL)
7524
                        free (toc_ref);
7525
                      if (locsyms != NULL
7526
                          && (elf_symtab_hdr (ibfd).contents
7527
                              != (unsigned char *) locsyms))
7528
                        free (locsyms);
7529
                      return ret;
7530
                    }
7531
 
7532
                  if (h != NULL)
7533
                    {
7534
                      if (h->root.type == bfd_link_hash_defined
7535
                          || h->root.type == bfd_link_hash_defweak)
7536
                        value = h->root.u.def.value;
7537
                      else if (h->root.type == bfd_link_hash_undefweak)
7538
                        value = 0;
7539
                      else
7540
                        {
7541
                          found_tls_get_addr_arg = 0;
7542
                          continue;
7543
                        }
7544
                    }
7545
                  else
7546
                    /* Symbols referenced by TLS relocs must be of type
7547
                       STT_TLS.  So no need for .opd local sym adjust.  */
7548
                    value = sym->st_value;
7549
 
7550
                  ok_tprel = FALSE;
7551
                  is_local = FALSE;
7552
                  if (h == NULL
7553
                      || !h->def_dynamic)
7554
                    {
7555
                      is_local = TRUE;
7556
                      if (h != NULL
7557
                          && h->root.type == bfd_link_hash_undefweak)
7558
                        ok_tprel = TRUE;
7559
                      else
7560
                        {
7561
                          value += sym_sec->output_offset;
7562
                          value += sym_sec->output_section->vma;
7563
                          value -= htab->elf.tls_sec->vma;
7564
                          ok_tprel = (value + TP_OFFSET + ((bfd_vma) 1 << 31)
7565
                                      < (bfd_vma) 1 << 32);
7566
                        }
7567
                    }
7568
 
7569
                  r_type = ELF64_R_TYPE (rel->r_info);
7570
                  /* If this section has old-style __tls_get_addr calls
7571
                     without marker relocs, then check that each
7572
                     __tls_get_addr call reloc is preceded by a reloc
7573
                     that conceivably belongs to the __tls_get_addr arg
7574
                     setup insn.  If we don't find matching arg setup
7575
                     relocs, don't do any tls optimization.  */
7576
                  if (pass == 0
7577
                      && sec->has_tls_get_addr_call
7578
                      && h != NULL
7579
                      && (h == &htab->tls_get_addr->elf
7580
                          || h == &htab->tls_get_addr_fd->elf)
7581
                      && !found_tls_get_addr_arg
7582
                      && is_branch_reloc (r_type))
7583
                    {
7584
                      info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
7585
                                                "TLS optimization disabled\n"),
7586
                                              ibfd, sec, rel->r_offset);
7587
                      ret = TRUE;
7588
                      goto err_free_rel;
7589
                    }
7590
 
7591
                  found_tls_get_addr_arg = 0;
7592
                  switch (r_type)
7593
                    {
7594
                    case R_PPC64_GOT_TLSLD16:
7595
                    case R_PPC64_GOT_TLSLD16_LO:
7596
                      expecting_tls_get_addr = 1;
7597
                      found_tls_get_addr_arg = 1;
7598
                      /* Fall thru */
7599
 
7600
                    case R_PPC64_GOT_TLSLD16_HI:
7601
                    case R_PPC64_GOT_TLSLD16_HA:
7602
                      /* These relocs should never be against a symbol
7603
                         defined in a shared lib.  Leave them alone if
7604
                         that turns out to be the case.  */
7605
                      if (!is_local)
7606
                        continue;
7607
 
7608
                      /* LD -> LE */
7609
                      tls_set = 0;
7610
                      tls_clear = TLS_LD;
7611
                      tls_type = TLS_TLS | TLS_LD;
7612
                      break;
7613
 
7614
                    case R_PPC64_GOT_TLSGD16:
7615
                    case R_PPC64_GOT_TLSGD16_LO:
7616
                      expecting_tls_get_addr = 1;
7617
                      found_tls_get_addr_arg = 1;
7618
                      /* Fall thru */
7619
 
7620
                    case R_PPC64_GOT_TLSGD16_HI:
7621
                    case R_PPC64_GOT_TLSGD16_HA:
7622
                      if (ok_tprel)
7623
                        /* GD -> LE */
7624
                        tls_set = 0;
7625
                      else
7626
                        /* GD -> IE */
7627
                        tls_set = TLS_TLS | TLS_TPRELGD;
7628
                      tls_clear = TLS_GD;
7629
                      tls_type = TLS_TLS | TLS_GD;
7630
                      break;
7631
 
7632
                    case R_PPC64_GOT_TPREL16_DS:
7633
                    case R_PPC64_GOT_TPREL16_LO_DS:
7634
                    case R_PPC64_GOT_TPREL16_HI:
7635
                    case R_PPC64_GOT_TPREL16_HA:
7636
                      if (ok_tprel)
7637
                        {
7638
                          /* IE -> LE */
7639
                          tls_set = 0;
7640
                          tls_clear = TLS_TPREL;
7641
                          tls_type = TLS_TLS | TLS_TPREL;
7642
                          break;
7643
                        }
7644
                      continue;
7645
 
7646
                    case R_PPC64_TLSGD:
7647
                    case R_PPC64_TLSLD:
7648
                      found_tls_get_addr_arg = 1;
7649
                      /* Fall thru */
7650
 
7651
                    case R_PPC64_TLS:
7652
                    case R_PPC64_TOC16:
7653
                    case R_PPC64_TOC16_LO:
7654
                      if (sym_sec == NULL || sym_sec != toc)
7655
                        continue;
7656
 
7657
                      /* Mark this toc entry as referenced by a TLS
7658
                         code sequence.  We can do that now in the
7659
                         case of R_PPC64_TLS, and after checking for
7660
                         tls_get_addr for the TOC16 relocs.  */
7661
                      if (toc_ref == NULL)
7662
                        toc_ref = bfd_zmalloc (toc->output_section->rawsize / 8);
7663
                      if (toc_ref == NULL)
7664
                        goto err_free_rel;
7665
 
7666
                      if (h != NULL)
7667
                        value = h->root.u.def.value;
7668
                      else
7669
                        value = sym->st_value;
7670
                      value += rel->r_addend;
7671
                      BFD_ASSERT (value < toc->size && value % 8 == 0);
7672
                      toc_ref_index = (value + toc->output_offset) / 8;
7673
                      if (r_type == R_PPC64_TLS
7674
                          || r_type == R_PPC64_TLSGD
7675
                          || r_type == R_PPC64_TLSLD)
7676
                        {
7677
                          toc_ref[toc_ref_index] = 1;
7678
                          continue;
7679
                        }
7680
 
7681
                      if (pass != 0 && toc_ref[toc_ref_index] == 0)
7682
                        continue;
7683
 
7684
                      tls_set = 0;
7685
                      tls_clear = 0;
7686
                      expecting_tls_get_addr = 2;
7687
                      break;
7688
 
7689
                    case R_PPC64_TPREL64:
7690
                      if (pass == 0
7691
                          || sec != toc
7692
                          || toc_ref == NULL
7693
                          || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
7694
                        continue;
7695
                      if (ok_tprel)
7696
                        {
7697
                          /* IE -> LE */
7698
                          tls_set = TLS_EXPLICIT;
7699
                          tls_clear = TLS_TPREL;
7700
                          break;
7701
                        }
7702
                      continue;
7703
 
7704
                    case R_PPC64_DTPMOD64:
7705
                      if (pass == 0
7706
                          || sec != toc
7707
                          || toc_ref == NULL
7708
                          || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
7709
                        continue;
7710
                      if (rel + 1 < relend
7711
                          && (rel[1].r_info
7712
                              == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
7713
                          && rel[1].r_offset == rel->r_offset + 8)
7714
                        {
7715
                          if (ok_tprel)
7716
                            /* GD -> LE */
7717
                            tls_set = TLS_EXPLICIT | TLS_GD;
7718
                          else
7719
                            /* GD -> IE */
7720
                            tls_set = TLS_EXPLICIT | TLS_GD | TLS_TPRELGD;
7721
                          tls_clear = TLS_GD;
7722
                        }
7723
                      else
7724
                        {
7725
                          if (!is_local)
7726
                            continue;
7727
 
7728
                          /* LD -> LE */
7729
                          tls_set = TLS_EXPLICIT;
7730
                          tls_clear = TLS_LD;
7731
                        }
7732
                      break;
7733
 
7734
                    default:
7735
                      continue;
7736
                    }
7737
 
7738
                  if (pass == 0)
7739
                    {
7740
                      if (!expecting_tls_get_addr
7741
                          || !sec->has_tls_get_addr_call)
7742
                        continue;
7743
 
7744
                      if (rel + 1 < relend
7745
                          && branch_reloc_hash_match (ibfd, rel + 1,
7746
                                                      htab->tls_get_addr,
7747
                                                      htab->tls_get_addr_fd))
7748
                        {
7749
                          if (expecting_tls_get_addr == 2)
7750
                            {
7751
                              /* Check for toc tls entries.  */
7752
                              unsigned char *toc_tls;
7753
                              int retval;
7754
 
7755
                              retval = get_tls_mask (&toc_tls, NULL, NULL,
7756
                                                     &locsyms,
7757
                                                     rel, ibfd);
7758
                              if (retval == 0)
7759
                                goto err_free_rel;
7760
                              if (toc_tls != NULL)
7761
                                {
7762
                                  if ((*toc_tls & (TLS_GD | TLS_LD)) != 0)
7763
                                    found_tls_get_addr_arg = 1;
7764
                                  if (retval > 1)
7765
                                    toc_ref[toc_ref_index] = 1;
7766
                                }
7767
                            }
7768
                          continue;
7769
                        }
7770
 
7771
                      if (expecting_tls_get_addr != 1)
7772
                        continue;
7773
 
7774
                      /* Uh oh, we didn't find the expected call.  We
7775
                         could just mark this symbol to exclude it
7776
                         from tls optimization but it's safer to skip
7777
                         the entire optimization.  */
7778
                      info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
7779
                                                "TLS optimization disabled\n"),
7780
                                              ibfd, sec, rel->r_offset);
7781
                      ret = TRUE;
7782
                      goto err_free_rel;
7783
                    }
7784
 
7785
                  if (expecting_tls_get_addr && htab->tls_get_addr != NULL)
7786
                    {
7787
                      struct plt_entry *ent;
7788
                      for (ent = htab->tls_get_addr->elf.plt.plist;
7789
                           ent != NULL;
7790
                           ent = ent->next)
7791
                        if (ent->addend == 0)
7792
                          {
7793
                            if (ent->plt.refcount > 0)
7794
                              {
7795
                                ent->plt.refcount -= 1;
7796
                                expecting_tls_get_addr = 0;
7797
                              }
7798
                            break;
7799
                          }
7800
                    }
7801
 
7802
                  if (expecting_tls_get_addr && htab->tls_get_addr_fd != NULL)
7803
                    {
7804
                      struct plt_entry *ent;
7805
                      for (ent = htab->tls_get_addr_fd->elf.plt.plist;
7806
                           ent != NULL;
7807
                           ent = ent->next)
7808
                        if (ent->addend == 0)
7809
                          {
7810
                            if (ent->plt.refcount > 0)
7811
                              ent->plt.refcount -= 1;
7812
                            break;
7813
                          }
7814
                    }
7815
 
7816
                  if (tls_clear == 0)
7817
                    continue;
7818
 
7819
                  if ((tls_set & TLS_EXPLICIT) == 0)
7820
                    {
7821
                      struct got_entry *ent;
7822
 
7823
                      /* Adjust got entry for this reloc.  */
7824
                      if (h != NULL)
7825
                        ent = h->got.glist;
7826
                      else
7827
                        ent = elf_local_got_ents (ibfd)[r_symndx];
7828
 
7829
                      for (; ent != NULL; ent = ent->next)
7830
                        if (ent->addend == rel->r_addend
7831
                            && ent->owner == ibfd
7832
                            && ent->tls_type == tls_type)
7833
                          break;
7834
                      if (ent == NULL)
7835
                        abort ();
7836
 
7837
                      if (tls_set == 0)
7838
                        {
7839
                          /* We managed to get rid of a got entry.  */
7840
                          if (ent->got.refcount > 0)
7841
                            ent->got.refcount -= 1;
7842
                        }
7843
                    }
7844
                  else
7845
                    {
7846
                      /* If we got rid of a DTPMOD/DTPREL reloc pair then
7847
                         we'll lose one or two dyn relocs.  */
7848
                      if (!dec_dynrel_count (rel->r_info, sec, info,
7849
                                             NULL, h, sym_sec))
7850
                        return FALSE;
7851
 
7852
                      if (tls_set == (TLS_EXPLICIT | TLS_GD))
7853
                        {
7854
                          if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
7855
                                                 NULL, h, sym_sec))
7856
                            return FALSE;
7857
                        }
7858
                    }
7859
 
7860
                  *tls_mask |= tls_set;
7861
                  *tls_mask &= ~tls_clear;
7862
                }
7863
 
7864
              if (elf_section_data (sec)->relocs != relstart)
7865
                free (relstart);
7866
            }
7867
 
7868
        if (locsyms != NULL
7869
            && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
7870
          {
7871
            if (!info->keep_memory)
7872
              free (locsyms);
7873
            else
7874
              elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
7875
          }
7876
      }
7877
 
7878
  if (toc_ref != NULL)
7879
    free (toc_ref);
7880
  return TRUE;
7881
}
7882
 
7883
/* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
7884
   the values of any global symbols in a toc section that has been
7885
   edited.  Globals in toc sections should be a rarity, so this function
7886
   sets a flag if any are found in toc sections other than the one just
7887
   edited, so that futher hash table traversals can be avoided.  */
7888
 
7889
struct adjust_toc_info
7890
{
7891
  asection *toc;
7892
  unsigned long *skip;
7893
  bfd_boolean global_toc_syms;
7894
};
7895
 
7896
enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 };
7897
 
7898
static bfd_boolean
7899
adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
7900
{
7901
  struct ppc_link_hash_entry *eh;
7902
  struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
7903
  unsigned long i;
7904
 
7905
  if (h->root.type == bfd_link_hash_indirect)
7906
    return TRUE;
7907
 
7908
  if (h->root.type == bfd_link_hash_warning)
7909
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
7910
 
7911
  if (h->root.type != bfd_link_hash_defined
7912
      && h->root.type != bfd_link_hash_defweak)
7913
    return TRUE;
7914
 
7915
  eh = (struct ppc_link_hash_entry *) h;
7916
  if (eh->adjust_done)
7917
    return TRUE;
7918
 
7919
  if (eh->elf.root.u.def.section == toc_inf->toc)
7920
    {
7921
      if (eh->elf.root.u.def.value > toc_inf->toc->rawsize)
7922
        i = toc_inf->toc->rawsize >> 3;
7923
      else
7924
        i = eh->elf.root.u.def.value >> 3;
7925
 
7926
      if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0)
7927
        {
7928
          (*_bfd_error_handler)
7929
            (_("%s defined on removed toc entry"), eh->elf.root.root.string);
7930
          do
7931
            ++i;
7932
          while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0);
7933
          eh->elf.root.u.def.value = (bfd_vma) i << 3;
7934
        }
7935
 
7936
      eh->elf.root.u.def.value -= toc_inf->skip[i];
7937
      eh->adjust_done = 1;
7938
    }
7939
  else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
7940
    toc_inf->global_toc_syms = TRUE;
7941
 
7942
  return TRUE;
7943
}
7944
 
7945
/* Examine all relocs referencing .toc sections in order to remove
7946
   unused .toc entries.  */
7947
 
7948
bfd_boolean
7949
ppc64_elf_edit_toc (struct bfd_link_info *info)
7950
{
7951
  bfd *ibfd;
7952
  struct adjust_toc_info toc_inf;
7953
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
7954
 
7955
  htab->do_toc_opt = 1;
7956
  toc_inf.global_toc_syms = TRUE;
7957
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
7958
    {
7959
      asection *toc, *sec;
7960
      Elf_Internal_Shdr *symtab_hdr;
7961
      Elf_Internal_Sym *local_syms;
7962
      Elf_Internal_Rela *relstart, *rel, *toc_relocs;
7963
      unsigned long *skip, *drop;
7964
      unsigned char *used;
7965
      unsigned char *keep, last, some_unused;
7966
 
7967
      if (!is_ppc64_elf (ibfd))
7968
        continue;
7969
 
7970
      toc = bfd_get_section_by_name (ibfd, ".toc");
7971
      if (toc == NULL
7972
          || toc->size == 0
7973
          || toc->sec_info_type == ELF_INFO_TYPE_JUST_SYMS
7974
          || elf_discarded_section (toc))
7975
        continue;
7976
 
7977
      toc_relocs = NULL;
7978
      local_syms = NULL;
7979
      symtab_hdr = &elf_symtab_hdr (ibfd);
7980
 
7981
      /* Look at sections dropped from the final link.  */
7982
      skip = NULL;
7983
      relstart = NULL;
7984
      for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7985
        {
7986
          if (sec->reloc_count == 0
7987
              || !elf_discarded_section (sec)
7988
              || get_opd_info (sec)
7989
              || (sec->flags & SEC_ALLOC) == 0
7990
              || (sec->flags & SEC_DEBUGGING) != 0)
7991
            continue;
7992
 
7993
          relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
7994
          if (relstart == NULL)
7995
            goto error_ret;
7996
 
7997
          /* Run through the relocs to see which toc entries might be
7998
             unused.  */
7999
          for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8000
            {
8001
              enum elf_ppc64_reloc_type r_type;
8002
              unsigned long r_symndx;
8003
              asection *sym_sec;
8004
              struct elf_link_hash_entry *h;
8005
              Elf_Internal_Sym *sym;
8006
              bfd_vma val;
8007
 
8008
              r_type = ELF64_R_TYPE (rel->r_info);
8009
              switch (r_type)
8010
                {
8011
                default:
8012
                  continue;
8013
 
8014
                case R_PPC64_TOC16:
8015
                case R_PPC64_TOC16_LO:
8016
                case R_PPC64_TOC16_HI:
8017
                case R_PPC64_TOC16_HA:
8018
                case R_PPC64_TOC16_DS:
8019
                case R_PPC64_TOC16_LO_DS:
8020
                  break;
8021
                }
8022
 
8023
              r_symndx = ELF64_R_SYM (rel->r_info);
8024
              if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8025
                              r_symndx, ibfd))
8026
                goto error_ret;
8027
 
8028
              if (sym_sec != toc)
8029
                continue;
8030
 
8031
              if (h != NULL)
8032
                val = h->root.u.def.value;
8033
              else
8034
                val = sym->st_value;
8035
              val += rel->r_addend;
8036
 
8037
              if (val >= toc->size)
8038
                continue;
8039
 
8040
              /* Anything in the toc ought to be aligned to 8 bytes.
8041
                 If not, don't mark as unused.  */
8042
              if (val & 7)
8043
                continue;
8044
 
8045
              if (skip == NULL)
8046
                {
8047
                  skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8048
                  if (skip == NULL)
8049
                    goto error_ret;
8050
                }
8051
 
8052
              skip[val >> 3] = ref_from_discarded;
8053
            }
8054
 
8055
          if (elf_section_data (sec)->relocs != relstart)
8056
            free (relstart);
8057
        }
8058
 
8059
      /* For largetoc loads of address constants, we can convert
8060
         .  addis rx,2,addr@got@ha
8061
         .  ld ry,addr@got@l(rx)
8062
         to
8063
         .  addis rx,2,addr@toc@ha
8064
         .  addi ry,rx,addr@toc@l
8065
         when addr is within 2G of the toc pointer.  This then means
8066
         that the word storing "addr" in the toc is no longer needed.  */
8067
 
8068
      if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc
8069
          && toc->output_section->rawsize < (bfd_vma) 1 << 31
8070
          && toc->reloc_count != 0)
8071
        {
8072
          /* Read toc relocs.  */
8073
          toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
8074
                                                  info->keep_memory);
8075
          if (toc_relocs == NULL)
8076
            goto error_ret;
8077
 
8078
          for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
8079
            {
8080
              enum elf_ppc64_reloc_type r_type;
8081
              unsigned long r_symndx;
8082
              asection *sym_sec;
8083
              struct elf_link_hash_entry *h;
8084
              Elf_Internal_Sym *sym;
8085
              bfd_vma val, addr;
8086
 
8087
              r_type = ELF64_R_TYPE (rel->r_info);
8088
              if (r_type != R_PPC64_ADDR64)
8089
                continue;
8090
 
8091
              r_symndx = ELF64_R_SYM (rel->r_info);
8092
              if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8093
                              r_symndx, ibfd))
8094
                goto error_ret;
8095
 
8096
              if (sym_sec == NULL
8097
                  || elf_discarded_section (sym_sec))
8098
                continue;
8099
 
8100
              if (!SYMBOL_CALLS_LOCAL (info, h))
8101
                continue;
8102
 
8103
              if (h != NULL)
8104
                {
8105
                  if (h->type == STT_GNU_IFUNC)
8106
                    continue;
8107
                  val = h->root.u.def.value;
8108
                }
8109
              else
8110
                {
8111
                  if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
8112
                    continue;
8113
                  val = sym->st_value;
8114
                }
8115
              val += rel->r_addend;
8116
              val += sym_sec->output_section->vma + sym_sec->output_offset;
8117
 
8118
              /* We don't yet know the exact toc pointer value, but we
8119
                 know it will be somewhere in the toc section.  Don't
8120
                 optimize if the difference from any possible toc
8121
                 pointer is outside [ff..f80008000, 7fff7fff].  */
8122
              addr = toc->output_section->vma + TOC_BASE_OFF;
8123
              if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8124
                continue;
8125
 
8126
              addr = toc->output_section->vma + toc->output_section->rawsize;
8127
              if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8128
                continue;
8129
 
8130
              if (skip == NULL)
8131
                {
8132
                  skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8133
                  if (skip == NULL)
8134
                    goto error_ret;
8135
                }
8136
 
8137
              skip[rel->r_offset >> 3]
8138
                |= can_optimize | ((rel - toc_relocs) << 2);
8139
            }
8140
        }
8141
 
8142
      if (skip == NULL)
8143
        continue;
8144
 
8145
      used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
8146
      if (used == NULL)
8147
        {
8148
        error_ret:
8149
          if (local_syms != NULL
8150
              && symtab_hdr->contents != (unsigned char *) local_syms)
8151
            free (local_syms);
8152
          if (sec != NULL
8153
              && relstart != NULL
8154
              && elf_section_data (sec)->relocs != relstart)
8155
            free (relstart);
8156
          if (toc_relocs != NULL
8157
              && elf_section_data (toc)->relocs != toc_relocs)
8158
            free (toc_relocs);
8159
          if (skip != NULL)
8160
            free (skip);
8161
          return FALSE;
8162
        }
8163
 
8164
      /* Now check all kept sections that might reference the toc.
8165
         Check the toc itself last.  */
8166
      for (sec = (ibfd->sections == toc && toc->next ? toc->next
8167
                  : ibfd->sections);
8168
           sec != NULL;
8169
           sec = (sec == toc ? NULL
8170
                  : sec->next == NULL ? toc
8171
                  : sec->next == toc && toc->next ? toc->next
8172
                  : sec->next))
8173
        {
8174
          int repeat;
8175
 
8176
          if (sec->reloc_count == 0
8177
              || elf_discarded_section (sec)
8178
              || get_opd_info (sec)
8179
              || (sec->flags & SEC_ALLOC) == 0
8180
              || (sec->flags & SEC_DEBUGGING) != 0)
8181
            continue;
8182
 
8183
          relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8184
                                                info->keep_memory);
8185
          if (relstart == NULL)
8186
            goto error_ret;
8187
 
8188
          /* Mark toc entries referenced as used.  */
8189
          repeat = 0;
8190
          do
8191
            for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8192
              {
8193
                enum elf_ppc64_reloc_type r_type;
8194
                unsigned long r_symndx;
8195
                asection *sym_sec;
8196
                struct elf_link_hash_entry *h;
8197
                Elf_Internal_Sym *sym;
8198
                bfd_vma val;
8199
 
8200
                r_type = ELF64_R_TYPE (rel->r_info);
8201
                switch (r_type)
8202
                  {
8203
                  case R_PPC64_TOC16:
8204
                  case R_PPC64_TOC16_LO:
8205
                  case R_PPC64_TOC16_HI:
8206
                  case R_PPC64_TOC16_HA:
8207
                  case R_PPC64_TOC16_DS:
8208
                  case R_PPC64_TOC16_LO_DS:
8209
                    /* In case we're taking addresses of toc entries.  */
8210
                  case R_PPC64_ADDR64:
8211
                    break;
8212
 
8213
                  default:
8214
                    continue;
8215
                  }
8216
 
8217
                r_symndx = ELF64_R_SYM (rel->r_info);
8218
                if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8219
                                r_symndx, ibfd))
8220
                  {
8221
                    free (used);
8222
                    goto error_ret;
8223
                  }
8224
 
8225
                if (sym_sec != toc)
8226
                  continue;
8227
 
8228
                if (h != NULL)
8229
                  val = h->root.u.def.value;
8230
                else
8231
                  val = sym->st_value;
8232
                val += rel->r_addend;
8233
 
8234
                if (val >= toc->size)
8235
                  continue;
8236
 
8237
                if ((skip[val >> 3] & can_optimize) != 0)
8238
                  {
8239
                    bfd_vma off;
8240
                    unsigned char opc;
8241
 
8242
                    switch (r_type)
8243
                      {
8244
                      case R_PPC64_TOC16_HA:
8245
                        break;
8246
 
8247
                      case R_PPC64_TOC16_LO_DS:
8248
                        off = rel->r_offset + (bfd_big_endian (ibfd) ? -2 : 3);
8249
                        if (!bfd_get_section_contents (ibfd, sec, &opc, off, 1))
8250
                          return FALSE;
8251
                        if ((opc & (0x3f << 2)) == (58u << 2))
8252
                          break;
8253
                        /* Fall thru */
8254
 
8255
                      default:
8256
                        /* Wrong sort of reloc, or not a ld.  We may
8257
                           as well clear ref_from_discarded too.  */
8258
                        skip[val >> 3] = 0;
8259
                      }
8260
                  }
8261
 
8262
                /* For the toc section, we only mark as used if
8263
                   this entry itself isn't unused.  */
8264
                if (sec == toc
8265
                    && !used[val >> 3]
8266
                    && (used[rel->r_offset >> 3]
8267
                        || !(skip[rel->r_offset >> 3] & ref_from_discarded)))
8268
                  /* Do all the relocs again, to catch reference
8269
                     chains.  */
8270
                  repeat = 1;
8271
 
8272
                used[val >> 3] = 1;
8273
              }
8274
          while (repeat);
8275
 
8276
          if (elf_section_data (sec)->relocs != relstart)
8277
            free (relstart);
8278
        }
8279
 
8280
      /* Merge the used and skip arrays.  Assume that TOC
8281
         doublewords not appearing as either used or unused belong
8282
         to to an entry more than one doubleword in size.  */
8283
      for (drop = skip, keep = used, last = 0, some_unused = 0;
8284
           drop < skip + (toc->size + 7) / 8;
8285
           ++drop, ++keep)
8286
        {
8287
          if (*keep)
8288
            {
8289
              *drop &= ~ref_from_discarded;
8290
              if ((*drop & can_optimize) != 0)
8291
                some_unused = 1;
8292
              last = 0;
8293
            }
8294
          else if (*drop)
8295
            {
8296
              some_unused = 1;
8297
              last = ref_from_discarded;
8298
            }
8299
          else
8300
            *drop = last;
8301
        }
8302
 
8303
      free (used);
8304
 
8305
      if (some_unused)
8306
        {
8307
          bfd_byte *contents, *src;
8308
          unsigned long off;
8309
          Elf_Internal_Sym *sym;
8310
          bfd_boolean local_toc_syms = FALSE;
8311
 
8312
          /* Shuffle the toc contents, and at the same time convert the
8313
             skip array from booleans into offsets.  */
8314
          if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
8315
            goto error_ret;
8316
 
8317
          elf_section_data (toc)->this_hdr.contents = contents;
8318
 
8319
          for (src = contents, off = 0, drop = skip;
8320
               src < contents + toc->size;
8321
               src += 8, ++drop)
8322
            {
8323
              if ((*drop & (can_optimize | ref_from_discarded)) != 0)
8324
                off += 8;
8325
              else if (off != 0)
8326
                {
8327
                  *drop = off;
8328
                  memcpy (src - off, src, 8);
8329
                }
8330
            }
8331
          *drop = off;
8332
          toc->rawsize = toc->size;
8333
          toc->size = src - contents - off;
8334
 
8335
          /* Adjust addends for relocs against the toc section sym,
8336
             and optimize any accesses we can.  */
8337
          for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8338
            {
8339
              if (sec->reloc_count == 0
8340
                  || elf_discarded_section (sec))
8341
                continue;
8342
 
8343
              relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8344
                                                    info->keep_memory);
8345
              if (relstart == NULL)
8346
                goto error_ret;
8347
 
8348
              for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8349
                {
8350
                  enum elf_ppc64_reloc_type r_type;
8351
                  unsigned long r_symndx;
8352
                  asection *sym_sec;
8353
                  struct elf_link_hash_entry *h;
8354
                  bfd_vma val;
8355
 
8356
                  r_type = ELF64_R_TYPE (rel->r_info);
8357
                  switch (r_type)
8358
                    {
8359
                    default:
8360
                      continue;
8361
 
8362
                    case R_PPC64_TOC16:
8363
                    case R_PPC64_TOC16_LO:
8364
                    case R_PPC64_TOC16_HI:
8365
                    case R_PPC64_TOC16_HA:
8366
                    case R_PPC64_TOC16_DS:
8367
                    case R_PPC64_TOC16_LO_DS:
8368
                    case R_PPC64_ADDR64:
8369
                      break;
8370
                    }
8371
 
8372
                  r_symndx = ELF64_R_SYM (rel->r_info);
8373
                  if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8374
                                  r_symndx, ibfd))
8375
                    goto error_ret;
8376
 
8377
                  if (sym_sec != toc)
8378
                    continue;
8379
 
8380
                  if (h != NULL)
8381
                    val = h->root.u.def.value;
8382
                  else
8383
                    {
8384
                      val = sym->st_value;
8385
                      if (val != 0)
8386
                        local_toc_syms = TRUE;
8387
                    }
8388
 
8389
                  val += rel->r_addend;
8390
 
8391
                  if (val > toc->rawsize)
8392
                    val = toc->rawsize;
8393
                  else if ((skip[val >> 3] & ref_from_discarded) != 0)
8394
                    continue;
8395
                  else if ((skip[val >> 3] & can_optimize) != 0)
8396
                    {
8397
                      Elf_Internal_Rela *tocrel
8398
                        = toc_relocs + (skip[val >> 3] >> 2);
8399
                      unsigned long tsym = ELF64_R_SYM (tocrel->r_info);
8400
 
8401
                      switch (r_type)
8402
                        {
8403
                        case R_PPC64_TOC16_HA:
8404
                          rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA);
8405
                          break;
8406
 
8407
                        case R_PPC64_TOC16_LO_DS:
8408
                          rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT);
8409
                          break;
8410
 
8411
                        default:
8412
                          abort ();
8413
                        }
8414
                      rel->r_addend = tocrel->r_addend;
8415
                      elf_section_data (sec)->relocs = relstart;
8416
                      continue;
8417
                    }
8418
 
8419
                  if (h != NULL || sym->st_value != 0)
8420
                    continue;
8421
 
8422
                  rel->r_addend -= skip[val >> 3];
8423
                  elf_section_data (sec)->relocs = relstart;
8424
                }
8425
 
8426
              if (elf_section_data (sec)->relocs != relstart)
8427
                free (relstart);
8428
            }
8429
 
8430
          /* We shouldn't have local or global symbols defined in the TOC,
8431
             but handle them anyway.  */
8432
          if (local_syms != NULL)
8433
            for (sym = local_syms;
8434
                 sym < local_syms + symtab_hdr->sh_info;
8435
                 ++sym)
8436
              if (sym->st_value != 0
8437
                  && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
8438
                {
8439
                  unsigned long i;
8440
 
8441
                  if (sym->st_value > toc->rawsize)
8442
                    i = toc->rawsize >> 3;
8443
                  else
8444
                    i = sym->st_value >> 3;
8445
 
8446
                  if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
8447
                    {
8448
                      if (local_toc_syms)
8449
                        (*_bfd_error_handler)
8450
                          (_("%s defined on removed toc entry"),
8451
                           bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
8452
                      do
8453
                        ++i;
8454
                      while ((skip[i] & (ref_from_discarded | can_optimize)));
8455
                      sym->st_value = (bfd_vma) i << 3;
8456
                    }
8457
 
8458
                  sym->st_value -= skip[i];
8459
                  symtab_hdr->contents = (unsigned char *) local_syms;
8460
                }
8461
 
8462
          /* Adjust any global syms defined in this toc input section.  */
8463
          if (toc_inf.global_toc_syms)
8464
            {
8465
              toc_inf.toc = toc;
8466
              toc_inf.skip = skip;
8467
              toc_inf.global_toc_syms = FALSE;
8468
              elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
8469
                                      &toc_inf);
8470
            }
8471
 
8472
          if (toc->reloc_count != 0)
8473
            {
8474
              Elf_Internal_Shdr *rel_hdr;
8475
              Elf_Internal_Rela *wrel;
8476
              bfd_size_type sz;
8477
 
8478
              /* Remove unused toc relocs, and adjust those we keep.  */
8479
              if (toc_relocs == NULL)
8480
                toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
8481
                                                        info->keep_memory);
8482
              if (toc_relocs == NULL)
8483
                goto error_ret;
8484
 
8485
              wrel = toc_relocs;
8486
              for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
8487
                if ((skip[rel->r_offset >> 3]
8488
                     & (ref_from_discarded | can_optimize)) == 0)
8489
                  {
8490
                    wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
8491
                    wrel->r_info = rel->r_info;
8492
                    wrel->r_addend = rel->r_addend;
8493
                    ++wrel;
8494
                  }
8495
                else if (!dec_dynrel_count (rel->r_info, toc, info,
8496
                                            &local_syms, NULL, NULL))
8497
                  goto error_ret;
8498
 
8499
              elf_section_data (toc)->relocs = toc_relocs;
8500
              toc->reloc_count = wrel - toc_relocs;
8501
              rel_hdr = _bfd_elf_single_rel_hdr (toc);
8502
              sz = rel_hdr->sh_entsize;
8503
              rel_hdr->sh_size = toc->reloc_count * sz;
8504
            }
8505
        }
8506
      else if (toc_relocs != NULL
8507
               && elf_section_data (toc)->relocs != toc_relocs)
8508
        free (toc_relocs);
8509
 
8510
      if (local_syms != NULL
8511
          && symtab_hdr->contents != (unsigned char *) local_syms)
8512
        {
8513
          if (!info->keep_memory)
8514
            free (local_syms);
8515
          else
8516
            symtab_hdr->contents = (unsigned char *) local_syms;
8517
        }
8518
      free (skip);
8519
    }
8520
 
8521
  return TRUE;
8522
}
8523
 
8524
/* Return true iff input section I references the TOC using
8525
   instructions limited to +/-32k offsets.  */
8526
 
8527
bfd_boolean
8528
ppc64_elf_has_small_toc_reloc (asection *i)
8529
{
8530
  return (is_ppc64_elf (i->owner)
8531
          && ppc64_elf_tdata (i->owner)->has_small_toc_reloc);
8532
}
8533
 
8534
/* Allocate space for one GOT entry.  */
8535
 
8536
static void
8537
allocate_got (struct elf_link_hash_entry *h,
8538
              struct bfd_link_info *info,
8539
              struct got_entry *gent)
8540
{
8541
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
8542
  bfd_boolean dyn;
8543
  struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
8544
  int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)
8545
                 ? 16 : 8);
8546
  int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD
8547
                  ? 2 : 1) * sizeof (Elf64_External_Rela);
8548
  asection *got = ppc64_elf_tdata (gent->owner)->got;
8549
 
8550
  gent->got.offset = got->size;
8551
  got->size += entsize;
8552
 
8553
  dyn = htab->elf.dynamic_sections_created;
8554
  if ((info->shared
8555
       || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
8556
            && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
8557
                || h->root.type != bfd_link_hash_undefweak))
8558
    {
8559
      asection *relgot = ppc64_elf_tdata (gent->owner)->relgot;
8560
      relgot->size += rentsize;
8561
    }
8562
  else if (h->type == STT_GNU_IFUNC)
8563
    {
8564
      asection *relgot = htab->reliplt;
8565
      relgot->size += rentsize;
8566
      htab->got_reli_size += rentsize;
8567
    }
8568
}
8569
 
8570
/* This function merges got entries in the same toc group.  */
8571
 
8572
static void
8573
merge_got_entries (struct got_entry **pent)
8574
{
8575
  struct got_entry *ent, *ent2;
8576
 
8577
  for (ent = *pent; ent != NULL; ent = ent->next)
8578
    if (!ent->is_indirect)
8579
      for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next)
8580
        if (!ent2->is_indirect
8581
            && ent2->addend == ent->addend
8582
            && ent2->tls_type == ent->tls_type
8583
            && elf_gp (ent2->owner) == elf_gp (ent->owner))
8584
          {
8585
            ent2->is_indirect = TRUE;
8586
            ent2->got.ent = ent;
8587
          }
8588
}
8589
 
8590
/* Allocate space in .plt, .got and associated reloc sections for
8591
   dynamic relocs.  */
8592
 
8593
static bfd_boolean
8594
allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
8595
{
8596
  struct bfd_link_info *info;
8597
  struct ppc_link_hash_table *htab;
8598
  asection *s;
8599
  struct ppc_link_hash_entry *eh;
8600
  struct elf_dyn_relocs *p;
8601
  struct got_entry **pgent, *gent;
8602
 
8603
  if (h->root.type == bfd_link_hash_indirect)
8604
    return TRUE;
8605
 
8606
  if (h->root.type == bfd_link_hash_warning)
8607
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
8608
 
8609
  info = (struct bfd_link_info *) inf;
8610
  htab = ppc_hash_table (info);
8611
  if (htab == NULL)
8612
    return FALSE;
8613
 
8614
  if ((htab->elf.dynamic_sections_created
8615
       && h->dynindx != -1
8616
       && WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
8617
      || h->type == STT_GNU_IFUNC)
8618
    {
8619
      struct plt_entry *pent;
8620
      bfd_boolean doneone = FALSE;
8621
      for (pent = h->plt.plist; pent != NULL; pent = pent->next)
8622
        if (pent->plt.refcount > 0)
8623
          {
8624
            if (!htab->elf.dynamic_sections_created
8625
                || h->dynindx == -1)
8626
              {
8627
                s = htab->iplt;
8628
                pent->plt.offset = s->size;
8629
                s->size += PLT_ENTRY_SIZE;
8630
                s = htab->reliplt;
8631
              }
8632
            else
8633
              {
8634
                /* If this is the first .plt entry, make room for the special
8635
                   first entry.  */
8636
                s = htab->plt;
8637
                if (s->size == 0)
8638
                  s->size += PLT_INITIAL_ENTRY_SIZE;
8639
 
8640
                pent->plt.offset = s->size;
8641
 
8642
                /* Make room for this entry.  */
8643
                s->size += PLT_ENTRY_SIZE;
8644
 
8645
                /* Make room for the .glink code.  */
8646
                s = htab->glink;
8647
                if (s->size == 0)
8648
                  s->size += GLINK_CALL_STUB_SIZE;
8649
                /* We need bigger stubs past index 32767.  */
8650
                if (s->size >= GLINK_CALL_STUB_SIZE + 32768*2*4)
8651
                  s->size += 4;
8652
                s->size += 2*4;
8653
 
8654
                /* We also need to make an entry in the .rela.plt section.  */
8655
                s = htab->relplt;
8656
              }
8657
            s->size += sizeof (Elf64_External_Rela);
8658
            doneone = TRUE;
8659
          }
8660
        else
8661
          pent->plt.offset = (bfd_vma) -1;
8662
      if (!doneone)
8663
        {
8664
          h->plt.plist = NULL;
8665
          h->needs_plt = 0;
8666
        }
8667
    }
8668
  else
8669
    {
8670
      h->plt.plist = NULL;
8671
      h->needs_plt = 0;
8672
    }
8673
 
8674
  eh = (struct ppc_link_hash_entry *) h;
8675
  /* Run through the TLS GD got entries first if we're changing them
8676
     to TPREL.  */
8677
  if ((eh->tls_mask & TLS_TPRELGD) != 0)
8678
    for (gent = h->got.glist; gent != NULL; gent = gent->next)
8679
      if (gent->got.refcount > 0
8680
          && (gent->tls_type & TLS_GD) != 0)
8681
        {
8682
          /* This was a GD entry that has been converted to TPREL.  If
8683
             there happens to be a TPREL entry we can use that one.  */
8684
          struct got_entry *ent;
8685
          for (ent = h->got.glist; ent != NULL; ent = ent->next)
8686
            if (ent->got.refcount > 0
8687
                && (ent->tls_type & TLS_TPREL) != 0
8688
                && ent->addend == gent->addend
8689
                && ent->owner == gent->owner)
8690
              {
8691
                gent->got.refcount = 0;
8692
                break;
8693
              }
8694
 
8695
          /* If not, then we'll be using our own TPREL entry.  */
8696
          if (gent->got.refcount != 0)
8697
            gent->tls_type = TLS_TLS | TLS_TPREL;
8698
        }
8699
 
8700
  /* Remove any list entry that won't generate a word in the GOT before
8701
     we call merge_got_entries.  Otherwise we risk merging to empty
8702
     entries.  */
8703
  pgent = &h->got.glist;
8704
  while ((gent = *pgent) != NULL)
8705
    if (gent->got.refcount > 0)
8706
      {
8707
        if ((gent->tls_type & TLS_LD) != 0
8708
            && !h->def_dynamic)
8709
          {
8710
            ppc64_tlsld_got (gent->owner)->got.refcount += 1;
8711
            *pgent = gent->next;
8712
          }
8713
        else
8714
          pgent = &gent->next;
8715
      }
8716
    else
8717
      *pgent = gent->next;
8718
 
8719
  if (!htab->do_multi_toc)
8720
    merge_got_entries (&h->got.glist);
8721
 
8722
  for (gent = h->got.glist; gent != NULL; gent = gent->next)
8723
    if (!gent->is_indirect)
8724
      {
8725
        /* Make sure this symbol is output as a dynamic symbol.
8726
           Undefined weak syms won't yet be marked as dynamic,
8727
           nor will all TLS symbols.  */
8728
        if (h->dynindx == -1
8729
            && !h->forced_local
8730
            && h->type != STT_GNU_IFUNC
8731
            && htab->elf.dynamic_sections_created)
8732
          {
8733
            if (! bfd_elf_link_record_dynamic_symbol (info, h))
8734
              return FALSE;
8735
          }
8736
 
8737
        if (!is_ppc64_elf (gent->owner))
8738
          abort ();
8739
 
8740
        allocate_got (h, info, gent);
8741
      }
8742
 
8743
  if (eh->dyn_relocs == NULL
8744
      || (!htab->elf.dynamic_sections_created
8745
          && h->type != STT_GNU_IFUNC))
8746
    return TRUE;
8747
 
8748
  /* In the shared -Bsymbolic case, discard space allocated for
8749
     dynamic pc-relative relocs against symbols which turn out to be
8750
     defined in regular objects.  For the normal shared case, discard
8751
     space for relocs that have become local due to symbol visibility
8752
     changes.  */
8753
 
8754
  if (info->shared)
8755
    {
8756
      /* Relocs that use pc_count are those that appear on a call insn,
8757
         or certain REL relocs (see must_be_dyn_reloc) that can be
8758
         generated via assembly.  We want calls to protected symbols to
8759
         resolve directly to the function rather than going via the plt.
8760
         If people want function pointer comparisons to work as expected
8761
         then they should avoid writing weird assembly.  */
8762
      if (SYMBOL_CALLS_LOCAL (info, h))
8763
        {
8764
          struct elf_dyn_relocs **pp;
8765
 
8766
          for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
8767
            {
8768
              p->count -= p->pc_count;
8769
              p->pc_count = 0;
8770
              if (p->count == 0)
8771
                *pp = p->next;
8772
              else
8773
                pp = &p->next;
8774
            }
8775
        }
8776
 
8777
      /* Also discard relocs on undefined weak syms with non-default
8778
         visibility.  */
8779
      if (eh->dyn_relocs != NULL
8780
          && h->root.type == bfd_link_hash_undefweak)
8781
        {
8782
          if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
8783
            eh->dyn_relocs = NULL;
8784
 
8785
          /* Make sure this symbol is output as a dynamic symbol.
8786
             Undefined weak syms won't yet be marked as dynamic.  */
8787
          else if (h->dynindx == -1
8788
                   && !h->forced_local)
8789
            {
8790
              if (! bfd_elf_link_record_dynamic_symbol (info, h))
8791
                return FALSE;
8792
            }
8793
        }
8794
    }
8795
  else if (h->type == STT_GNU_IFUNC)
8796
    {
8797
      if (!h->non_got_ref)
8798
        eh->dyn_relocs = NULL;
8799
    }
8800
  else if (ELIMINATE_COPY_RELOCS)
8801
    {
8802
      /* For the non-shared case, discard space for relocs against
8803
         symbols which turn out to need copy relocs or are not
8804
         dynamic.  */
8805
 
8806
      if (!h->non_got_ref
8807
          && !h->def_regular)
8808
        {
8809
          /* Make sure this symbol is output as a dynamic symbol.
8810
             Undefined weak syms won't yet be marked as dynamic.  */
8811
          if (h->dynindx == -1
8812
              && !h->forced_local)
8813
            {
8814
              if (! bfd_elf_link_record_dynamic_symbol (info, h))
8815
                return FALSE;
8816
            }
8817
 
8818
          /* If that succeeded, we know we'll be keeping all the
8819
             relocs.  */
8820
          if (h->dynindx != -1)
8821
            goto keep;
8822
        }
8823
 
8824
      eh->dyn_relocs = NULL;
8825
 
8826
    keep: ;
8827
    }
8828
 
8829
  /* Finally, allocate space.  */
8830
  for (p = eh->dyn_relocs; p != NULL; p = p->next)
8831
    {
8832
      asection *sreloc = elf_section_data (p->sec)->sreloc;
8833
      if (!htab->elf.dynamic_sections_created)
8834
        sreloc = htab->reliplt;
8835
      sreloc->size += p->count * sizeof (Elf64_External_Rela);
8836
    }
8837
 
8838
  return TRUE;
8839
}
8840
 
8841
/* Find any dynamic relocs that apply to read-only sections.  */
8842
 
8843
static bfd_boolean
8844
readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
8845
{
8846
  struct ppc_link_hash_entry *eh;
8847
  struct elf_dyn_relocs *p;
8848
 
8849
  if (h->root.type == bfd_link_hash_warning)
8850
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
8851
 
8852
  eh = (struct ppc_link_hash_entry *) h;
8853
  for (p = eh->dyn_relocs; p != NULL; p = p->next)
8854
    {
8855
      asection *s = p->sec->output_section;
8856
 
8857
      if (s != NULL && (s->flags & SEC_READONLY) != 0)
8858
        {
8859
          struct bfd_link_info *info = inf;
8860
 
8861
          info->flags |= DF_TEXTREL;
8862
 
8863
          /* Not an error, just cut short the traversal.  */
8864
          return FALSE;
8865
        }
8866
    }
8867
  return TRUE;
8868
}
8869
 
8870
/* Set the sizes of the dynamic sections.  */
8871
 
8872
static bfd_boolean
8873
ppc64_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
8874
                                 struct bfd_link_info *info)
8875
{
8876
  struct ppc_link_hash_table *htab;
8877
  bfd *dynobj;
8878
  asection *s;
8879
  bfd_boolean relocs;
8880
  bfd *ibfd;
8881
  struct got_entry *first_tlsld;
8882
 
8883
  htab = ppc_hash_table (info);
8884
  if (htab == NULL)
8885
    return FALSE;
8886
 
8887
  dynobj = htab->elf.dynobj;
8888
  if (dynobj == NULL)
8889
    abort ();
8890
 
8891
  if (htab->elf.dynamic_sections_created)
8892
    {
8893
      /* Set the contents of the .interp section to the interpreter.  */
8894
      if (info->executable)
8895
        {
8896
          s = bfd_get_section_by_name (dynobj, ".interp");
8897
          if (s == NULL)
8898
            abort ();
8899
          s->size = sizeof ELF_DYNAMIC_INTERPRETER;
8900
          s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
8901
        }
8902
    }
8903
 
8904
  /* Set up .got offsets for local syms, and space for local dynamic
8905
     relocs.  */
8906
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
8907
    {
8908
      struct got_entry **lgot_ents;
8909
      struct got_entry **end_lgot_ents;
8910
      struct plt_entry **local_plt;
8911
      struct plt_entry **end_local_plt;
8912
      unsigned char *lgot_masks;
8913
      bfd_size_type locsymcount;
8914
      Elf_Internal_Shdr *symtab_hdr;
8915
      asection *srel;
8916
 
8917
      if (!is_ppc64_elf (ibfd))
8918
        continue;
8919
 
8920
      for (s = ibfd->sections; s != NULL; s = s->next)
8921
        {
8922
          struct elf_dyn_relocs *p;
8923
 
8924
          for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
8925
            {
8926
              if (!bfd_is_abs_section (p->sec)
8927
                  && bfd_is_abs_section (p->sec->output_section))
8928
                {
8929
                  /* Input section has been discarded, either because
8930
                     it is a copy of a linkonce section or due to
8931
                     linker script /DISCARD/, so we'll be discarding
8932
                     the relocs too.  */
8933
                }
8934
              else if (p->count != 0)
8935
                {
8936
                  srel = elf_section_data (p->sec)->sreloc;
8937
                  if (!htab->elf.dynamic_sections_created)
8938
                    srel = htab->reliplt;
8939
                  srel->size += p->count * sizeof (Elf64_External_Rela);
8940
                  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
8941
                    info->flags |= DF_TEXTREL;
8942
                }
8943
            }
8944
        }
8945
 
8946
      lgot_ents = elf_local_got_ents (ibfd);
8947
      if (!lgot_ents)
8948
        continue;
8949
 
8950
      symtab_hdr = &elf_symtab_hdr (ibfd);
8951
      locsymcount = symtab_hdr->sh_info;
8952
      end_lgot_ents = lgot_ents + locsymcount;
8953
      local_plt = (struct plt_entry **) end_lgot_ents;
8954
      end_local_plt = local_plt + locsymcount;
8955
      lgot_masks = (unsigned char *) end_local_plt;
8956
      s = ppc64_elf_tdata (ibfd)->got;
8957
      srel = ppc64_elf_tdata (ibfd)->relgot;
8958
      for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
8959
        {
8960
          struct got_entry **pent, *ent;
8961
 
8962
          pent = lgot_ents;
8963
          while ((ent = *pent) != NULL)
8964
            if (ent->got.refcount > 0)
8965
              {
8966
                if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
8967
                  {
8968
                    ppc64_tlsld_got (ibfd)->got.refcount += 1;
8969
                    *pent = ent->next;
8970
                  }
8971
                else
8972
                  {
8973
                    unsigned int num = 1;
8974
                    ent->got.offset = s->size;
8975
                    if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
8976
                      num = 2;
8977
                    s->size += num * 8;
8978
                    if (info->shared)
8979
                      srel->size += num * sizeof (Elf64_External_Rela);
8980
                    else if ((*lgot_masks & PLT_IFUNC) != 0)
8981
                      {
8982
                        htab->reliplt->size
8983
                          += num * sizeof (Elf64_External_Rela);
8984
                        htab->got_reli_size
8985
                          += num * sizeof (Elf64_External_Rela);
8986
                      }
8987
                    pent = &ent->next;
8988
                  }
8989
              }
8990
            else
8991
              *pent = ent->next;
8992
        }
8993
 
8994
      /* Allocate space for calls to local STT_GNU_IFUNC syms in .iplt.  */
8995
      for (; local_plt < end_local_plt; ++local_plt)
8996
        {
8997
          struct plt_entry *ent;
8998
 
8999
          for (ent = *local_plt; ent != NULL; ent = ent->next)
9000
            if (ent->plt.refcount > 0)
9001
              {
9002
                s = htab->iplt;
9003
                ent->plt.offset = s->size;
9004
                s->size += PLT_ENTRY_SIZE;
9005
 
9006
                htab->reliplt->size += sizeof (Elf64_External_Rela);
9007
              }
9008
            else
9009
              ent->plt.offset = (bfd_vma) -1;
9010
        }
9011
    }
9012
 
9013
  /* Allocate global sym .plt and .got entries, and space for global
9014
     sym dynamic relocs.  */
9015
  elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
9016
 
9017
  first_tlsld = NULL;
9018
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
9019
    {
9020
      struct got_entry *ent;
9021
 
9022
      if (!is_ppc64_elf (ibfd))
9023
        continue;
9024
 
9025
      ent = ppc64_tlsld_got (ibfd);
9026
      if (ent->got.refcount > 0)
9027
        {
9028
          if (!htab->do_multi_toc && first_tlsld != NULL)
9029
            {
9030
              ent->is_indirect = TRUE;
9031
              ent->got.ent = first_tlsld;
9032
            }
9033
          else
9034
            {
9035
              if (first_tlsld == NULL)
9036
                first_tlsld = ent;
9037
              s = ppc64_elf_tdata (ibfd)->got;
9038
              ent->got.offset = s->size;
9039
              ent->owner = ibfd;
9040
              s->size += 16;
9041
              if (info->shared)
9042
                {
9043
                  asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9044
                  srel->size += sizeof (Elf64_External_Rela);
9045
                }
9046
            }
9047
        }
9048
      else
9049
        ent->got.offset = (bfd_vma) -1;
9050
    }
9051
 
9052
  /* We now have determined the sizes of the various dynamic sections.
9053
     Allocate memory for them.  */
9054
  relocs = FALSE;
9055
  for (s = dynobj->sections; s != NULL; s = s->next)
9056
    {
9057
      if ((s->flags & SEC_LINKER_CREATED) == 0)
9058
        continue;
9059
 
9060
      if (s == htab->brlt || s == htab->relbrlt)
9061
        /* These haven't been allocated yet;  don't strip.  */
9062
        continue;
9063
      else if (s == htab->got
9064
               || s == htab->plt
9065
               || s == htab->iplt
9066
               || s == htab->glink
9067
               || s == htab->dynbss)
9068
        {
9069
          /* Strip this section if we don't need it; see the
9070
             comment below.  */
9071
        }
9072
      else if (CONST_STRNEQ (s->name, ".rela"))
9073
        {
9074
          if (s->size != 0)
9075
            {
9076
              if (s != htab->relplt)
9077
                relocs = TRUE;
9078
 
9079
              /* We use the reloc_count field as a counter if we need
9080
                 to copy relocs into the output file.  */
9081
              s->reloc_count = 0;
9082
            }
9083
        }
9084
      else
9085
        {
9086
          /* It's not one of our sections, so don't allocate space.  */
9087
          continue;
9088
        }
9089
 
9090
      if (s->size == 0)
9091
        {
9092
          /* If we don't need this section, strip it from the
9093
             output file.  This is mostly to handle .rela.bss and
9094
             .rela.plt.  We must create both sections in
9095
             create_dynamic_sections, because they must be created
9096
             before the linker maps input sections to output
9097
             sections.  The linker does that before
9098
             adjust_dynamic_symbol is called, and it is that
9099
             function which decides whether anything needs to go
9100
             into these sections.  */
9101
          s->flags |= SEC_EXCLUDE;
9102
          continue;
9103
        }
9104
 
9105
      if ((s->flags & SEC_HAS_CONTENTS) == 0)
9106
        continue;
9107
 
9108
      /* Allocate memory for the section contents.  We use bfd_zalloc
9109
         here in case unused entries are not reclaimed before the
9110
         section's contents are written out.  This should not happen,
9111
         but this way if it does we get a R_PPC64_NONE reloc in .rela
9112
         sections instead of garbage.
9113
         We also rely on the section contents being zero when writing
9114
         the GOT.  */
9115
      s->contents = bfd_zalloc (dynobj, s->size);
9116
      if (s->contents == NULL)
9117
        return FALSE;
9118
    }
9119
 
9120
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
9121
    {
9122
      if (!is_ppc64_elf (ibfd))
9123
        continue;
9124
 
9125
      s = ppc64_elf_tdata (ibfd)->got;
9126
      if (s != NULL && s != htab->got)
9127
        {
9128
          if (s->size == 0)
9129
            s->flags |= SEC_EXCLUDE;
9130
          else
9131
            {
9132
              s->contents = bfd_zalloc (ibfd, s->size);
9133
              if (s->contents == NULL)
9134
                return FALSE;
9135
            }
9136
        }
9137
      s = ppc64_elf_tdata (ibfd)->relgot;
9138
      if (s != NULL)
9139
        {
9140
          if (s->size == 0)
9141
            s->flags |= SEC_EXCLUDE;
9142
          else
9143
            {
9144
              s->contents = bfd_zalloc (ibfd, s->size);
9145
              if (s->contents == NULL)
9146
                return FALSE;
9147
              relocs = TRUE;
9148
              s->reloc_count = 0;
9149
            }
9150
        }
9151
    }
9152
 
9153
  if (htab->elf.dynamic_sections_created)
9154
    {
9155
      /* Add some entries to the .dynamic section.  We fill in the
9156
         values later, in ppc64_elf_finish_dynamic_sections, but we
9157
         must add the entries now so that we get the correct size for
9158
         the .dynamic section.  The DT_DEBUG entry is filled in by the
9159
         dynamic linker and used by the debugger.  */
9160
#define add_dynamic_entry(TAG, VAL) \
9161
  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
9162
 
9163
      if (info->executable)
9164
        {
9165
          if (!add_dynamic_entry (DT_DEBUG, 0))
9166
            return FALSE;
9167
        }
9168
 
9169
      if (htab->plt != NULL && htab->plt->size != 0)
9170
        {
9171
          if (!add_dynamic_entry (DT_PLTGOT, 0)
9172
              || !add_dynamic_entry (DT_PLTRELSZ, 0)
9173
              || !add_dynamic_entry (DT_PLTREL, DT_RELA)
9174
              || !add_dynamic_entry (DT_JMPREL, 0)
9175
              || !add_dynamic_entry (DT_PPC64_GLINK, 0))
9176
            return FALSE;
9177
        }
9178
 
9179
      if (NO_OPD_RELOCS)
9180
        {
9181
          if (!add_dynamic_entry (DT_PPC64_OPD, 0)
9182
              || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
9183
            return FALSE;
9184
        }
9185
 
9186
      if (!htab->no_tls_get_addr_opt
9187
          && htab->tls_get_addr_fd != NULL
9188
          && htab->tls_get_addr_fd->elf.plt.plist != NULL
9189
          && !add_dynamic_entry (DT_PPC64_TLSOPT, 0))
9190
        return FALSE;
9191
 
9192
      if (relocs)
9193
        {
9194
          if (!add_dynamic_entry (DT_RELA, 0)
9195
              || !add_dynamic_entry (DT_RELASZ, 0)
9196
              || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
9197
            return FALSE;
9198
 
9199
          /* If any dynamic relocs apply to a read-only section,
9200
             then we need a DT_TEXTREL entry.  */
9201
          if ((info->flags & DF_TEXTREL) == 0)
9202
            elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, info);
9203
 
9204
          if ((info->flags & DF_TEXTREL) != 0)
9205
            {
9206
              if (!add_dynamic_entry (DT_TEXTREL, 0))
9207
                return FALSE;
9208
            }
9209
        }
9210
    }
9211
#undef add_dynamic_entry
9212
 
9213
  return TRUE;
9214
}
9215
 
9216
/* Determine the type of stub needed, if any, for a call.  */
9217
 
9218
static inline enum ppc_stub_type
9219
ppc_type_of_stub (asection *input_sec,
9220
                  const Elf_Internal_Rela *rel,
9221
                  struct ppc_link_hash_entry **hash,
9222
                  struct plt_entry **plt_ent,
9223
                  bfd_vma destination)
9224
{
9225
  struct ppc_link_hash_entry *h = *hash;
9226
  bfd_vma location;
9227
  bfd_vma branch_offset;
9228
  bfd_vma max_branch_offset;
9229
  enum elf_ppc64_reloc_type r_type;
9230
 
9231
  if (h != NULL)
9232
    {
9233
      struct plt_entry *ent;
9234
      struct ppc_link_hash_entry *fdh = h;
9235
      if (h->oh != NULL
9236
          && h->oh->is_func_descriptor)
9237
        {
9238
          fdh = ppc_follow_link (h->oh);
9239
          *hash = fdh;
9240
        }
9241
 
9242
      for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
9243
        if (ent->addend == rel->r_addend
9244
            && ent->plt.offset != (bfd_vma) -1)
9245
          {
9246
            *plt_ent = ent;
9247
            return ppc_stub_plt_call;
9248
          }
9249
 
9250
      /* Here, we know we don't have a plt entry.  If we don't have a
9251
         either a defined function descriptor or a defined entry symbol
9252
         in a regular object file, then it is pointless trying to make
9253
         any other type of stub.  */
9254
      if (!is_static_defined (&fdh->elf)
9255
          && !is_static_defined (&h->elf))
9256
        return ppc_stub_none;
9257
    }
9258
  else if (elf_local_got_ents (input_sec->owner) != NULL)
9259
    {
9260
      Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner);
9261
      struct plt_entry **local_plt = (struct plt_entry **)
9262
        elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info;
9263
      unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
9264
 
9265
      if (local_plt[r_symndx] != NULL)
9266
        {
9267
          struct plt_entry *ent;
9268
 
9269
          for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next)
9270
            if (ent->addend == rel->r_addend
9271
                && ent->plt.offset != (bfd_vma) -1)
9272
              {
9273
                *plt_ent = ent;
9274
                return ppc_stub_plt_call;
9275
              }
9276
        }
9277
    }
9278
 
9279
  /* Determine where the call point is.  */
9280
  location = (input_sec->output_offset
9281
              + input_sec->output_section->vma
9282
              + rel->r_offset);
9283
 
9284
  branch_offset = destination - location;
9285
  r_type = ELF64_R_TYPE (rel->r_info);
9286
 
9287
  /* Determine if a long branch stub is needed.  */
9288
  max_branch_offset = 1 << 25;
9289
  if (r_type != R_PPC64_REL24)
9290
    max_branch_offset = 1 << 15;
9291
 
9292
  if (branch_offset + max_branch_offset >= 2 * max_branch_offset)
9293
    /* We need a stub.  Figure out whether a long_branch or plt_branch
9294
       is needed later.  */
9295
    return ppc_stub_long_branch;
9296
 
9297
  return ppc_stub_none;
9298
}
9299
 
9300
/* Build a .plt call stub.  */
9301
 
9302
static inline bfd_byte *
9303
build_plt_stub (bfd *obfd, bfd_byte *p, int offset, Elf_Internal_Rela *r)
9304
{
9305
#define PPC_LO(v) ((v) & 0xffff)
9306
#define PPC_HI(v) (((v) >> 16) & 0xffff)
9307
#define PPC_HA(v) PPC_HI ((v) + 0x8000)
9308
 
9309
  if (PPC_HA (offset) != 0)
9310
    {
9311
      if (r != NULL)
9312
        {
9313
          r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
9314
          r[1].r_offset = r[0].r_offset + 8;
9315
          r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
9316
          r[1].r_addend = r[0].r_addend;
9317
          if (PPC_HA (offset + 16) != PPC_HA (offset))
9318
            {
9319
              r[2].r_offset = r[1].r_offset + 4;
9320
              r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO);
9321
              r[2].r_addend = r[0].r_addend;
9322
            }
9323
          else
9324
            {
9325
              r[2].r_offset = r[1].r_offset + 8;
9326
              r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
9327
              r[2].r_addend = r[0].r_addend + 8;
9328
              r[3].r_offset = r[2].r_offset + 4;
9329
              r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
9330
              r[3].r_addend = r[0].r_addend + 16;
9331
            }
9332
        }
9333
      bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p),     p += 4;
9334
      bfd_put_32 (obfd, STD_R2_40R1, p),                        p += 4;
9335
      bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset), p),      p += 4;
9336
      if (PPC_HA (offset + 16) != PPC_HA (offset))
9337
        {
9338
          bfd_put_32 (obfd, ADDI_R12_R12 | PPC_LO (offset), p), p += 4;
9339
          offset = 0;
9340
        }
9341
      bfd_put_32 (obfd, MTCTR_R11, p),                          p += 4;
9342
      bfd_put_32 (obfd, LD_R2_0R12 | PPC_LO (offset + 8), p),   p += 4;
9343
      bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset + 16), p), p += 4;
9344
      bfd_put_32 (obfd, BCTR, p),                               p += 4;
9345
    }
9346
  else
9347
    {
9348
      if (r != NULL)
9349
        {
9350
          r[0].r_offset += 4;
9351
          r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
9352
          if (PPC_HA (offset + 16) != PPC_HA (offset))
9353
            {
9354
              r[1].r_offset = r[0].r_offset + 4;
9355
              r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16);
9356
              r[1].r_addend = r[0].r_addend;
9357
            }
9358
          else
9359
            {
9360
              r[1].r_offset = r[0].r_offset + 8;
9361
              r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
9362
              r[1].r_addend = r[0].r_addend + 16;
9363
              r[2].r_offset = r[1].r_offset + 4;
9364
              r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
9365
              r[2].r_addend = r[0].r_addend + 8;
9366
            }
9367
        }
9368
      bfd_put_32 (obfd, STD_R2_40R1, p),                        p += 4;
9369
      bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset), p),       p += 4;
9370
      if (PPC_HA (offset + 16) != PPC_HA (offset))
9371
        {
9372
          bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p),   p += 4;
9373
          offset = 0;
9374
        }
9375
      bfd_put_32 (obfd, MTCTR_R11, p),                          p += 4;
9376
      bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p),  p += 4;
9377
      bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p),    p += 4;
9378
      bfd_put_32 (obfd, BCTR, p),                               p += 4;
9379
    }
9380
  return p;
9381
}
9382
 
9383
/* Build a special .plt call stub for __tls_get_addr.  */
9384
 
9385
#define LD_R11_0R3      0xe9630000
9386
#define LD_R12_0R3      0xe9830000
9387
#define MR_R0_R3        0x7c601b78
9388
#define CMPDI_R11_0     0x2c2b0000
9389
#define ADD_R3_R12_R13  0x7c6c6a14
9390
#define BEQLR           0x4d820020
9391
#define MR_R3_R0        0x7c030378
9392
#define MFLR_R11        0x7d6802a6
9393
#define STD_R11_0R1     0xf9610000
9394
#define BCTRL           0x4e800421
9395
#define LD_R11_0R1      0xe9610000
9396
#define LD_R2_0R1       0xe8410000
9397
#define MTLR_R11        0x7d6803a6
9398
 
9399
static inline bfd_byte *
9400
build_tls_get_addr_stub (bfd *obfd, bfd_byte *p, int offset,
9401
                         Elf_Internal_Rela *r)
9402
{
9403
  bfd_put_32 (obfd, LD_R11_0R3 + 0, p),          p += 4;
9404
  bfd_put_32 (obfd, LD_R12_0R3 + 8, p),         p += 4;
9405
  bfd_put_32 (obfd, MR_R0_R3, p),               p += 4;
9406
  bfd_put_32 (obfd, CMPDI_R11_0, p),            p += 4;
9407
  bfd_put_32 (obfd, ADD_R3_R12_R13, p),         p += 4;
9408
  bfd_put_32 (obfd, BEQLR, p),                  p += 4;
9409
  bfd_put_32 (obfd, MR_R3_R0, p),               p += 4;
9410
  bfd_put_32 (obfd, MFLR_R11, p),               p += 4;
9411
  bfd_put_32 (obfd, STD_R11_0R1 + 32, p),       p += 4;
9412
 
9413
  if (r != NULL)
9414
    r[0].r_offset += 9 * 4;
9415
  p = build_plt_stub (obfd, p, offset, r);
9416
  bfd_put_32 (obfd, BCTRL, p - 4);
9417
 
9418
  bfd_put_32 (obfd, LD_R11_0R1 + 32, p),        p += 4;
9419
  bfd_put_32 (obfd, LD_R2_0R1 + 40, p),         p += 4;
9420
  bfd_put_32 (obfd, MTLR_R11, p),               p += 4;
9421
  bfd_put_32 (obfd, BLR, p),                    p += 4;
9422
 
9423
  return p;
9424
}
9425
 
9426
static Elf_Internal_Rela *
9427
get_relocs (asection *sec, int count)
9428
{
9429
  Elf_Internal_Rela *relocs;
9430
  struct bfd_elf_section_data *elfsec_data;
9431
 
9432
  elfsec_data = elf_section_data (sec);
9433
  relocs = elfsec_data->relocs;
9434
  if (relocs == NULL)
9435
    {
9436
      bfd_size_type relsize;
9437
      relsize = sec->reloc_count * sizeof (*relocs);
9438
      relocs = bfd_alloc (sec->owner, relsize);
9439
      if (relocs == NULL)
9440
        return NULL;
9441
      elfsec_data->relocs = relocs;
9442
      elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
9443
                                          sizeof (Elf_Internal_Shdr));
9444
      if (elfsec_data->rela.hdr == NULL)
9445
        return NULL;
9446
      elfsec_data->rela.hdr->sh_size = (sec->reloc_count
9447
                                        * sizeof (Elf64_External_Rela));
9448
      elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
9449
      sec->reloc_count = 0;
9450
    }
9451
  relocs += sec->reloc_count;
9452
  sec->reloc_count += count;
9453
  return relocs;
9454
}
9455
 
9456
static bfd_vma
9457
get_r2off (struct bfd_link_info *info,
9458
           struct ppc_stub_hash_entry *stub_entry)
9459
{
9460
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
9461
  bfd_vma r2off = htab->stub_group[stub_entry->target_section->id].toc_off;
9462
 
9463
  if (r2off == 0)
9464
    {
9465
      /* Support linking -R objects.  Get the toc pointer from the
9466
         opd entry.  */
9467
      char buf[8];
9468
      asection *opd = stub_entry->h->elf.root.u.def.section;
9469
      bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
9470
 
9471
      if (strcmp (opd->name, ".opd") != 0
9472
          || opd->reloc_count != 0)
9473
        {
9474
          info->callbacks->einfo (_("cannot find opd entry toc for %s\n"),
9475
                                  stub_entry->h->elf.root.root.string);
9476
          bfd_set_error (bfd_error_bad_value);
9477
          return 0;
9478
        }
9479
      if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
9480
        return 0;
9481
      r2off = bfd_get_64 (opd->owner, buf);
9482
      r2off -= elf_gp (info->output_bfd);
9483
    }
9484
  r2off -= htab->stub_group[stub_entry->id_sec->id].toc_off;
9485
  return r2off;
9486
}
9487
 
9488
static bfd_boolean
9489
ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
9490
{
9491
  struct ppc_stub_hash_entry *stub_entry;
9492
  struct ppc_branch_hash_entry *br_entry;
9493
  struct bfd_link_info *info;
9494
  struct ppc_link_hash_table *htab;
9495
  bfd_byte *loc;
9496
  bfd_byte *p;
9497
  bfd_vma dest, off;
9498
  int size;
9499
  Elf_Internal_Rela *r;
9500
  asection *plt;
9501
 
9502
  /* Massage our args to the form they really have.  */
9503
  stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
9504
  info = in_arg;
9505
 
9506
  htab = ppc_hash_table (info);
9507
  if (htab == NULL)
9508
    return FALSE;
9509
 
9510
  /* Make a note of the offset within the stubs for this entry.  */
9511
  stub_entry->stub_offset = stub_entry->stub_sec->size;
9512
  loc = stub_entry->stub_sec->contents + stub_entry->stub_offset;
9513
 
9514
  htab->stub_count[stub_entry->stub_type - 1] += 1;
9515
  switch (stub_entry->stub_type)
9516
    {
9517
    case ppc_stub_long_branch:
9518
    case ppc_stub_long_branch_r2off:
9519
      /* Branches are relative.  This is where we are going to.  */
9520
      off = dest = (stub_entry->target_value
9521
                    + stub_entry->target_section->output_offset
9522
                    + stub_entry->target_section->output_section->vma);
9523
 
9524
      /* And this is where we are coming from.  */
9525
      off -= (stub_entry->stub_offset
9526
              + stub_entry->stub_sec->output_offset
9527
              + stub_entry->stub_sec->output_section->vma);
9528
 
9529
      size = 4;
9530
      if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
9531
        {
9532
          bfd_vma r2off = get_r2off (info, stub_entry);
9533
 
9534
          if (r2off == 0)
9535
            {
9536
              htab->stub_error = TRUE;
9537
              return FALSE;
9538
            }
9539
          bfd_put_32 (htab->stub_bfd, STD_R2_40R1, loc);
9540
          loc += 4;
9541
          size = 12;
9542
          if (PPC_HA (r2off) != 0)
9543
            {
9544
              size = 16;
9545
              bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
9546
              loc += 4;
9547
            }
9548
          bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
9549
          loc += 4;
9550
          off -= size - 4;
9551
        }
9552
      bfd_put_32 (htab->stub_bfd, B_DOT | (off & 0x3fffffc), loc);
9553
 
9554
      if (off + (1 << 25) >= (bfd_vma) (1 << 26))
9555
        {
9556
          info->callbacks->einfo (_("long branch stub `%s' offset overflow\n"),
9557
                                  stub_entry->root.string);
9558
          htab->stub_error = TRUE;
9559
          return FALSE;
9560
        }
9561
 
9562
      if (info->emitrelocations)
9563
        {
9564
          r = get_relocs (stub_entry->stub_sec, 1);
9565
          if (r == NULL)
9566
            return FALSE;
9567
          r->r_offset = loc - stub_entry->stub_sec->contents;
9568
          r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
9569
          r->r_addend = dest;
9570
          if (stub_entry->h != NULL)
9571
            {
9572
              struct elf_link_hash_entry **hashes;
9573
              unsigned long symndx;
9574
              struct ppc_link_hash_entry *h;
9575
 
9576
              hashes = elf_sym_hashes (htab->stub_bfd);
9577
              if (hashes == NULL)
9578
                {
9579
                  bfd_size_type hsize;
9580
 
9581
                  hsize = (htab->stub_globals + 1) * sizeof (*hashes);
9582
                  hashes = bfd_zalloc (htab->stub_bfd, hsize);
9583
                  if (hashes == NULL)
9584
                    return FALSE;
9585
                  elf_sym_hashes (htab->stub_bfd) = hashes;
9586
                  htab->stub_globals = 1;
9587
                }
9588
              symndx = htab->stub_globals++;
9589
              h = stub_entry->h;
9590
              hashes[symndx] = &h->elf;
9591
              r->r_info = ELF64_R_INFO (symndx, R_PPC64_REL24);
9592
              if (h->oh != NULL && h->oh->is_func)
9593
                h = ppc_follow_link (h->oh);
9594
              if (h->elf.root.u.def.section != stub_entry->target_section)
9595
                /* H is an opd symbol.  The addend must be zero.  */
9596
                r->r_addend = 0;
9597
              else
9598
                {
9599
                  off = (h->elf.root.u.def.value
9600
                         + h->elf.root.u.def.section->output_offset
9601
                         + h->elf.root.u.def.section->output_section->vma);
9602
                  r->r_addend -= off;
9603
                }
9604
            }
9605
        }
9606
      break;
9607
 
9608
    case ppc_stub_plt_branch:
9609
    case ppc_stub_plt_branch_r2off:
9610
      br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
9611
                                         stub_entry->root.string + 9,
9612
                                         FALSE, FALSE);
9613
      if (br_entry == NULL)
9614
        {
9615
          info->callbacks->einfo (_("can't find branch stub `%s'\n"),
9616
                                  stub_entry->root.string);
9617
          htab->stub_error = TRUE;
9618
          return FALSE;
9619
        }
9620
 
9621
      dest = (stub_entry->target_value
9622
              + stub_entry->target_section->output_offset
9623
              + stub_entry->target_section->output_section->vma);
9624
 
9625
      bfd_put_64 (htab->brlt->owner, dest,
9626
                  htab->brlt->contents + br_entry->offset);
9627
 
9628
      if (br_entry->iter == htab->stub_iteration)
9629
        {
9630
          br_entry->iter = 0;
9631
 
9632
          if (htab->relbrlt != NULL)
9633
            {
9634
              /* Create a reloc for the branch lookup table entry.  */
9635
              Elf_Internal_Rela rela;
9636
              bfd_byte *rl;
9637
 
9638
              rela.r_offset = (br_entry->offset
9639
                               + htab->brlt->output_offset
9640
                               + htab->brlt->output_section->vma);
9641
              rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
9642
              rela.r_addend = dest;
9643
 
9644
              rl = htab->relbrlt->contents;
9645
              rl += (htab->relbrlt->reloc_count++
9646
                     * sizeof (Elf64_External_Rela));
9647
              bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
9648
            }
9649
          else if (info->emitrelocations)
9650
            {
9651
              r = get_relocs (htab->brlt, 1);
9652
              if (r == NULL)
9653
                return FALSE;
9654
              /* brlt, being SEC_LINKER_CREATED does not go through the
9655
                 normal reloc processing.  Symbols and offsets are not
9656
                 translated from input file to output file form, so
9657
                 set up the offset per the output file.  */
9658
              r->r_offset = (br_entry->offset
9659
                             + htab->brlt->output_offset
9660
                             + htab->brlt->output_section->vma);
9661
              r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
9662
              r->r_addend = dest;
9663
            }
9664
        }
9665
 
9666
      dest = (br_entry->offset
9667
              + htab->brlt->output_offset
9668
              + htab->brlt->output_section->vma);
9669
 
9670
      off = (dest
9671
             - elf_gp (htab->brlt->output_section->owner)
9672
             - htab->stub_group[stub_entry->id_sec->id].toc_off);
9673
 
9674
      if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
9675
        {
9676
          info->callbacks->einfo
9677
            (_("linkage table error against `%s'\n"),
9678
             stub_entry->root.string);
9679
          bfd_set_error (bfd_error_bad_value);
9680
          htab->stub_error = TRUE;
9681
          return FALSE;
9682
        }
9683
 
9684
      if (info->emitrelocations)
9685
        {
9686
          r = get_relocs (stub_entry->stub_sec, 1 + (PPC_HA (off) != 0));
9687
          if (r == NULL)
9688
            return FALSE;
9689
          r[0].r_offset = loc - stub_entry->stub_sec->contents;
9690
          if (bfd_big_endian (info->output_bfd))
9691
            r[0].r_offset += 2;
9692
          if (stub_entry->stub_type == ppc_stub_plt_branch_r2off)
9693
            r[0].r_offset += 4;
9694
          r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
9695
          r[0].r_addend = dest;
9696
          if (PPC_HA (off) != 0)
9697
            {
9698
              r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
9699
              r[1].r_offset = r[0].r_offset + 4;
9700
              r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
9701
              r[1].r_addend = r[0].r_addend;
9702
            }
9703
        }
9704
 
9705
      if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
9706
        {
9707
          if (PPC_HA (off) != 0)
9708
            {
9709
              size = 16;
9710
              bfd_put_32 (htab->stub_bfd, ADDIS_R12_R2 | PPC_HA (off), loc);
9711
              loc += 4;
9712
              bfd_put_32 (htab->stub_bfd, LD_R11_0R12 | PPC_LO (off), loc);
9713
            }
9714
          else
9715
            {
9716
              size = 12;
9717
              bfd_put_32 (htab->stub_bfd, LD_R11_0R2 | PPC_LO (off), loc);
9718
            }
9719
        }
9720
      else
9721
        {
9722
          bfd_vma r2off = get_r2off (info, stub_entry);
9723
 
9724
          if (r2off == 0)
9725
            {
9726
              htab->stub_error = TRUE;
9727
              return FALSE;
9728
            }
9729
 
9730
          bfd_put_32 (htab->stub_bfd, STD_R2_40R1, loc);
9731
          loc += 4;
9732
          size = 20;
9733
          if (PPC_HA (off) != 0)
9734
            {
9735
              size += 4;
9736
              bfd_put_32 (htab->stub_bfd, ADDIS_R12_R2 | PPC_HA (off), loc);
9737
              loc += 4;
9738
              bfd_put_32 (htab->stub_bfd, LD_R11_0R12 | PPC_LO (off), loc);
9739
              loc += 4;
9740
            }
9741
          else
9742
            {
9743
              bfd_put_32 (htab->stub_bfd, LD_R11_0R2 | PPC_LO (off), loc);
9744
              loc += 4;
9745
            }
9746
 
9747
          if (PPC_HA (r2off) != 0)
9748
            {
9749
              size += 4;
9750
              bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
9751
              loc += 4;
9752
            }
9753
          bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
9754
        }
9755
      loc += 4;
9756
      bfd_put_32 (htab->stub_bfd, MTCTR_R11, loc);
9757
      loc += 4;
9758
      bfd_put_32 (htab->stub_bfd, BCTR, loc);
9759
      break;
9760
 
9761
    case ppc_stub_plt_call:
9762
      if (stub_entry->h != NULL
9763
          && stub_entry->h->is_func_descriptor
9764
          && stub_entry->h->oh != NULL)
9765
        {
9766
          struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
9767
 
9768
          /* If the old-ABI "dot-symbol" is undefined make it weak so
9769
             we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL.
9770
             FIXME: We used to define the symbol on one of the call
9771
             stubs instead, which is why we test symbol section id
9772
             against htab->top_id in various places.  Likely all
9773
             these checks could now disappear.  */
9774
          if (fh->elf.root.type == bfd_link_hash_undefined)
9775
            fh->elf.root.type = bfd_link_hash_undefweak;
9776
          /* Stop undo_symbol_twiddle changing it back to undefined.  */
9777
          fh->was_undefined = 0;
9778
        }
9779
 
9780
      /* Now build the stub.  */
9781
      dest = stub_entry->plt_ent->plt.offset & ~1;
9782
      if (dest >= (bfd_vma) -2)
9783
        abort ();
9784
 
9785
      plt = htab->plt;
9786
      if (!htab->elf.dynamic_sections_created
9787
          || stub_entry->h == NULL
9788
          || stub_entry->h->elf.dynindx == -1)
9789
        plt = htab->iplt;
9790
 
9791
      dest += plt->output_offset + plt->output_section->vma;
9792
 
9793
      if (stub_entry->h == NULL
9794
          && (stub_entry->plt_ent->plt.offset & 1) == 0)
9795
        {
9796
          Elf_Internal_Rela rela;
9797
          bfd_byte *rl;
9798
 
9799
          rela.r_offset = dest;
9800
          rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
9801
          rela.r_addend = (stub_entry->target_value
9802
                           + stub_entry->target_section->output_offset
9803
                           + stub_entry->target_section->output_section->vma);
9804
 
9805
          rl = (htab->reliplt->contents
9806
                + (htab->reliplt->reloc_count++
9807
                   * sizeof (Elf64_External_Rela)));
9808
          bfd_elf64_swap_reloca_out (info->output_bfd, &rela, rl);
9809
          stub_entry->plt_ent->plt.offset |= 1;
9810
        }
9811
 
9812
      off = (dest
9813
             - elf_gp (plt->output_section->owner)
9814
             - htab->stub_group[stub_entry->id_sec->id].toc_off);
9815
 
9816
      if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
9817
        {
9818
          info->callbacks->einfo
9819
            (_("linkage table error against `%s'\n"),
9820
             stub_entry->h != NULL
9821
             ? stub_entry->h->elf.root.root.string
9822
             : "<local sym>");
9823
          bfd_set_error (bfd_error_bad_value);
9824
          htab->stub_error = TRUE;
9825
          return FALSE;
9826
        }
9827
 
9828
      r = NULL;
9829
      if (info->emitrelocations)
9830
        {
9831
          r = get_relocs (stub_entry->stub_sec,
9832
                          (2 + (PPC_HA (off) != 0)
9833
                           + (PPC_HA (off + 16) == PPC_HA (off))));
9834
          if (r == NULL)
9835
            return FALSE;
9836
          r[0].r_offset = loc - stub_entry->stub_sec->contents;
9837
          if (bfd_big_endian (info->output_bfd))
9838
            r[0].r_offset += 2;
9839
          r[0].r_addend = dest;
9840
        }
9841
      if (stub_entry->h != NULL
9842
          && (stub_entry->h == htab->tls_get_addr_fd
9843
              || stub_entry->h == htab->tls_get_addr)
9844
          && !htab->no_tls_get_addr_opt)
9845
        p = build_tls_get_addr_stub (htab->stub_bfd, loc, off, r);
9846
      else
9847
        p = build_plt_stub (htab->stub_bfd, loc, off, r);
9848
      size = p - loc;
9849
      break;
9850
 
9851
    default:
9852
      BFD_FAIL ();
9853
      return FALSE;
9854
    }
9855
 
9856
  stub_entry->stub_sec->size += size;
9857
 
9858
  if (htab->emit_stub_syms)
9859
    {
9860
      struct elf_link_hash_entry *h;
9861
      size_t len1, len2;
9862
      char *name;
9863
      const char *const stub_str[] = { "long_branch",
9864
                                       "long_branch_r2off",
9865
                                       "plt_branch",
9866
                                       "plt_branch_r2off",
9867
                                       "plt_call" };
9868
 
9869
      len1 = strlen (stub_str[stub_entry->stub_type - 1]);
9870
      len2 = strlen (stub_entry->root.string);
9871
      name = bfd_malloc (len1 + len2 + 2);
9872
      if (name == NULL)
9873
        return FALSE;
9874
      memcpy (name, stub_entry->root.string, 9);
9875
      memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
9876
      memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
9877
      h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
9878
      if (h == NULL)
9879
        return FALSE;
9880
      if (h->root.type == bfd_link_hash_new)
9881
        {
9882
          h->root.type = bfd_link_hash_defined;
9883
          h->root.u.def.section = stub_entry->stub_sec;
9884
          h->root.u.def.value = stub_entry->stub_offset;
9885
          h->ref_regular = 1;
9886
          h->def_regular = 1;
9887
          h->ref_regular_nonweak = 1;
9888
          h->forced_local = 1;
9889
          h->non_elf = 0;
9890
        }
9891
    }
9892
 
9893
  return TRUE;
9894
}
9895
 
9896
/* As above, but don't actually build the stub.  Just bump offset so
9897
   we know stub section sizes, and select plt_branch stubs where
9898
   long_branch stubs won't do.  */
9899
 
9900
static bfd_boolean
9901
ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
9902
{
9903
  struct ppc_stub_hash_entry *stub_entry;
9904
  struct bfd_link_info *info;
9905
  struct ppc_link_hash_table *htab;
9906
  bfd_vma off;
9907
  int size;
9908
 
9909
  /* Massage our args to the form they really have.  */
9910
  stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
9911
  info = in_arg;
9912
 
9913
  htab = ppc_hash_table (info);
9914
  if (htab == NULL)
9915
    return FALSE;
9916
 
9917
  if (stub_entry->stub_type == ppc_stub_plt_call)
9918
    {
9919
      asection *plt;
9920
      off = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
9921
      if (off >= (bfd_vma) -2)
9922
        abort ();
9923
      plt = htab->plt;
9924
      if (!htab->elf.dynamic_sections_created
9925
          || stub_entry->h == NULL
9926
          || stub_entry->h->elf.dynindx == -1)
9927
        plt = htab->iplt;
9928
      off += (plt->output_offset
9929
              + plt->output_section->vma
9930
              - elf_gp (plt->output_section->owner)
9931
              - htab->stub_group[stub_entry->id_sec->id].toc_off);
9932
 
9933
      size = PLT_CALL_STUB_SIZE;
9934
      if (PPC_HA (off) == 0)
9935
        size -= 4;
9936
      if (PPC_HA (off + 16) != PPC_HA (off))
9937
        size += 4;
9938
      if (stub_entry->h != NULL
9939
          && (stub_entry->h == htab->tls_get_addr_fd
9940
              || stub_entry->h == htab->tls_get_addr)
9941
          && !htab->no_tls_get_addr_opt)
9942
        size += 13 * 4;
9943
      if (info->emitrelocations)
9944
        {
9945
          stub_entry->stub_sec->reloc_count
9946
            += 2 + (PPC_HA (off) != 0) + (PPC_HA (off + 16) == PPC_HA (off));
9947
          stub_entry->stub_sec->flags |= SEC_RELOC;
9948
        }
9949
    }
9950
  else
9951
    {
9952
      /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
9953
         variants.  */
9954
      bfd_vma r2off = 0;
9955
 
9956
      off = (stub_entry->target_value
9957
             + stub_entry->target_section->output_offset
9958
             + stub_entry->target_section->output_section->vma);
9959
      off -= (stub_entry->stub_sec->size
9960
              + stub_entry->stub_sec->output_offset
9961
              + stub_entry->stub_sec->output_section->vma);
9962
 
9963
      /* Reset the stub type from the plt variant in case we now
9964
         can reach with a shorter stub.  */
9965
      if (stub_entry->stub_type >= ppc_stub_plt_branch)
9966
        stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
9967
 
9968
      size = 4;
9969
      if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
9970
        {
9971
          r2off = get_r2off (info, stub_entry);
9972
          if (r2off == 0)
9973
            {
9974
              htab->stub_error = TRUE;
9975
              return FALSE;
9976
            }
9977
          size = 12;
9978
          if (PPC_HA (r2off) != 0)
9979
            size = 16;
9980
          off -= size - 4;
9981
        }
9982
 
9983
      /* If the branch offset if too big, use a ppc_stub_plt_branch.  */
9984
      if (off + (1 << 25) >= (bfd_vma) (1 << 26))
9985
        {
9986
          struct ppc_branch_hash_entry *br_entry;
9987
 
9988
          br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
9989
                                             stub_entry->root.string + 9,
9990
                                             TRUE, FALSE);
9991
          if (br_entry == NULL)
9992
            {
9993
              info->callbacks->einfo (_("can't build branch stub `%s'\n"),
9994
                                      stub_entry->root.string);
9995
              htab->stub_error = TRUE;
9996
              return FALSE;
9997
            }
9998
 
9999
          if (br_entry->iter != htab->stub_iteration)
10000
            {
10001
              br_entry->iter = htab->stub_iteration;
10002
              br_entry->offset = htab->brlt->size;
10003
              htab->brlt->size += 8;
10004
 
10005
              if (htab->relbrlt != NULL)
10006
                htab->relbrlt->size += sizeof (Elf64_External_Rela);
10007
              else if (info->emitrelocations)
10008
                {
10009
                  htab->brlt->reloc_count += 1;
10010
                  htab->brlt->flags |= SEC_RELOC;
10011
                }
10012
            }
10013
 
10014
          stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
10015
          off = (br_entry->offset
10016
                 + htab->brlt->output_offset
10017
                 + htab->brlt->output_section->vma
10018
                 - elf_gp (htab->brlt->output_section->owner)
10019
                 - htab->stub_group[stub_entry->id_sec->id].toc_off);
10020
 
10021
          if (info->emitrelocations)
10022
            {
10023
              stub_entry->stub_sec->reloc_count += 1 + (PPC_HA (off) != 0);
10024
              stub_entry->stub_sec->flags |= SEC_RELOC;
10025
            }
10026
 
10027
          if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
10028
            {
10029
              size = 12;
10030
              if (PPC_HA (off) != 0)
10031
                size = 16;
10032
            }
10033
          else
10034
            {
10035
              size = 20;
10036
              if (PPC_HA (off) != 0)
10037
                size += 4;
10038
 
10039
              if (PPC_HA (r2off) != 0)
10040
                size += 4;
10041
            }
10042
        }
10043
      else if (info->emitrelocations)
10044
        {
10045
          stub_entry->stub_sec->reloc_count += 1;
10046
          stub_entry->stub_sec->flags |= SEC_RELOC;
10047
        }
10048
    }
10049
 
10050
  stub_entry->stub_sec->size += size;
10051
  return TRUE;
10052
}
10053
 
10054
/* Set up various things so that we can make a list of input sections
10055
   for each output section included in the link.  Returns -1 on error,
10056
 
10057
 
10058
int
10059
ppc64_elf_setup_section_lists
10060
  (struct bfd_link_info *info,
10061
   asection *(*add_stub_section) (const char *, asection *),
10062
   void (*layout_sections_again) (void))
10063
{
10064
  bfd *input_bfd;
10065
  int top_id, top_index, id;
10066
  asection *section;
10067
  asection **input_list;
10068
  bfd_size_type amt;
10069
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
10070
 
10071
  if (htab == NULL)
10072
    return -1;
10073
  /* Stash our params away.  */
10074
  htab->add_stub_section = add_stub_section;
10075
  htab->layout_sections_again = layout_sections_again;
10076
 
10077
  if (htab->brlt == NULL)
10078
    return 0;
10079
 
10080
  /* Find the top input section id.  */
10081
  for (input_bfd = info->input_bfds, top_id = 3;
10082
       input_bfd != NULL;
10083
       input_bfd = input_bfd->link_next)
10084
    {
10085
      for (section = input_bfd->sections;
10086
           section != NULL;
10087
           section = section->next)
10088
        {
10089
          if (top_id < section->id)
10090
            top_id = section->id;
10091
        }
10092
    }
10093
 
10094
  htab->top_id = top_id;
10095
  amt = sizeof (struct map_stub) * (top_id + 1);
10096
  htab->stub_group = bfd_zmalloc (amt);
10097
  if (htab->stub_group == NULL)
10098
    return -1;
10099
 
10100
  /* Set toc_off for com, und, abs and ind sections.  */
10101
  for (id = 0; id < 3; id++)
10102
    htab->stub_group[id].toc_off = TOC_BASE_OFF;
10103
 
10104
  /* We can't use output_bfd->section_count here to find the top output
10105
     section index as some sections may have been removed, and
10106
     strip_excluded_output_sections doesn't renumber the indices.  */
10107
  for (section = info->output_bfd->sections, top_index = 0;
10108
       section != NULL;
10109
       section = section->next)
10110
    {
10111
      if (top_index < section->index)
10112
        top_index = section->index;
10113
    }
10114
 
10115
  htab->top_index = top_index;
10116
  amt = sizeof (asection *) * (top_index + 1);
10117
  input_list = bfd_zmalloc (amt);
10118
  htab->input_list = input_list;
10119
  if (input_list == NULL)
10120
    return -1;
10121
 
10122
  return 1;
10123
}
10124
 
10125
/* Set up for first pass at multitoc partitioning.  */
10126
 
10127
void
10128
ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
10129
{
10130
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
10131
 
10132
  elf_gp (info->output_bfd) = ppc64_elf_toc (info->output_bfd);
10133
  htab->toc_curr = elf_gp (info->output_bfd);
10134
  htab->toc_bfd = NULL;
10135
  htab->toc_first_sec = NULL;
10136
}
10137
 
10138
/* The linker repeatedly calls this function for each TOC input section
10139
   and linker generated GOT section.  Group input bfds such that the toc
10140
   within a group is less than 64k in size.  */
10141
 
10142
bfd_boolean
10143
ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
10144
{
10145
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
10146
  bfd_vma addr, off, limit;
10147
 
10148
  if (htab == NULL)
10149
    return FALSE;
10150
 
10151
  if (!htab->second_toc_pass)
10152
    {
10153
      /* Keep track of the first .toc or .got section for this input bfd.  */
10154
      if (htab->toc_bfd != isec->owner)
10155
        {
10156
          htab->toc_bfd = isec->owner;
10157
          htab->toc_first_sec = isec;
10158
        }
10159
 
10160
      addr = isec->output_offset + isec->output_section->vma;
10161
      off = addr - htab->toc_curr;
10162
      limit = 0x80008000;
10163
      if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
10164
        limit = 0x10000;
10165
      if (off + isec->size > limit)
10166
        {
10167
          addr = (htab->toc_first_sec->output_offset
10168
                  + htab->toc_first_sec->output_section->vma);
10169
          htab->toc_curr = addr;
10170
        }
10171
 
10172
      /* toc_curr is the base address of this toc group.  Set elf_gp
10173
         for the input section to be the offset relative to the
10174
         output toc base plus 0x8000.  Making the input elf_gp an
10175
         offset allows us to move the toc as a whole without
10176
         recalculating input elf_gp.  */
10177
      off = htab->toc_curr - elf_gp (isec->output_section->owner);
10178
      off += TOC_BASE_OFF;
10179
 
10180
      /* Die if someone uses a linker script that doesn't keep input
10181
         file .toc and .got together.  */
10182
      if (elf_gp (isec->owner) != 0
10183
          && elf_gp (isec->owner) != off)
10184
        return FALSE;
10185
 
10186
      elf_gp (isec->owner) = off;
10187
      return TRUE;
10188
    }
10189
 
10190
  /* During the second pass toc_first_sec points to the start of
10191
     a toc group, and toc_curr is used to track the old elf_gp.
10192
     We use toc_bfd to ensure we only look at each bfd once.  */
10193
  if (htab->toc_bfd == isec->owner)
10194
    return TRUE;
10195
  htab->toc_bfd = isec->owner;
10196
 
10197
  if (htab->toc_first_sec == NULL
10198
      || htab->toc_curr != elf_gp (isec->owner))
10199
    {
10200
      htab->toc_curr = elf_gp (isec->owner);
10201
      htab->toc_first_sec = isec;
10202
    }
10203
  addr = (htab->toc_first_sec->output_offset
10204
          + htab->toc_first_sec->output_section->vma);
10205
  off = addr - elf_gp (isec->output_section->owner) + TOC_BASE_OFF;
10206
  elf_gp (isec->owner) = off;
10207
 
10208
  return TRUE;
10209
}
10210
 
10211
/* Called via elf_link_hash_traverse to merge GOT entries for global
10212
   symbol H.  */
10213
 
10214
static bfd_boolean
10215
merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
10216
{
10217
  if (h->root.type == bfd_link_hash_indirect)
10218
    return TRUE;
10219
 
10220
  if (h->root.type == bfd_link_hash_warning)
10221
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
10222
 
10223
  merge_got_entries (&h->got.glist);
10224
 
10225
  return TRUE;
10226
}
10227
 
10228
/* Called via elf_link_hash_traverse to allocate GOT entries for global
10229
   symbol H.  */
10230
 
10231
static bfd_boolean
10232
reallocate_got (struct elf_link_hash_entry *h, void *inf)
10233
{
10234
  struct got_entry *gent;
10235
 
10236
  if (h->root.type == bfd_link_hash_indirect)
10237
    return TRUE;
10238
 
10239
  if (h->root.type == bfd_link_hash_warning)
10240
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
10241
 
10242
  for (gent = h->got.glist; gent != NULL; gent = gent->next)
10243
    if (!gent->is_indirect)
10244
      allocate_got (h, (struct bfd_link_info *) inf, gent);
10245
  return TRUE;
10246
}
10247
 
10248
/* Called on the first multitoc pass after the last call to
10249
   ppc64_elf_next_toc_section.  This function removes duplicate GOT
10250
   entries.  */
10251
 
10252
bfd_boolean
10253
ppc64_elf_layout_multitoc (struct bfd_link_info *info)
10254
{
10255
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
10256
  struct bfd *ibfd, *ibfd2;
10257
  bfd_boolean done_something;
10258
 
10259
  htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
10260
 
10261
  if (!htab->do_multi_toc)
10262
    return FALSE;
10263
 
10264
  /* Merge global sym got entries within a toc group.  */
10265
  elf_link_hash_traverse (&htab->elf, merge_global_got, info);
10266
 
10267
  /* And tlsld_got.  */
10268
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10269
    {
10270
      struct got_entry *ent, *ent2;
10271
 
10272
      if (!is_ppc64_elf (ibfd))
10273
        continue;
10274
 
10275
      ent = ppc64_tlsld_got (ibfd);
10276
      if (!ent->is_indirect
10277
          && ent->got.offset != (bfd_vma) -1)
10278
        {
10279
          for (ibfd2 = ibfd->link_next; ibfd2 != NULL; ibfd2 = ibfd2->link_next)
10280
            {
10281
              if (!is_ppc64_elf (ibfd2))
10282
                continue;
10283
 
10284
              ent2 = ppc64_tlsld_got (ibfd2);
10285
              if (!ent2->is_indirect
10286
                  && ent2->got.offset != (bfd_vma) -1
10287
                  && elf_gp (ibfd2) == elf_gp (ibfd))
10288
                {
10289
                  ent2->is_indirect = TRUE;
10290
                  ent2->got.ent = ent;
10291
                }
10292
            }
10293
        }
10294
    }
10295
 
10296
  /* Zap sizes of got sections.  */
10297
  htab->reliplt->rawsize = htab->reliplt->size;
10298
  htab->reliplt->size -= htab->got_reli_size;
10299
  htab->got_reli_size = 0;
10300
 
10301
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10302
    {
10303
      asection *got, *relgot;
10304
 
10305
      if (!is_ppc64_elf (ibfd))
10306
        continue;
10307
 
10308
      got = ppc64_elf_tdata (ibfd)->got;
10309
      if (got != NULL)
10310
        {
10311
          got->rawsize = got->size;
10312
          got->size = 0;
10313
          relgot = ppc64_elf_tdata (ibfd)->relgot;
10314
          relgot->rawsize = relgot->size;
10315
          relgot->size = 0;
10316
        }
10317
    }
10318
 
10319
  /* Now reallocate the got, local syms first.  We don't need to
10320
     allocate section contents again since we never increase size.  */
10321
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10322
    {
10323
      struct got_entry **lgot_ents;
10324
      struct got_entry **end_lgot_ents;
10325
      struct plt_entry **local_plt;
10326
      struct plt_entry **end_local_plt;
10327
      unsigned char *lgot_masks;
10328
      bfd_size_type locsymcount;
10329
      Elf_Internal_Shdr *symtab_hdr;
10330
      asection *s, *srel;
10331
 
10332
      if (!is_ppc64_elf (ibfd))
10333
        continue;
10334
 
10335
      lgot_ents = elf_local_got_ents (ibfd);
10336
      if (!lgot_ents)
10337
        continue;
10338
 
10339
      symtab_hdr = &elf_symtab_hdr (ibfd);
10340
      locsymcount = symtab_hdr->sh_info;
10341
      end_lgot_ents = lgot_ents + locsymcount;
10342
      local_plt = (struct plt_entry **) end_lgot_ents;
10343
      end_local_plt = local_plt + locsymcount;
10344
      lgot_masks = (unsigned char *) end_local_plt;
10345
      s = ppc64_elf_tdata (ibfd)->got;
10346
      srel = ppc64_elf_tdata (ibfd)->relgot;
10347
      for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
10348
        {
10349
          struct got_entry *ent;
10350
 
10351
          for (ent = *lgot_ents; ent != NULL; ent = ent->next)
10352
            {
10353
              unsigned int num = 1;
10354
              ent->got.offset = s->size;
10355
              if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
10356
                num = 2;
10357
              s->size += num * 8;
10358
              if (info->shared)
10359
                srel->size += num * sizeof (Elf64_External_Rela);
10360
              else if ((*lgot_masks & PLT_IFUNC) != 0)
10361
                {
10362
                  htab->reliplt->size
10363
                    += num * sizeof (Elf64_External_Rela);
10364
                  htab->got_reli_size
10365
                    += num * sizeof (Elf64_External_Rela);
10366
                }
10367
            }
10368
        }
10369
    }
10370
 
10371
  elf_link_hash_traverse (&htab->elf, reallocate_got, info);
10372
 
10373
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10374
    {
10375
      struct got_entry *ent;
10376
 
10377
      if (!is_ppc64_elf (ibfd))
10378
        continue;
10379
 
10380
      ent = ppc64_tlsld_got (ibfd);
10381
      if (!ent->is_indirect
10382
          && ent->got.offset != (bfd_vma) -1)
10383
        {
10384
          asection *s = ppc64_elf_tdata (ibfd)->got;
10385
          ent->got.offset = s->size;
10386
          s->size += 16;
10387
          if (info->shared)
10388
            {
10389
              asection *srel = ppc64_elf_tdata (ibfd)->relgot;
10390
              srel->size += sizeof (Elf64_External_Rela);
10391
            }
10392
        }
10393
    }
10394
 
10395
  done_something = htab->reliplt->rawsize != htab->reliplt->size;
10396
  if (!done_something)
10397
    for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10398
      {
10399
        asection *got;
10400
 
10401
        if (!is_ppc64_elf (ibfd))
10402
          continue;
10403
 
10404
        got = ppc64_elf_tdata (ibfd)->got;
10405
        if (got != NULL)
10406
          {
10407
            done_something = got->rawsize != got->size;
10408
            if (done_something)
10409
              break;
10410
          }
10411
      }
10412
 
10413
  if (done_something)
10414
    (*htab->layout_sections_again) ();
10415
 
10416
  /* Set up for second pass over toc sections to recalculate elf_gp
10417
     on input sections.  */
10418
  htab->toc_bfd = NULL;
10419
  htab->toc_first_sec = NULL;
10420
  htab->second_toc_pass = TRUE;
10421
  return done_something;
10422
}
10423
 
10424
/* Called after second pass of multitoc partitioning.  */
10425
 
10426
void
10427
ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
10428
{
10429
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
10430
 
10431
  /* After the second pass, toc_curr tracks the TOC offset used
10432
     for code sections below in ppc64_elf_next_input_section.  */
10433
  htab->toc_curr = TOC_BASE_OFF;
10434
}
10435
 
10436
/* No toc references were found in ISEC.  If the code in ISEC makes no
10437
   calls, then there's no need to use toc adjusting stubs when branching
10438
   into ISEC.  Actually, indirect calls from ISEC are OK as they will
10439
   load r2.  Returns -1 on error, 0 for no stub needed, 1 for stub
10440
   needed, and 2 if a cyclical call-graph was found but no other reason
10441
   for a stub was detected.  If called from the top level, a return of
10442
   2 means the same as a return of 0.  */
10443
 
10444
static int
10445
toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
10446
{
10447
  int ret;
10448
 
10449
  /* Mark this section as checked.  */
10450
  isec->call_check_done = 1;
10451
 
10452
  /* We know none of our code bearing sections will need toc stubs.  */
10453
  if ((isec->flags & SEC_LINKER_CREATED) != 0)
10454
    return 0;
10455
 
10456
  if (isec->size == 0)
10457
    return 0;
10458
 
10459
  if (isec->output_section == NULL)
10460
    return 0;
10461
 
10462
  ret = 0;
10463
  if (isec->reloc_count != 0)
10464
    {
10465
      Elf_Internal_Rela *relstart, *rel;
10466
      Elf_Internal_Sym *local_syms;
10467
      struct ppc_link_hash_table *htab;
10468
 
10469
      relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
10470
                                            info->keep_memory);
10471
      if (relstart == NULL)
10472
        return -1;
10473
 
10474
      /* Look for branches to outside of this section.  */
10475
      local_syms = NULL;
10476
      htab = ppc_hash_table (info);
10477
      if (htab == NULL)
10478
        return -1;
10479
 
10480
      for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
10481
        {
10482
          enum elf_ppc64_reloc_type r_type;
10483
          unsigned long r_symndx;
10484
          struct elf_link_hash_entry *h;
10485
          struct ppc_link_hash_entry *eh;
10486
          Elf_Internal_Sym *sym;
10487
          asection *sym_sec;
10488
          struct _opd_sec_data *opd;
10489
          bfd_vma sym_value;
10490
          bfd_vma dest;
10491
 
10492
          r_type = ELF64_R_TYPE (rel->r_info);
10493
          if (r_type != R_PPC64_REL24
10494
              && r_type != R_PPC64_REL14
10495
              && r_type != R_PPC64_REL14_BRTAKEN
10496
              && r_type != R_PPC64_REL14_BRNTAKEN)
10497
            continue;
10498
 
10499
          r_symndx = ELF64_R_SYM (rel->r_info);
10500
          if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
10501
                          isec->owner))
10502
            {
10503
              ret = -1;
10504
              break;
10505
            }
10506
 
10507
          /* Calls to dynamic lib functions go through a plt call stub
10508
             that uses r2.  */
10509
          eh = (struct ppc_link_hash_entry *) h;
10510
          if (eh != NULL
10511
              && (eh->elf.plt.plist != NULL
10512
                  || (eh->oh != NULL
10513
                      && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
10514
            {
10515
              ret = 1;
10516
              break;
10517
            }
10518
 
10519
          if (sym_sec == NULL)
10520
            /* Ignore other undefined symbols.  */
10521
            continue;
10522
 
10523
          /* Assume branches to other sections not included in the
10524
             link need stubs too, to cover -R and absolute syms.  */
10525
          if (sym_sec->output_section == NULL)
10526
            {
10527
              ret = 1;
10528
              break;
10529
            }
10530
 
10531
          if (h == NULL)
10532
            sym_value = sym->st_value;
10533
          else
10534
            {
10535
              if (h->root.type != bfd_link_hash_defined
10536
                  && h->root.type != bfd_link_hash_defweak)
10537
                abort ();
10538
              sym_value = h->root.u.def.value;
10539
            }
10540
          sym_value += rel->r_addend;
10541
 
10542
          /* If this branch reloc uses an opd sym, find the code section.  */
10543
          opd = get_opd_info (sym_sec);
10544
          if (opd != NULL)
10545
            {
10546
              if (h == NULL && opd->adjust != NULL)
10547
                {
10548
                  long adjust;
10549
 
10550
                  adjust = opd->adjust[sym->st_value / 8];
10551
                  if (adjust == -1)
10552
                    /* Assume deleted functions won't ever be called.  */
10553
                    continue;
10554
                  sym_value += adjust;
10555
                }
10556
 
10557
              dest = opd_entry_value (sym_sec, sym_value, &sym_sec, NULL);
10558
              if (dest == (bfd_vma) -1)
10559
                continue;
10560
            }
10561
          else
10562
            dest = (sym_value
10563
                    + sym_sec->output_offset
10564
                    + sym_sec->output_section->vma);
10565
 
10566
          /* Ignore branch to self.  */
10567
          if (sym_sec == isec)
10568
            continue;
10569
 
10570
          /* If the called function uses the toc, we need a stub.  */
10571
          if (sym_sec->has_toc_reloc
10572
              || sym_sec->makes_toc_func_call)
10573
            {
10574
              ret = 1;
10575
              break;
10576
            }
10577
 
10578
          /* Assume any branch that needs a long branch stub might in fact
10579
             need a plt_branch stub.  A plt_branch stub uses r2.  */
10580
          else if (dest - (isec->output_offset
10581
                           + isec->output_section->vma
10582
                           + rel->r_offset) + (1 << 25) >= (2 << 25))
10583
            {
10584
              ret = 1;
10585
              break;
10586
            }
10587
 
10588
          /* If calling back to a section in the process of being
10589
             tested, we can't say for sure that no toc adjusting stubs
10590
             are needed, so don't return zero.  */
10591
          else if (sym_sec->call_check_in_progress)
10592
            ret = 2;
10593
 
10594
          /* Branches to another section that itself doesn't have any TOC
10595
             references are OK.  Recursively call ourselves to check.  */
10596
          else if (!sym_sec->call_check_done)
10597
            {
10598
              int recur;
10599
 
10600
              /* Mark current section as indeterminate, so that other
10601
                 sections that call back to current won't be marked as
10602
                 known.  */
10603
              isec->call_check_in_progress = 1;
10604
              recur = toc_adjusting_stub_needed (info, sym_sec);
10605
              isec->call_check_in_progress = 0;
10606
 
10607
              if (recur != 0)
10608
                {
10609
                  ret = recur;
10610
                  if (recur != 2)
10611
                    break;
10612
                }
10613
            }
10614
        }
10615
 
10616
      if (local_syms != NULL
10617
          && (elf_symtab_hdr (isec->owner).contents
10618
              != (unsigned char *) local_syms))
10619
        free (local_syms);
10620
      if (elf_section_data (isec)->relocs != relstart)
10621
        free (relstart);
10622
    }
10623
 
10624
  if ((ret & 1) == 0
10625
      && isec->map_head.s != NULL
10626
      && (strcmp (isec->output_section->name, ".init") == 0
10627
          || strcmp (isec->output_section->name, ".fini") == 0))
10628
    {
10629
      if (isec->map_head.s->has_toc_reloc
10630
          || isec->map_head.s->makes_toc_func_call)
10631
        ret = 1;
10632
      else if (!isec->map_head.s->call_check_done)
10633
        {
10634
          int recur;
10635
          isec->call_check_in_progress = 1;
10636
          recur = toc_adjusting_stub_needed (info, isec->map_head.s);
10637
          isec->call_check_in_progress = 0;
10638
          if (recur != 0)
10639
            ret = recur;
10640
        }
10641
    }
10642
 
10643
  if (ret == 1)
10644
    isec->makes_toc_func_call = 1;
10645
 
10646
  return ret;
10647
}
10648
 
10649
/* The linker repeatedly calls this function for each input section,
10650
   in the order that input sections are linked into output sections.
10651
   Build lists of input sections to determine groupings between which
10652
   we may insert linker stubs.  */
10653
 
10654
bfd_boolean
10655
ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
10656
{
10657
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
10658
 
10659
  if (htab == NULL)
10660
    return FALSE;
10661
 
10662
  if ((isec->output_section->flags & SEC_CODE) != 0
10663
      && isec->output_section->index <= htab->top_index)
10664
    {
10665
      asection **list = htab->input_list + isec->output_section->index;
10666
      /* Steal the link_sec pointer for our list.  */
10667
#define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
10668
      /* This happens to make the list in reverse order,
10669
         which is what we want.  */
10670
      PREV_SEC (isec) = *list;
10671
      *list = isec;
10672
    }
10673
 
10674
  if (htab->multi_toc_needed)
10675
    {
10676
      /* If a code section has a function that uses the TOC then we need
10677
         to use the right TOC (obviously).  Also, make sure that .opd gets
10678
         the correct TOC value for R_PPC64_TOC relocs that don't have or
10679
         can't find their function symbol (shouldn't ever happen now).
10680
         Also specially treat .fixup for the linux kernel.  .fixup
10681
         contains branches, but only back to the function that hit an
10682
         exception.  */
10683
      if (isec->has_toc_reloc
10684
          || (isec->flags & SEC_CODE) == 0
10685
          || strcmp (isec->name, ".fixup") == 0)
10686
        {
10687
          if (elf_gp (isec->owner) != 0)
10688
            htab->toc_curr = elf_gp (isec->owner);
10689
        }
10690
      else
10691
        {
10692
          if (!isec->call_check_done
10693
              && toc_adjusting_stub_needed (info, isec) < 0)
10694
            return FALSE;
10695
          /* If we make a local call from this section, ie. a branch
10696
             without a following nop, then we have no place to put a
10697
             toc restoring insn.  We must use the same toc group as
10698
             the callee.
10699
             Testing makes_toc_func_call actually tests for *any*
10700
             calls to functions that need a good toc pointer.  A more
10701
             precise test would be better, as this one will set
10702
             incorrect values for pasted .init/.fini fragments.
10703
             (Fixed later in check_pasted_section.)  */
10704
          if (isec->makes_toc_func_call
10705
              && elf_gp (isec->owner) != 0)
10706
            htab->toc_curr = elf_gp (isec->owner);
10707
        }
10708
    }
10709
 
10710
  /* Functions that don't use the TOC can belong in any TOC group.
10711
     Use the last TOC base.  */
10712
  htab->stub_group[isec->id].toc_off = htab->toc_curr;
10713
  return TRUE;
10714
}
10715
 
10716
/* Check that all .init and .fini sections use the same toc, if they
10717
   have toc relocs.  */
10718
 
10719
static bfd_boolean
10720
check_pasted_section (struct bfd_link_info *info, const char *name)
10721
{
10722
  asection *o = bfd_get_section_by_name (info->output_bfd, name);
10723
 
10724
  if (o != NULL)
10725
    {
10726
      struct ppc_link_hash_table *htab = ppc_hash_table (info);
10727
      bfd_vma toc_off = 0;
10728
      asection *i;
10729
 
10730
      for (i = o->map_head.s; i != NULL; i = i->map_head.s)
10731
        if (i->has_toc_reloc)
10732
          {
10733
            if (toc_off == 0)
10734
              toc_off = htab->stub_group[i->id].toc_off;
10735
            else if (toc_off != htab->stub_group[i->id].toc_off)
10736
              return FALSE;
10737
          }
10738
 
10739
      if (toc_off == 0)
10740
        for (i = o->map_head.s; i != NULL; i = i->map_head.s)
10741
          if (i->makes_toc_func_call)
10742
            {
10743
              toc_off = htab->stub_group[i->id].toc_off;
10744
              break;
10745
            }
10746
 
10747
      /* Make sure the whole pasted function uses the same toc offset.  */
10748
      if (toc_off != 0)
10749
        for (i = o->map_head.s; i != NULL; i = i->map_head.s)
10750
          htab->stub_group[i->id].toc_off = toc_off;
10751
    }
10752
  return TRUE;
10753
}
10754
 
10755
bfd_boolean
10756
ppc64_elf_check_init_fini (struct bfd_link_info *info)
10757
{
10758
  return (check_pasted_section (info, ".init")
10759
          & check_pasted_section (info, ".fini"));
10760
}
10761
 
10762
/* See whether we can group stub sections together.  Grouping stub
10763
   sections may result in fewer stubs.  More importantly, we need to
10764
   put all .init* and .fini* stubs at the beginning of the .init or
10765
   .fini output sections respectively, because glibc splits the
10766
   _init and _fini functions into multiple parts.  Putting a stub in
10767
   the middle of a function is not a good idea.  */
10768
 
10769
static void
10770
group_sections (struct ppc_link_hash_table *htab,
10771
                bfd_size_type stub_group_size,
10772
                bfd_boolean stubs_always_before_branch)
10773
{
10774
  asection **list;
10775
  bfd_size_type stub14_group_size;
10776
  bfd_boolean suppress_size_errors;
10777
 
10778
  suppress_size_errors = FALSE;
10779
  stub14_group_size = stub_group_size;
10780
  if (stub_group_size == 1)
10781
    {
10782
      /* Default values.  */
10783
      if (stubs_always_before_branch)
10784
        {
10785
          stub_group_size = 0x1e00000;
10786
          stub14_group_size = 0x7800;
10787
        }
10788
      else
10789
        {
10790
          stub_group_size = 0x1c00000;
10791
          stub14_group_size = 0x7000;
10792
        }
10793
      suppress_size_errors = TRUE;
10794
    }
10795
 
10796
  list = htab->input_list + htab->top_index;
10797
  do
10798
    {
10799
      asection *tail = *list;
10800
      while (tail != NULL)
10801
        {
10802
          asection *curr;
10803
          asection *prev;
10804
          bfd_size_type total;
10805
          bfd_boolean big_sec;
10806
          bfd_vma curr_toc;
10807
 
10808
          curr = tail;
10809
          total = tail->size;
10810
          big_sec = total > (ppc64_elf_section_data (tail) != NULL
10811
                             && ppc64_elf_section_data (tail)->has_14bit_branch
10812
                             ? stub14_group_size : stub_group_size);
10813
          if (big_sec && !suppress_size_errors)
10814
            (*_bfd_error_handler) (_("%B section %A exceeds stub group size"),
10815
                                     tail->owner, tail);
10816
          curr_toc = htab->stub_group[tail->id].toc_off;
10817
 
10818
          while ((prev = PREV_SEC (curr)) != NULL
10819
                 && ((total += curr->output_offset - prev->output_offset)
10820
                     < (ppc64_elf_section_data (prev) != NULL
10821
                        && ppc64_elf_section_data (prev)->has_14bit_branch
10822
                        ? stub14_group_size : stub_group_size))
10823
                 && htab->stub_group[prev->id].toc_off == curr_toc)
10824
            curr = prev;
10825
 
10826
          /* OK, the size from the start of CURR to the end is less
10827
             than stub_group_size and thus can be handled by one stub
10828
             section.  (or the tail section is itself larger than
10829
             stub_group_size, in which case we may be toast.)  We
10830
             should really be keeping track of the total size of stubs
10831
             added here, as stubs contribute to the final output
10832
             section size.  That's a little tricky, and this way will
10833
             only break if stubs added make the total size more than
10834
             2^25, ie. for the default stub_group_size, if stubs total
10835
             more than 2097152 bytes, or nearly 75000 plt call stubs.  */
10836
          do
10837
            {
10838
              prev = PREV_SEC (tail);
10839
              /* Set up this stub group.  */
10840
              htab->stub_group[tail->id].link_sec = curr;
10841
            }
10842
          while (tail != curr && (tail = prev) != NULL);
10843
 
10844
          /* But wait, there's more!  Input sections up to stub_group_size
10845
             bytes before the stub section can be handled by it too.
10846
             Don't do this if we have a really large section after the
10847
             stubs, as adding more stubs increases the chance that
10848
             branches may not reach into the stub section.  */
10849
          if (!stubs_always_before_branch && !big_sec)
10850
            {
10851
              total = 0;
10852
              while (prev != NULL
10853
                     && ((total += tail->output_offset - prev->output_offset)
10854
                         < (ppc64_elf_section_data (prev) != NULL
10855
                            && ppc64_elf_section_data (prev)->has_14bit_branch
10856
                            ? stub14_group_size : stub_group_size))
10857
                     && htab->stub_group[prev->id].toc_off == curr_toc)
10858
                {
10859
                  tail = prev;
10860
                  prev = PREV_SEC (tail);
10861
                  htab->stub_group[tail->id].link_sec = curr;
10862
                }
10863
            }
10864
          tail = prev;
10865
        }
10866
    }
10867
  while (list-- != htab->input_list);
10868
  free (htab->input_list);
10869
#undef PREV_SEC
10870
}
10871
 
10872
/* Determine and set the size of the stub section for a final link.
10873
 
10874
   The basic idea here is to examine all the relocations looking for
10875
   PC-relative calls to a target that is unreachable with a "bl"
10876
   instruction.  */
10877
 
10878
bfd_boolean
10879
ppc64_elf_size_stubs (struct bfd_link_info *info, bfd_signed_vma group_size)
10880
{
10881
  bfd_size_type stub_group_size;
10882
  bfd_boolean stubs_always_before_branch;
10883
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
10884
 
10885
  if (htab == NULL)
10886
    return FALSE;
10887
 
10888
  stubs_always_before_branch = group_size < 0;
10889
  if (group_size < 0)
10890
    stub_group_size = -group_size;
10891
  else
10892
    stub_group_size = group_size;
10893
 
10894
  group_sections (htab, stub_group_size, stubs_always_before_branch);
10895
 
10896
  while (1)
10897
    {
10898
      bfd *input_bfd;
10899
      unsigned int bfd_indx;
10900
      asection *stub_sec;
10901
 
10902
      htab->stub_iteration += 1;
10903
 
10904
      for (input_bfd = info->input_bfds, bfd_indx = 0;
10905
           input_bfd != NULL;
10906
           input_bfd = input_bfd->link_next, bfd_indx++)
10907
        {
10908
          Elf_Internal_Shdr *symtab_hdr;
10909
          asection *section;
10910
          Elf_Internal_Sym *local_syms = NULL;
10911
 
10912
          if (!is_ppc64_elf (input_bfd))
10913
            continue;
10914
 
10915
          /* We'll need the symbol table in a second.  */
10916
          symtab_hdr = &elf_symtab_hdr (input_bfd);
10917
          if (symtab_hdr->sh_info == 0)
10918
            continue;
10919
 
10920
          /* Walk over each section attached to the input bfd.  */
10921
          for (section = input_bfd->sections;
10922
               section != NULL;
10923
               section = section->next)
10924
            {
10925
              Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
10926
 
10927
              /* If there aren't any relocs, then there's nothing more
10928
                 to do.  */
10929
              if ((section->flags & SEC_RELOC) == 0
10930
                  || (section->flags & SEC_ALLOC) == 0
10931
                  || (section->flags & SEC_LOAD) == 0
10932
                  || (section->flags & SEC_CODE) == 0
10933
                  || section->reloc_count == 0)
10934
                continue;
10935
 
10936
              /* If this section is a link-once section that will be
10937
                 discarded, then don't create any stubs.  */
10938
              if (section->output_section == NULL
10939
                  || section->output_section->owner != info->output_bfd)
10940
                continue;
10941
 
10942
              /* Get the relocs.  */
10943
              internal_relocs
10944
                = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
10945
                                             info->keep_memory);
10946
              if (internal_relocs == NULL)
10947
                goto error_ret_free_local;
10948
 
10949
              /* Now examine each relocation.  */
10950
              irela = internal_relocs;
10951
              irelaend = irela + section->reloc_count;
10952
              for (; irela < irelaend; irela++)
10953
                {
10954
                  enum elf_ppc64_reloc_type r_type;
10955
                  unsigned int r_indx;
10956
                  enum ppc_stub_type stub_type;
10957
                  struct ppc_stub_hash_entry *stub_entry;
10958
                  asection *sym_sec, *code_sec;
10959
                  bfd_vma sym_value, code_value;
10960
                  bfd_vma destination;
10961
                  bfd_boolean ok_dest;
10962
                  struct ppc_link_hash_entry *hash;
10963
                  struct ppc_link_hash_entry *fdh;
10964
                  struct elf_link_hash_entry *h;
10965
                  Elf_Internal_Sym *sym;
10966
                  char *stub_name;
10967
                  const asection *id_sec;
10968
                  struct _opd_sec_data *opd;
10969
                  struct plt_entry *plt_ent;
10970
 
10971
                  r_type = ELF64_R_TYPE (irela->r_info);
10972
                  r_indx = ELF64_R_SYM (irela->r_info);
10973
 
10974
                  if (r_type >= R_PPC64_max)
10975
                    {
10976
                      bfd_set_error (bfd_error_bad_value);
10977
                      goto error_ret_free_internal;
10978
                    }
10979
 
10980
                  /* Only look for stubs on branch instructions.  */
10981
                  if (r_type != R_PPC64_REL24
10982
                      && r_type != R_PPC64_REL14
10983
                      && r_type != R_PPC64_REL14_BRTAKEN
10984
                      && r_type != R_PPC64_REL14_BRNTAKEN)
10985
                    continue;
10986
 
10987
                  /* Now determine the call target, its name, value,
10988
                     section.  */
10989
                  if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
10990
                                  r_indx, input_bfd))
10991
                    goto error_ret_free_internal;
10992
                  hash = (struct ppc_link_hash_entry *) h;
10993
 
10994
                  ok_dest = FALSE;
10995
                  fdh = NULL;
10996
                  sym_value = 0;
10997
                  if (hash == NULL)
10998
                    {
10999
                      sym_value = sym->st_value;
11000
                      ok_dest = TRUE;
11001
                    }
11002
                  else if (hash->elf.root.type == bfd_link_hash_defined
11003
                           || hash->elf.root.type == bfd_link_hash_defweak)
11004
                    {
11005
                      sym_value = hash->elf.root.u.def.value;
11006
                      if (sym_sec->output_section != NULL)
11007
                        ok_dest = TRUE;
11008
                    }
11009
                  else if (hash->elf.root.type == bfd_link_hash_undefweak
11010
                           || hash->elf.root.type == bfd_link_hash_undefined)
11011
                    {
11012
                      /* Recognise an old ABI func code entry sym, and
11013
                         use the func descriptor sym instead if it is
11014
                         defined.  */
11015
                      if (hash->elf.root.root.string[0] == '.'
11016
                          && (fdh = lookup_fdh (hash, htab)) != NULL)
11017
                        {
11018
                          if (fdh->elf.root.type == bfd_link_hash_defined
11019
                              || fdh->elf.root.type == bfd_link_hash_defweak)
11020
                            {
11021
                              sym_sec = fdh->elf.root.u.def.section;
11022
                              sym_value = fdh->elf.root.u.def.value;
11023
                              if (sym_sec->output_section != NULL)
11024
                                ok_dest = TRUE;
11025
                            }
11026
                          else
11027
                            fdh = NULL;
11028
                        }
11029
                    }
11030
                  else
11031
                    {
11032
                      bfd_set_error (bfd_error_bad_value);
11033
                      goto error_ret_free_internal;
11034
                    }
11035
 
11036
                  destination = 0;
11037
                  if (ok_dest)
11038
                    {
11039
                      sym_value += irela->r_addend;
11040
                      destination = (sym_value
11041
                                     + sym_sec->output_offset
11042
                                     + sym_sec->output_section->vma);
11043
                    }
11044
 
11045
                  code_sec = sym_sec;
11046
                  code_value = sym_value;
11047
                  opd = get_opd_info (sym_sec);
11048
                  if (opd != NULL)
11049
                    {
11050
                      bfd_vma dest;
11051
 
11052
                      if (hash == NULL && opd->adjust != NULL)
11053
                        {
11054
                          long adjust = opd->adjust[sym_value / 8];
11055
                          if (adjust == -1)
11056
                            continue;
11057
                          code_value += adjust;
11058
                          sym_value += adjust;
11059
                        }
11060
                      dest = opd_entry_value (sym_sec, sym_value,
11061
                                              &code_sec, &code_value);
11062
                      if (dest != (bfd_vma) -1)
11063
                        {
11064
                          destination = dest;
11065
                          if (fdh != NULL)
11066
                            {
11067
                              /* Fixup old ABI sym to point at code
11068
                                 entry.  */
11069
                              hash->elf.root.type = bfd_link_hash_defweak;
11070
                              hash->elf.root.u.def.section = code_sec;
11071
                              hash->elf.root.u.def.value = code_value;
11072
                            }
11073
                        }
11074
                    }
11075
 
11076
                  /* Determine what (if any) linker stub is needed.  */
11077
                  plt_ent = NULL;
11078
                  stub_type = ppc_type_of_stub (section, irela, &hash,
11079
                                                &plt_ent, destination);
11080
 
11081
                  if (stub_type != ppc_stub_plt_call)
11082
                    {
11083
                      /* Check whether we need a TOC adjusting stub.
11084
                         Since the linker pastes together pieces from
11085
                         different object files when creating the
11086
                         _init and _fini functions, it may be that a
11087
                         call to what looks like a local sym is in
11088
                         fact a call needing a TOC adjustment.  */
11089
                      if (code_sec != NULL
11090
                          && code_sec->output_section != NULL
11091
                          && (htab->stub_group[code_sec->id].toc_off
11092
                              != htab->stub_group[section->id].toc_off)
11093
                          && (code_sec->has_toc_reloc
11094
                              || code_sec->makes_toc_func_call))
11095
                        stub_type = ppc_stub_long_branch_r2off;
11096
                    }
11097
 
11098
                  if (stub_type == ppc_stub_none)
11099
                    continue;
11100
 
11101
                  /* __tls_get_addr calls might be eliminated.  */
11102
                  if (stub_type != ppc_stub_plt_call
11103
                      && hash != NULL
11104
                      && (hash == htab->tls_get_addr
11105
                          || hash == htab->tls_get_addr_fd)
11106
                      && section->has_tls_reloc
11107
                      && irela != internal_relocs)
11108
                    {
11109
                      /* Get tls info.  */
11110
                      unsigned char *tls_mask;
11111
 
11112
                      if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
11113
                                         irela - 1, input_bfd))
11114
                        goto error_ret_free_internal;
11115
                      if (*tls_mask != 0)
11116
                        continue;
11117
                    }
11118
 
11119
                  /* Support for grouping stub sections.  */
11120
                  id_sec = htab->stub_group[section->id].link_sec;
11121
 
11122
                  /* Get the name of this stub.  */
11123
                  stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
11124
                  if (!stub_name)
11125
                    goto error_ret_free_internal;
11126
 
11127
                  stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
11128
                                                     stub_name, FALSE, FALSE);
11129
                  if (stub_entry != NULL)
11130
                    {
11131
                      /* The proper stub has already been created.  */
11132
                      free (stub_name);
11133
                      continue;
11134
                    }
11135
 
11136
                  stub_entry = ppc_add_stub (stub_name, section, info);
11137
                  if (stub_entry == NULL)
11138
                    {
11139
                      free (stub_name);
11140
                    error_ret_free_internal:
11141
                      if (elf_section_data (section)->relocs == NULL)
11142
                        free (internal_relocs);
11143
                    error_ret_free_local:
11144
                      if (local_syms != NULL
11145
                          && (symtab_hdr->contents
11146
                              != (unsigned char *) local_syms))
11147
                        free (local_syms);
11148
                      return FALSE;
11149
                    }
11150
 
11151
                  stub_entry->stub_type = stub_type;
11152
                  if (stub_type != ppc_stub_plt_call)
11153
                    {
11154
                      stub_entry->target_value = code_value;
11155
                      stub_entry->target_section = code_sec;
11156
                    }
11157
                  else
11158
                    {
11159
                      stub_entry->target_value = sym_value;
11160
                      stub_entry->target_section = sym_sec;
11161
                    }
11162
                  stub_entry->h = hash;
11163
                  stub_entry->plt_ent = plt_ent;
11164
                  stub_entry->addend = irela->r_addend;
11165
 
11166
                  if (stub_entry->h != NULL)
11167
                    htab->stub_globals += 1;
11168
                }
11169
 
11170
              /* We're done with the internal relocs, free them.  */
11171
              if (elf_section_data (section)->relocs != internal_relocs)
11172
                free (internal_relocs);
11173
            }
11174
 
11175
          if (local_syms != NULL
11176
              && symtab_hdr->contents != (unsigned char *) local_syms)
11177
            {
11178
              if (!info->keep_memory)
11179
                free (local_syms);
11180
              else
11181
                symtab_hdr->contents = (unsigned char *) local_syms;
11182
            }
11183
        }
11184
 
11185
      /* We may have added some stubs.  Find out the new size of the
11186
         stub sections.  */
11187
      for (stub_sec = htab->stub_bfd->sections;
11188
           stub_sec != NULL;
11189
           stub_sec = stub_sec->next)
11190
        if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
11191
          {
11192
            stub_sec->rawsize = stub_sec->size;
11193
            stub_sec->size = 0;
11194
            stub_sec->reloc_count = 0;
11195
            stub_sec->flags &= ~SEC_RELOC;
11196
          }
11197
 
11198
      htab->brlt->size = 0;
11199
      htab->brlt->reloc_count = 0;
11200
      htab->brlt->flags &= ~SEC_RELOC;
11201
      if (htab->relbrlt != NULL)
11202
        htab->relbrlt->size = 0;
11203
 
11204
      bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
11205
 
11206
      if (info->emitrelocations
11207
          && htab->glink != NULL && htab->glink->size != 0)
11208
        {
11209
          htab->glink->reloc_count = 1;
11210
          htab->glink->flags |= SEC_RELOC;
11211
        }
11212
 
11213
      for (stub_sec = htab->stub_bfd->sections;
11214
           stub_sec != NULL;
11215
           stub_sec = stub_sec->next)
11216
        if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
11217
            && stub_sec->rawsize != stub_sec->size)
11218
          break;
11219
 
11220
      /* Exit from this loop when no stubs have been added, and no stubs
11221
         have changed size.  */
11222
      if (stub_sec == NULL)
11223
        break;
11224
 
11225
      /* Ask the linker to do its stuff.  */
11226
      (*htab->layout_sections_again) ();
11227
    }
11228
 
11229
  /* It would be nice to strip htab->brlt from the output if the
11230
     section is empty, but it's too late.  If we strip sections here,
11231
     the dynamic symbol table is corrupted since the section symbol
11232
     for the stripped section isn't written.  */
11233
 
11234
  return TRUE;
11235
}
11236
 
11237
/* Called after we have determined section placement.  If sections
11238
   move, we'll be called again.  Provide a value for TOCstart.  */
11239
 
11240
bfd_vma
11241
ppc64_elf_toc (bfd *obfd)
11242
{
11243
  asection *s;
11244
  bfd_vma TOCstart;
11245
 
11246
  /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
11247
     order.  The TOC starts where the first of these sections starts.  */
11248
  s = bfd_get_section_by_name (obfd, ".got");
11249
  if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
11250
    s = bfd_get_section_by_name (obfd, ".toc");
11251
  if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
11252
    s = bfd_get_section_by_name (obfd, ".tocbss");
11253
  if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
11254
    s = bfd_get_section_by_name (obfd, ".plt");
11255
  if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
11256
    {
11257
      /* This may happen for
11258
         o  references to TOC base (SYM@toc / TOC[tc0]) without a
11259
         .toc directive
11260
         o  bad linker script
11261
         o --gc-sections and empty TOC sections
11262
 
11263
         FIXME: Warn user?  */
11264
 
11265
      /* Look for a likely section.  We probably won't even be
11266
         using TOCstart.  */
11267
      for (s = obfd->sections; s != NULL; s = s->next)
11268
        if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
11269
                         | SEC_EXCLUDE))
11270
            == (SEC_ALLOC | SEC_SMALL_DATA))
11271
          break;
11272
      if (s == NULL)
11273
        for (s = obfd->sections; s != NULL; s = s->next)
11274
          if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
11275
              == (SEC_ALLOC | SEC_SMALL_DATA))
11276
            break;
11277
      if (s == NULL)
11278
        for (s = obfd->sections; s != NULL; s = s->next)
11279
          if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
11280
              == SEC_ALLOC)
11281
            break;
11282
      if (s == NULL)
11283
        for (s = obfd->sections; s != NULL; s = s->next)
11284
          if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
11285
            break;
11286
    }
11287
 
11288
  TOCstart = 0;
11289
  if (s != NULL)
11290
    TOCstart = s->output_section->vma + s->output_offset;
11291
 
11292
  return TOCstart;
11293
}
11294
 
11295
/* Build all the stubs associated with the current output file.
11296
   The stubs are kept in a hash table attached to the main linker
11297
   hash table.  This function is called via gldelf64ppc_finish.  */
11298
 
11299
bfd_boolean
11300
ppc64_elf_build_stubs (bfd_boolean emit_stub_syms,
11301
                       struct bfd_link_info *info,
11302
                       char **stats)
11303
{
11304
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
11305
  asection *stub_sec;
11306
  bfd_byte *p;
11307
  int stub_sec_count = 0;
11308
 
11309
  if (htab == NULL)
11310
    return FALSE;
11311
 
11312
  htab->emit_stub_syms = emit_stub_syms;
11313
 
11314
  /* Allocate memory to hold the linker stubs.  */
11315
  for (stub_sec = htab->stub_bfd->sections;
11316
       stub_sec != NULL;
11317
       stub_sec = stub_sec->next)
11318
    if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
11319
        && stub_sec->size != 0)
11320
      {
11321
        stub_sec->contents = bfd_zalloc (htab->stub_bfd, stub_sec->size);
11322
        if (stub_sec->contents == NULL)
11323
          return FALSE;
11324
        /* We want to check that built size is the same as calculated
11325
           size.  rawsize is a convenient location to use.  */
11326
        stub_sec->rawsize = stub_sec->size;
11327
        stub_sec->size = 0;
11328
      }
11329
 
11330
  if (htab->glink != NULL && htab->glink->size != 0)
11331
    {
11332
      unsigned int indx;
11333
      bfd_vma plt0;
11334
 
11335
      /* Build the .glink plt call stub.  */
11336
      if (htab->emit_stub_syms)
11337
        {
11338
          struct elf_link_hash_entry *h;
11339
          h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
11340
                                    TRUE, FALSE, FALSE);
11341
          if (h == NULL)
11342
            return FALSE;
11343
          if (h->root.type == bfd_link_hash_new)
11344
            {
11345
              h->root.type = bfd_link_hash_defined;
11346
              h->root.u.def.section = htab->glink;
11347
              h->root.u.def.value = 8;
11348
              h->ref_regular = 1;
11349
              h->def_regular = 1;
11350
              h->ref_regular_nonweak = 1;
11351
              h->forced_local = 1;
11352
              h->non_elf = 0;
11353
            }
11354
        }
11355
      plt0 = htab->plt->output_section->vma + htab->plt->output_offset - 16;
11356
      if (info->emitrelocations)
11357
        {
11358
          Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
11359
          if (r == NULL)
11360
            return FALSE;
11361
          r->r_offset = (htab->glink->output_offset
11362
                         + htab->glink->output_section->vma);
11363
          r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
11364
          r->r_addend = plt0;
11365
        }
11366
      p = htab->glink->contents;
11367
      plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
11368
      bfd_put_64 (htab->glink->owner, plt0, p);
11369
      p += 8;
11370
      bfd_put_32 (htab->glink->owner, MFLR_R12, p);
11371
      p += 4;
11372
      bfd_put_32 (htab->glink->owner, BCL_20_31, p);
11373
      p += 4;
11374
      bfd_put_32 (htab->glink->owner, MFLR_R11, p);
11375
      p += 4;
11376
      bfd_put_32 (htab->glink->owner, LD_R2_M16R11, p);
11377
      p += 4;
11378
      bfd_put_32 (htab->glink->owner, MTLR_R12, p);
11379
      p += 4;
11380
      bfd_put_32 (htab->glink->owner, ADD_R12_R2_R11, p);
11381
      p += 4;
11382
      bfd_put_32 (htab->glink->owner, LD_R11_0R12, p);
11383
      p += 4;
11384
      bfd_put_32 (htab->glink->owner, LD_R2_0R12 | 8, p);
11385
      p += 4;
11386
      bfd_put_32 (htab->glink->owner, MTCTR_R11, p);
11387
      p += 4;
11388
      bfd_put_32 (htab->glink->owner, LD_R11_0R12 | 16, p);
11389
      p += 4;
11390
      bfd_put_32 (htab->glink->owner, BCTR, p);
11391
      p += 4;
11392
      while (p - htab->glink->contents < GLINK_CALL_STUB_SIZE)
11393
        {
11394
          bfd_put_32 (htab->glink->owner, NOP, p);
11395
          p += 4;
11396
        }
11397
 
11398
      /* Build the .glink lazy link call stubs.  */
11399
      indx = 0;
11400
      while (p < htab->glink->contents + htab->glink->size)
11401
        {
11402
          if (indx < 0x8000)
11403
            {
11404
              bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
11405
              p += 4;
11406
            }
11407
          else
11408
            {
11409
              bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
11410
              p += 4;
11411
              bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx), p);
11412
              p += 4;
11413
            }
11414
          bfd_put_32 (htab->glink->owner,
11415
                      B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
11416
          indx++;
11417
          p += 4;
11418
        }
11419
      htab->glink->rawsize = p - htab->glink->contents;
11420
    }
11421
 
11422
  if (htab->brlt->size != 0)
11423
    {
11424
      htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
11425
                                         htab->brlt->size);
11426
      if (htab->brlt->contents == NULL)
11427
        return FALSE;
11428
    }
11429
  if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
11430
    {
11431
      htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
11432
                                            htab->relbrlt->size);
11433
      if (htab->relbrlt->contents == NULL)
11434
        return FALSE;
11435
    }
11436
 
11437
  /* Build the stubs as directed by the stub hash table.  */
11438
  bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
11439
 
11440
  if (htab->relbrlt != NULL)
11441
    htab->relbrlt->reloc_count = 0;
11442
 
11443
  for (stub_sec = htab->stub_bfd->sections;
11444
       stub_sec != NULL;
11445
       stub_sec = stub_sec->next)
11446
    if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
11447
      {
11448
        stub_sec_count += 1;
11449
        if (stub_sec->rawsize != stub_sec->size)
11450
          break;
11451
      }
11452
 
11453
  if (stub_sec != NULL
11454
      || htab->glink->rawsize != htab->glink->size)
11455
    {
11456
      htab->stub_error = TRUE;
11457
      info->callbacks->einfo (_("stubs don't match calculated size\n"));
11458
    }
11459
 
11460
  if (htab->stub_error)
11461
    return FALSE;
11462
 
11463
  if (stats != NULL)
11464
    {
11465
      *stats = bfd_malloc (500);
11466
      if (*stats == NULL)
11467
        return FALSE;
11468
 
11469
      sprintf (*stats, _("linker stubs in %u group%s\n"
11470
                         "  branch       %lu\n"
11471
                         "  toc adjust   %lu\n"
11472
                         "  long branch  %lu\n"
11473
                         "  long toc adj %lu\n"
11474
                         "  plt call     %lu"),
11475
               stub_sec_count,
11476
               stub_sec_count == 1 ? "" : "s",
11477
               htab->stub_count[ppc_stub_long_branch - 1],
11478
               htab->stub_count[ppc_stub_long_branch_r2off - 1],
11479
               htab->stub_count[ppc_stub_plt_branch - 1],
11480
               htab->stub_count[ppc_stub_plt_branch_r2off - 1],
11481
               htab->stub_count[ppc_stub_plt_call - 1]);
11482
    }
11483
  return TRUE;
11484
}
11485
 
11486
/* This function undoes the changes made by add_symbol_adjust.  */
11487
 
11488
static bfd_boolean
11489
undo_symbol_twiddle (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
11490
{
11491
  struct ppc_link_hash_entry *eh;
11492
 
11493
  if (h->root.type == bfd_link_hash_indirect)
11494
    return TRUE;
11495
 
11496
  if (h->root.type == bfd_link_hash_warning)
11497
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
11498
 
11499
  eh = (struct ppc_link_hash_entry *) h;
11500
  if (eh->elf.root.type != bfd_link_hash_undefweak || !eh->was_undefined)
11501
    return TRUE;
11502
 
11503
  eh->elf.root.type = bfd_link_hash_undefined;
11504
  return TRUE;
11505
}
11506
 
11507
void
11508
ppc64_elf_restore_symbols (struct bfd_link_info *info)
11509
{
11510
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
11511
 
11512
  if (htab != NULL)
11513
    elf_link_hash_traverse (&htab->elf, undo_symbol_twiddle, info);
11514
}
11515
 
11516
/* What to do when ld finds relocations against symbols defined in
11517
   discarded sections.  */
11518
 
11519
static unsigned int
11520
ppc64_elf_action_discarded (asection *sec)
11521
{
11522
  if (strcmp (".opd", sec->name) == 0)
11523
    return 0;
11524
 
11525
  if (strcmp (".toc", sec->name) == 0)
11526
    return 0;
11527
 
11528
  if (strcmp (".toc1", sec->name) == 0)
11529
    return 0;
11530
 
11531
  return _bfd_elf_default_action_discarded (sec);
11532
}
11533
 
11534
/* REL points to a low-part reloc on a largetoc instruction sequence.
11535
   Find the matching high-part reloc instruction and verify that it
11536
   is addis REG,x,imm.  If so, set *REG to x and return a pointer to
11537
   the high-part reloc.  */
11538
 
11539
static const Elf_Internal_Rela *
11540
ha_reloc_match (const Elf_Internal_Rela *relocs,
11541
                const Elf_Internal_Rela *rel,
11542
                unsigned int *reg,
11543
                bfd_boolean match_addend,
11544
                const bfd *input_bfd,
11545
                const bfd_byte *contents)
11546
{
11547
  enum elf_ppc64_reloc_type r_type, r_type_ha;
11548
  bfd_vma r_info_ha, r_addend;
11549
 
11550
  r_type = ELF64_R_TYPE (rel->r_info);
11551
  switch (r_type)
11552
    {
11553
    case R_PPC64_GOT_TLSLD16_LO:
11554
    case R_PPC64_GOT_TLSGD16_LO:
11555
    case R_PPC64_GOT_TPREL16_LO_DS:
11556
    case R_PPC64_GOT_DTPREL16_LO_DS:
11557
    case R_PPC64_GOT16_LO:
11558
    case R_PPC64_TOC16_LO:
11559
      r_type_ha = r_type + 2;
11560
      break;
11561
    case R_PPC64_GOT16_LO_DS:
11562
      r_type_ha = R_PPC64_GOT16_HA;
11563
      break;
11564
    case R_PPC64_TOC16_LO_DS:
11565
      r_type_ha = R_PPC64_TOC16_HA;
11566
      break;
11567
    default:
11568
      abort ();
11569
    }
11570
  r_info_ha = ELF64_R_INFO (ELF64_R_SYM (rel->r_info), r_type_ha);
11571
  r_addend = rel->r_addend;
11572
 
11573
  while (--rel >= relocs)
11574
    if (rel->r_info == r_info_ha
11575
        && (!match_addend
11576
            || rel->r_addend == r_addend))
11577
      {
11578
        const bfd_byte *p = contents + (rel->r_offset & ~3);
11579
        unsigned int insn = bfd_get_32 (input_bfd, p);
11580
        if ((insn & (0x3f << 26)) == (15u << 26) /* addis rt,x,imm */
11581
            && (insn & (0x1f << 21)) == (*reg << 21))
11582
          {
11583
            *reg = (insn >> 16) & 0x1f;
11584
            return rel;
11585
          }
11586
        break;
11587
      }
11588
  return NULL;
11589
}
11590
 
11591
/* The RELOCATE_SECTION function is called by the ELF backend linker
11592
   to handle the relocations for a section.
11593
 
11594
   The relocs are always passed as Rela structures; if the section
11595
   actually uses Rel structures, the r_addend field will always be
11596
   zero.
11597
 
11598
   This function is responsible for adjust the section contents as
11599
   necessary, and (if using Rela relocs and generating a
11600
   relocatable output file) adjusting the reloc addend as
11601
   necessary.
11602
 
11603
   This function does not have to worry about setting the reloc
11604
   address or the reloc symbol index.
11605
 
11606
   LOCAL_SYMS is a pointer to the swapped in local symbols.
11607
 
11608
   LOCAL_SECTIONS is an array giving the section in the input file
11609
   corresponding to the st_shndx field of each local symbol.
11610
 
11611
   The global hash table entry for the global symbols can be found
11612
   via elf_sym_hashes (input_bfd).
11613
 
11614
   When generating relocatable output, this function must handle
11615
   STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
11616
   going to be the section symbol corresponding to the output
11617
   section, which means that the addend must be adjusted
11618
   accordingly.  */
11619
 
11620
static bfd_boolean
11621
ppc64_elf_relocate_section (bfd *output_bfd,
11622
                            struct bfd_link_info *info,
11623
                            bfd *input_bfd,
11624
                            asection *input_section,
11625
                            bfd_byte *contents,
11626
                            Elf_Internal_Rela *relocs,
11627
                            Elf_Internal_Sym *local_syms,
11628
                            asection **local_sections)
11629
{
11630
  struct ppc_link_hash_table *htab;
11631
  Elf_Internal_Shdr *symtab_hdr;
11632
  struct elf_link_hash_entry **sym_hashes;
11633
  Elf_Internal_Rela *rel;
11634
  Elf_Internal_Rela *relend;
11635
  Elf_Internal_Rela outrel;
11636
  bfd_byte *loc;
11637
  struct got_entry **local_got_ents;
11638
  unsigned char *ha_opt;
11639
  bfd_vma TOCstart;
11640
  bfd_boolean no_ha_opt;
11641
  bfd_boolean ret = TRUE;
11642
  bfd_boolean is_opd;
11643
  /* Disabled until we sort out how ld should choose 'y' vs 'at'.  */
11644
  bfd_boolean is_power4 = FALSE;
11645
  bfd_vma d_offset = (bfd_big_endian (output_bfd) ? 2 : 0);
11646
 
11647
  /* Initialize howto table if needed.  */
11648
  if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
11649
    ppc_howto_init ();
11650
 
11651
  htab = ppc_hash_table (info);
11652
  if (htab == NULL)
11653
    return FALSE;
11654
 
11655
  /* Don't relocate stub sections.  */
11656
  if (input_section->owner == htab->stub_bfd)
11657
    return TRUE;
11658
 
11659
  BFD_ASSERT (is_ppc64_elf (input_bfd));
11660
 
11661
  local_got_ents = elf_local_got_ents (input_bfd);
11662
  TOCstart = elf_gp (output_bfd);
11663
  symtab_hdr = &elf_symtab_hdr (input_bfd);
11664
  sym_hashes = elf_sym_hashes (input_bfd);
11665
  is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
11666
  ha_opt = NULL;
11667
  no_ha_opt = FALSE;
11668
 
11669
  rel = relocs;
11670
  relend = relocs + input_section->reloc_count;
11671
  for (; rel < relend; rel++)
11672
    {
11673
      enum elf_ppc64_reloc_type r_type;
11674
      bfd_vma addend, orig_addend;
11675
      bfd_reloc_status_type r;
11676
      Elf_Internal_Sym *sym;
11677
      asection *sec;
11678
      struct elf_link_hash_entry *h_elf;
11679
      struct ppc_link_hash_entry *h;
11680
      struct ppc_link_hash_entry *fdh;
11681
      const char *sym_name;
11682
      unsigned long r_symndx, toc_symndx;
11683
      bfd_vma toc_addend;
11684
      unsigned char tls_mask, tls_gd, tls_type;
11685
      unsigned char sym_type;
11686
      bfd_vma relocation;
11687
      bfd_boolean unresolved_reloc;
11688
      bfd_boolean warned;
11689
      unsigned int insn;
11690
      unsigned int mask;
11691
      struct ppc_stub_hash_entry *stub_entry;
11692
      bfd_vma max_br_offset;
11693
      bfd_vma from;
11694
 
11695
      r_type = ELF64_R_TYPE (rel->r_info);
11696
      r_symndx = ELF64_R_SYM (rel->r_info);
11697
 
11698
      /* For old style R_PPC64_TOC relocs with a zero symbol, use the
11699
         symbol of the previous ADDR64 reloc.  The symbol gives us the
11700
         proper TOC base to use.  */
11701
      if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
11702
          && rel != relocs
11703
          && ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_ADDR64
11704
          && is_opd)
11705
        r_symndx = ELF64_R_SYM (rel[-1].r_info);
11706
 
11707
      sym = NULL;
11708
      sec = NULL;
11709
      h_elf = NULL;
11710
      sym_name = NULL;
11711
      unresolved_reloc = FALSE;
11712
      warned = FALSE;
11713
      orig_addend = rel->r_addend;
11714
 
11715
      if (r_symndx < symtab_hdr->sh_info)
11716
        {
11717
          /* It's a local symbol.  */
11718
          struct _opd_sec_data *opd;
11719
 
11720
          sym = local_syms + r_symndx;
11721
          sec = local_sections[r_symndx];
11722
          sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
11723
          sym_type = ELF64_ST_TYPE (sym->st_info);
11724
          relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
11725
          opd = get_opd_info (sec);
11726
          if (opd != NULL && opd->adjust != NULL)
11727
            {
11728
              long adjust = opd->adjust[(sym->st_value + rel->r_addend) / 8];
11729
              if (adjust == -1)
11730
                relocation = 0;
11731
              else
11732
                {
11733
                  /* If this is a relocation against the opd section sym
11734
                     and we have edited .opd, adjust the reloc addend so
11735
                     that ld -r and ld --emit-relocs output is correct.
11736
                     If it is a reloc against some other .opd symbol,
11737
                     then the symbol value will be adjusted later.  */
11738
                  if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
11739
                    rel->r_addend += adjust;
11740
                  else
11741
                    relocation += adjust;
11742
                }
11743
            }
11744
        }
11745
      else
11746
        {
11747
          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
11748
                                   r_symndx, symtab_hdr, sym_hashes,
11749
                                   h_elf, sec, relocation,
11750
                                   unresolved_reloc, warned);
11751
          sym_name = h_elf->root.root.string;
11752
          sym_type = h_elf->type;
11753
        }
11754
      h = (struct ppc_link_hash_entry *) h_elf;
11755
 
11756
      if (sec != NULL && elf_discarded_section (sec))
11757
        RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
11758
                                         rel, relend,
11759
                                         ppc64_elf_howto_table[r_type],
11760
                                         contents);
11761
 
11762
      if (info->relocatable)
11763
        continue;
11764
 
11765
      /* TLS optimizations.  Replace instruction sequences and relocs
11766
         based on information we collected in tls_optimize.  We edit
11767
         RELOCS so that --emit-relocs will output something sensible
11768
         for the final instruction stream.  */
11769
      tls_mask = 0;
11770
      tls_gd = 0;
11771
      toc_symndx = 0;
11772
      if (h != NULL)
11773
        tls_mask = h->tls_mask;
11774
      else if (local_got_ents != NULL)
11775
        {
11776
          struct plt_entry **local_plt = (struct plt_entry **)
11777
            (local_got_ents + symtab_hdr->sh_info);
11778
          unsigned char *lgot_masks = (unsigned char *)
11779
            (local_plt + symtab_hdr->sh_info);
11780
          tls_mask = lgot_masks[r_symndx];
11781
        }
11782
      if (tls_mask == 0
11783
          && (r_type == R_PPC64_TLS
11784
              || r_type == R_PPC64_TLSGD
11785
              || r_type == R_PPC64_TLSLD))
11786
        {
11787
          /* Check for toc tls entries.  */
11788
          unsigned char *toc_tls;
11789
 
11790
          if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
11791
                             &local_syms, rel, input_bfd))
11792
            return FALSE;
11793
 
11794
          if (toc_tls)
11795
            tls_mask = *toc_tls;
11796
        }
11797
 
11798
      /* Check that tls relocs are used with tls syms, and non-tls
11799
         relocs are used with non-tls syms.  */
11800
      if (r_symndx != STN_UNDEF
11801
          && r_type != R_PPC64_NONE
11802
          && (h == NULL
11803
              || h->elf.root.type == bfd_link_hash_defined
11804
              || h->elf.root.type == bfd_link_hash_defweak)
11805
          && (IS_PPC64_TLS_RELOC (r_type)
11806
              != (sym_type == STT_TLS
11807
                  || (sym_type == STT_SECTION
11808
                      && (sec->flags & SEC_THREAD_LOCAL) != 0))))
11809
        {
11810
          if (tls_mask != 0
11811
              && (r_type == R_PPC64_TLS
11812
                  || r_type == R_PPC64_TLSGD
11813
                  || r_type == R_PPC64_TLSLD))
11814
            /* R_PPC64_TLS is OK against a symbol in the TOC.  */
11815
            ;
11816
          else
11817
            info->callbacks->einfo
11818
              (!IS_PPC64_TLS_RELOC (r_type)
11819
               ? _("%H: %s used with TLS symbol %s\n")
11820
               : _("%H: %s used with non-TLS symbol %s\n"),
11821
               input_bfd, input_section, rel->r_offset,
11822
               ppc64_elf_howto_table[r_type]->name,
11823
               sym_name);
11824
        }
11825
 
11826
      /* Ensure reloc mapping code below stays sane.  */
11827
      if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
11828
          || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
11829
          || (R_PPC64_GOT_TLSLD16 & 3)    != (R_PPC64_GOT_TLSGD16 & 3)
11830
          || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
11831
          || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
11832
          || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
11833
          || (R_PPC64_GOT_TLSLD16 & 3)    != (R_PPC64_GOT_TPREL16_DS & 3)
11834
          || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
11835
          || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
11836
          || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
11837
        abort ();
11838
 
11839
      switch (r_type)
11840
        {
11841
        default:
11842
          break;
11843
 
11844
        case R_PPC64_LO_DS_OPT:
11845
          insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
11846
          if ((insn & (0x3f << 26)) != 58u << 26)
11847
            abort ();
11848
          insn += (14u << 26) - (58u << 26);
11849
          bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
11850
          r_type = R_PPC64_TOC16_LO;
11851
          rel->r_info = ELF64_R_INFO (r_symndx, r_type);
11852
          break;
11853
 
11854
        case R_PPC64_TOC16:
11855
        case R_PPC64_TOC16_LO:
11856
        case R_PPC64_TOC16_DS:
11857
        case R_PPC64_TOC16_LO_DS:
11858
          {
11859
            /* Check for toc tls entries.  */
11860
            unsigned char *toc_tls;
11861
            int retval;
11862
 
11863
            retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
11864
                                   &local_syms, rel, input_bfd);
11865
            if (retval == 0)
11866
              return FALSE;
11867
 
11868
            if (toc_tls)
11869
              {
11870
                tls_mask = *toc_tls;
11871
                if (r_type == R_PPC64_TOC16_DS
11872
                    || r_type == R_PPC64_TOC16_LO_DS)
11873
                  {
11874
                    if (tls_mask != 0
11875
                        && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
11876
                      goto toctprel;
11877
                  }
11878
                else
11879
                  {
11880
                    /* If we found a GD reloc pair, then we might be
11881
                       doing a GD->IE transition.  */
11882
                    if (retval == 2)
11883
                      {
11884
                        tls_gd = TLS_TPRELGD;
11885
                        if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
11886
                          goto tls_ldgd_opt;
11887
                      }
11888
                    else if (retval == 3)
11889
                      {
11890
                        if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
11891
                          goto tls_ldgd_opt;
11892
                      }
11893
                  }
11894
              }
11895
          }
11896
          break;
11897
 
11898
        case R_PPC64_GOT_TPREL16_HI:
11899
        case R_PPC64_GOT_TPREL16_HA:
11900
          if (tls_mask != 0
11901
              && (tls_mask & TLS_TPREL) == 0)
11902
            {
11903
              rel->r_offset -= d_offset;
11904
              bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
11905
              r_type = R_PPC64_NONE;
11906
              rel->r_info = ELF64_R_INFO (r_symndx, r_type);
11907
            }
11908
          break;
11909
 
11910
        case R_PPC64_GOT_TPREL16_DS:
11911
        case R_PPC64_GOT_TPREL16_LO_DS:
11912
          if (tls_mask != 0
11913
              && (tls_mask & TLS_TPREL) == 0)
11914
            {
11915
            toctprel:
11916
              insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
11917
              insn &= 31 << 21;
11918
              insn |= 0x3c0d0000;       /* addis 0,13,0 */
11919
              bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
11920
              r_type = R_PPC64_TPREL16_HA;
11921
              if (toc_symndx != 0)
11922
                {
11923
                  rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
11924
                  rel->r_addend = toc_addend;
11925
                  /* We changed the symbol.  Start over in order to
11926
                     get h, sym, sec etc. right.  */
11927
                  rel--;
11928
                  continue;
11929
                }
11930
              else
11931
                rel->r_info = ELF64_R_INFO (r_symndx, r_type);
11932
            }
11933
          break;
11934
 
11935
        case R_PPC64_TLS:
11936
          if (tls_mask != 0
11937
              && (tls_mask & TLS_TPREL) == 0)
11938
            {
11939
              insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
11940
              insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
11941
              if (insn == 0)
11942
                abort ();
11943
              bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
11944
              /* Was PPC64_TLS which sits on insn boundary, now
11945
                 PPC64_TPREL16_LO which is at low-order half-word.  */
11946
              rel->r_offset += d_offset;
11947
              r_type = R_PPC64_TPREL16_LO;
11948
              if (toc_symndx != 0)
11949
                {
11950
                  rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
11951
                  rel->r_addend = toc_addend;
11952
                  /* We changed the symbol.  Start over in order to
11953
                     get h, sym, sec etc. right.  */
11954
                  rel--;
11955
                  continue;
11956
                }
11957
              else
11958
                rel->r_info = ELF64_R_INFO (r_symndx, r_type);
11959
            }
11960
          break;
11961
 
11962
        case R_PPC64_GOT_TLSGD16_HI:
11963
        case R_PPC64_GOT_TLSGD16_HA:
11964
          tls_gd = TLS_TPRELGD;
11965
          if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
11966
            goto tls_gdld_hi;
11967
          break;
11968
 
11969
        case R_PPC64_GOT_TLSLD16_HI:
11970
        case R_PPC64_GOT_TLSLD16_HA:
11971
          if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
11972
            {
11973
            tls_gdld_hi:
11974
              if ((tls_mask & tls_gd) != 0)
11975
                r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
11976
                          + R_PPC64_GOT_TPREL16_DS);
11977
              else
11978
                {
11979
                  rel->r_offset -= d_offset;
11980
                  bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
11981
                  r_type = R_PPC64_NONE;
11982
                }
11983
              rel->r_info = ELF64_R_INFO (r_symndx, r_type);
11984
            }
11985
          break;
11986
 
11987
        case R_PPC64_GOT_TLSGD16:
11988
        case R_PPC64_GOT_TLSGD16_LO:
11989
          tls_gd = TLS_TPRELGD;
11990
          if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
11991
            goto tls_ldgd_opt;
11992
          break;
11993
 
11994
        case R_PPC64_GOT_TLSLD16:
11995
        case R_PPC64_GOT_TLSLD16_LO:
11996
          if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
11997
            {
11998
              unsigned int insn1, insn2, insn3;
11999
              bfd_vma offset;
12000
 
12001
            tls_ldgd_opt:
12002
              offset = (bfd_vma) -1;
12003
              /* If not using the newer R_PPC64_TLSGD/LD to mark
12004
                 __tls_get_addr calls, we must trust that the call
12005
                 stays with its arg setup insns, ie. that the next
12006
                 reloc is the __tls_get_addr call associated with
12007
                 the current reloc.  Edit both insns.  */
12008
              if (input_section->has_tls_get_addr_call
12009
                  && rel + 1 < relend
12010
                  && branch_reloc_hash_match (input_bfd, rel + 1,
12011
                                              htab->tls_get_addr,
12012
                                              htab->tls_get_addr_fd))
12013
                offset = rel[1].r_offset;
12014
              if ((tls_mask & tls_gd) != 0)
12015
                {
12016
                  /* IE */
12017
                  insn1 = bfd_get_32 (output_bfd,
12018
                                      contents + rel->r_offset - d_offset);
12019
                  insn1 &= (1 << 26) - (1 << 2);
12020
                  insn1 |= 58 << 26;    /* ld */
12021
                  insn2 = 0x7c636a14;   /* add 3,3,13 */
12022
                  if (offset != (bfd_vma) -1)
12023
                    rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
12024
                  if ((tls_mask & TLS_EXPLICIT) == 0)
12025
                    r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
12026
                              + R_PPC64_GOT_TPREL16_DS);
12027
                  else
12028
                    r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
12029
                  rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12030
                }
12031
              else
12032
                {
12033
                  /* LE */
12034
                  insn1 = 0x3c6d0000;   /* addis 3,13,0 */
12035
                  insn2 = 0x38630000;   /* addi 3,3,0 */
12036
                  if (tls_gd == 0)
12037
                    {
12038
                      /* Was an LD reloc.  */
12039
                      if (toc_symndx)
12040
                        sec = local_sections[toc_symndx];
12041
                      for (r_symndx = 0;
12042
                           r_symndx < symtab_hdr->sh_info;
12043
                           r_symndx++)
12044
                        if (local_sections[r_symndx] == sec)
12045
                          break;
12046
                      if (r_symndx >= symtab_hdr->sh_info)
12047
                        r_symndx = STN_UNDEF;
12048
                      rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
12049
                      if (r_symndx != STN_UNDEF)
12050
                        rel->r_addend -= (local_syms[r_symndx].st_value
12051
                                          + sec->output_offset
12052
                                          + sec->output_section->vma);
12053
                    }
12054
                  else if (toc_symndx != 0)
12055
                    {
12056
                      r_symndx = toc_symndx;
12057
                      rel->r_addend = toc_addend;
12058
                    }
12059
                  r_type = R_PPC64_TPREL16_HA;
12060
                  rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12061
                  if (offset != (bfd_vma) -1)
12062
                    {
12063
                      rel[1].r_info = ELF64_R_INFO (r_symndx,
12064
                                                    R_PPC64_TPREL16_LO);
12065
                      rel[1].r_offset = offset + d_offset;
12066
                      rel[1].r_addend = rel->r_addend;
12067
                    }
12068
                }
12069
              bfd_put_32 (output_bfd, insn1,
12070
                          contents + rel->r_offset - d_offset);
12071
              if (offset != (bfd_vma) -1)
12072
                {
12073
                  insn3 = bfd_get_32 (output_bfd,
12074
                                      contents + offset + 4);
12075
                  if (insn3 == NOP
12076
                      || insn3 == CROR_151515 || insn3 == CROR_313131)
12077
                    {
12078
                      rel[1].r_offset += 4;
12079
                      bfd_put_32 (output_bfd, insn2, contents + offset + 4);
12080
                      insn2 = NOP;
12081
                    }
12082
                  bfd_put_32 (output_bfd, insn2, contents + offset);
12083
                }
12084
              if ((tls_mask & tls_gd) == 0
12085
                  && (tls_gd == 0 || toc_symndx != 0))
12086
                {
12087
                  /* We changed the symbol.  Start over in order
12088
                     to get h, sym, sec etc. right.  */
12089
                  rel--;
12090
                  continue;
12091
                }
12092
            }
12093
          break;
12094
 
12095
        case R_PPC64_TLSGD:
12096
          if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
12097
            {
12098
              unsigned int insn2, insn3;
12099
              bfd_vma offset = rel->r_offset;
12100
 
12101
              if ((tls_mask & TLS_TPRELGD) != 0)
12102
                {
12103
                  /* IE */
12104
                  r_type = R_PPC64_NONE;
12105
                  insn2 = 0x7c636a14;   /* add 3,3,13 */
12106
                }
12107
              else
12108
                {
12109
                  /* LE */
12110
                  if (toc_symndx != 0)
12111
                    {
12112
                      r_symndx = toc_symndx;
12113
                      rel->r_addend = toc_addend;
12114
                    }
12115
                  r_type = R_PPC64_TPREL16_LO;
12116
                  rel->r_offset = offset + d_offset;
12117
                  insn2 = 0x38630000;   /* addi 3,3,0 */
12118
                }
12119
              rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12120
              /* Zap the reloc on the _tls_get_addr call too.  */
12121
              BFD_ASSERT (offset == rel[1].r_offset);
12122
              rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
12123
              insn3 = bfd_get_32 (output_bfd,
12124
                                  contents + offset + 4);
12125
              if (insn3 == NOP
12126
                  || insn3 == CROR_151515 || insn3 == CROR_313131)
12127
                {
12128
                  rel->r_offset += 4;
12129
                  bfd_put_32 (output_bfd, insn2, contents + offset + 4);
12130
                  insn2 = NOP;
12131
                }
12132
              bfd_put_32 (output_bfd, insn2, contents + offset);
12133
              if ((tls_mask & TLS_TPRELGD) == 0 && toc_symndx != 0)
12134
                {
12135
                  rel--;
12136
                  continue;
12137
                }
12138
            }
12139
          break;
12140
 
12141
        case R_PPC64_TLSLD:
12142
          if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
12143
            {
12144
              unsigned int insn2, insn3;
12145
              bfd_vma offset = rel->r_offset;
12146
 
12147
              if (toc_symndx)
12148
                sec = local_sections[toc_symndx];
12149
              for (r_symndx = 0;
12150
                   r_symndx < symtab_hdr->sh_info;
12151
                   r_symndx++)
12152
                if (local_sections[r_symndx] == sec)
12153
                  break;
12154
              if (r_symndx >= symtab_hdr->sh_info)
12155
                r_symndx = STN_UNDEF;
12156
              rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
12157
              if (r_symndx != STN_UNDEF)
12158
                rel->r_addend -= (local_syms[r_symndx].st_value
12159
                                  + sec->output_offset
12160
                                  + sec->output_section->vma);
12161
 
12162
              r_type = R_PPC64_TPREL16_LO;
12163
              rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12164
              rel->r_offset = offset + d_offset;
12165
              /* Zap the reloc on the _tls_get_addr call too.  */
12166
              BFD_ASSERT (offset == rel[1].r_offset);
12167
              rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
12168
              insn2 = 0x38630000;       /* addi 3,3,0 */
12169
              insn3 = bfd_get_32 (output_bfd,
12170
                                  contents + offset + 4);
12171
              if (insn3 == NOP
12172
                  || insn3 == CROR_151515 || insn3 == CROR_313131)
12173
                {
12174
                  rel->r_offset += 4;
12175
                  bfd_put_32 (output_bfd, insn2, contents + offset + 4);
12176
                  insn2 = NOP;
12177
                }
12178
              bfd_put_32 (output_bfd, insn2, contents + offset);
12179
              rel--;
12180
              continue;
12181
            }
12182
          break;
12183
 
12184
        case R_PPC64_DTPMOD64:
12185
          if (rel + 1 < relend
12186
              && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
12187
              && rel[1].r_offset == rel->r_offset + 8)
12188
            {
12189
              if ((tls_mask & TLS_GD) == 0)
12190
                {
12191
                  rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
12192
                  if ((tls_mask & TLS_TPRELGD) != 0)
12193
                    r_type = R_PPC64_TPREL64;
12194
                  else
12195
                    {
12196
                      bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
12197
                      r_type = R_PPC64_NONE;
12198
                    }
12199
                  rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12200
                }
12201
            }
12202
          else
12203
            {
12204
              if ((tls_mask & TLS_LD) == 0)
12205
                {
12206
                  bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
12207
                  r_type = R_PPC64_NONE;
12208
                  rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12209
                }
12210
            }
12211
          break;
12212
 
12213
        case R_PPC64_TPREL64:
12214
          if ((tls_mask & TLS_TPREL) == 0)
12215
            {
12216
              r_type = R_PPC64_NONE;
12217
              rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12218
            }
12219
          break;
12220
        }
12221
 
12222
      /* Handle other relocations that tweak non-addend part of insn.  */
12223
      insn = 0;
12224
      max_br_offset = 1 << 25;
12225
      addend = rel->r_addend;
12226
      switch (r_type)
12227
        {
12228
        default:
12229
          break;
12230
 
12231
          /* Branch taken prediction relocations.  */
12232
        case R_PPC64_ADDR14_BRTAKEN:
12233
        case R_PPC64_REL14_BRTAKEN:
12234
          insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field.  */
12235
          /* Fall thru.  */
12236
 
12237
          /* Branch not taken prediction relocations.  */
12238
        case R_PPC64_ADDR14_BRNTAKEN:
12239
        case R_PPC64_REL14_BRNTAKEN:
12240
          insn |= bfd_get_32 (output_bfd,
12241
                              contents + rel->r_offset) & ~(0x01 << 21);
12242
          /* Fall thru.  */
12243
 
12244
        case R_PPC64_REL14:
12245
          max_br_offset = 1 << 15;
12246
          /* Fall thru.  */
12247
 
12248
        case R_PPC64_REL24:
12249
          /* Calls to functions with a different TOC, such as calls to
12250
             shared objects, need to alter the TOC pointer.  This is
12251
             done using a linkage stub.  A REL24 branching to these
12252
             linkage stubs needs to be followed by a nop, as the nop
12253
             will be replaced with an instruction to restore the TOC
12254
             base pointer.  */
12255
          fdh = h;
12256
          if (h != NULL
12257
              && h->oh != NULL
12258
              && h->oh->is_func_descriptor)
12259
            fdh = ppc_follow_link (h->oh);
12260
          stub_entry = ppc_get_stub_entry (input_section, sec, fdh, rel, htab);
12261
          if (stub_entry != NULL
12262
              && (stub_entry->stub_type == ppc_stub_plt_call
12263
                  || stub_entry->stub_type == ppc_stub_plt_branch_r2off
12264
                  || stub_entry->stub_type == ppc_stub_long_branch_r2off))
12265
            {
12266
              bfd_boolean can_plt_call = FALSE;
12267
 
12268
              if (rel->r_offset + 8 <= input_section->size)
12269
                {
12270
                  unsigned long nop;
12271
                  nop = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
12272
                  if (nop == NOP
12273
                      || nop == CROR_151515 || nop == CROR_313131)
12274
                    {
12275
                      if (h != NULL
12276
                          && (h == htab->tls_get_addr_fd
12277
                              || h == htab->tls_get_addr)
12278
                          && !htab->no_tls_get_addr_opt)
12279
                        {
12280
                          /* Special stub used, leave nop alone.  */
12281
                        }
12282
                      else
12283
                        bfd_put_32 (input_bfd, LD_R2_40R1,
12284
                                    contents + rel->r_offset + 4);
12285
                      can_plt_call = TRUE;
12286
                    }
12287
                }
12288
 
12289
              if (!can_plt_call)
12290
                {
12291
                  if (stub_entry->stub_type == ppc_stub_plt_call)
12292
                    {
12293
                      /* If this is a plain branch rather than a branch
12294
                         and link, don't require a nop.  However, don't
12295
                         allow tail calls in a shared library as they
12296
                         will result in r2 being corrupted.  */
12297
                      unsigned long br;
12298
                      br = bfd_get_32 (input_bfd, contents + rel->r_offset);
12299
                      if (info->executable && (br & 1) == 0)
12300
                        can_plt_call = TRUE;
12301
                      else
12302
                        stub_entry = NULL;
12303
                    }
12304
                  else if (h != NULL
12305
                           && strcmp (h->elf.root.root.string,
12306
                                      ".__libc_start_main") == 0)
12307
                    {
12308
                      /* Allow crt1 branch to go via a toc adjusting stub.  */
12309
                      can_plt_call = TRUE;
12310
                    }
12311
                  else
12312
                    {
12313
                      if (strcmp (input_section->output_section->name,
12314
                                  ".init") == 0
12315
                          || strcmp (input_section->output_section->name,
12316
                                     ".fini") == 0)
12317
                        info->callbacks->einfo
12318
                          (_("%H: automatic multiple TOCs "
12319
                             "not supported using your crt files; "
12320
                             "recompile with -mminimal-toc or upgrade gcc\n"),
12321
                           input_bfd, input_section, rel->r_offset);
12322
                      else
12323
                        info->callbacks->einfo
12324
                          (_("%H: sibling call optimization to `%s' "
12325
                             "does not allow automatic multiple TOCs; "
12326
                             "recompile with -mminimal-toc or "
12327
                             "-fno-optimize-sibling-calls, "
12328
                             "or make `%s' extern\n"),
12329
                           input_bfd, input_section, rel->r_offset,
12330
                           sym_name,
12331
                           sym_name);
12332
                      bfd_set_error (bfd_error_bad_value);
12333
                      ret = FALSE;
12334
                    }
12335
                }
12336
 
12337
              if (can_plt_call
12338
                  && stub_entry->stub_type == ppc_stub_plt_call)
12339
                unresolved_reloc = FALSE;
12340
            }
12341
 
12342
          if ((stub_entry == NULL
12343
               || stub_entry->stub_type == ppc_stub_long_branch
12344
               || stub_entry->stub_type == ppc_stub_plt_branch)
12345
              && get_opd_info (sec) != NULL)
12346
            {
12347
              /* The branch destination is the value of the opd entry. */
12348
              bfd_vma off = (relocation + addend
12349
                             - sec->output_section->vma
12350
                             - sec->output_offset);
12351
              bfd_vma dest = opd_entry_value (sec, off, NULL, NULL);
12352
              if (dest != (bfd_vma) -1)
12353
                {
12354
                  relocation = dest;
12355
                  addend = 0;
12356
                }
12357
            }
12358
 
12359
          /* If the branch is out of reach we ought to have a long
12360
             branch stub.  */
12361
          from = (rel->r_offset
12362
                  + input_section->output_offset
12363
                  + input_section->output_section->vma);
12364
 
12365
          if (stub_entry != NULL
12366
              && (stub_entry->stub_type == ppc_stub_long_branch
12367
                  || stub_entry->stub_type == ppc_stub_plt_branch)
12368
              && (r_type == R_PPC64_ADDR14_BRTAKEN
12369
                  || r_type == R_PPC64_ADDR14_BRNTAKEN
12370
                  || (relocation + addend - from + max_br_offset
12371
                      < 2 * max_br_offset)))
12372
            /* Don't use the stub if this branch is in range.  */
12373
            stub_entry = NULL;
12374
 
12375
          if (stub_entry != NULL)
12376
            {
12377
              /* Munge up the value and addend so that we call the stub
12378
                 rather than the procedure directly.  */
12379
              relocation = (stub_entry->stub_offset
12380
                            + stub_entry->stub_sec->output_offset
12381
                            + stub_entry->stub_sec->output_section->vma);
12382
              addend = 0;
12383
            }
12384
 
12385
          if (insn != 0)
12386
            {
12387
              if (is_power4)
12388
                {
12389
                  /* Set 'a' bit.  This is 0b00010 in BO field for branch
12390
                     on CR(BI) insns (BO == 001at or 011at), and 0b01000
12391
                     for branch on CTR insns (BO == 1a00t or 1a01t).  */
12392
                  if ((insn & (0x14 << 21)) == (0x04 << 21))
12393
                    insn |= 0x02 << 21;
12394
                  else if ((insn & (0x14 << 21)) == (0x10 << 21))
12395
                    insn |= 0x08 << 21;
12396
                  else
12397
                    break;
12398
                }
12399
              else
12400
                {
12401
                  /* Invert 'y' bit if not the default.  */
12402
                  if ((bfd_signed_vma) (relocation + addend - from) < 0)
12403
                    insn ^= 0x01 << 21;
12404
                }
12405
 
12406
              bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
12407
            }
12408
 
12409
          /* NOP out calls to undefined weak functions.
12410
             We can thus call a weak function without first
12411
             checking whether the function is defined.  */
12412
          else if (h != NULL
12413
                   && h->elf.root.type == bfd_link_hash_undefweak
12414
                   && h->elf.dynindx == -1
12415
                   && r_type == R_PPC64_REL24
12416
                   && relocation == 0
12417
                   && addend == 0)
12418
            {
12419
              bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
12420
              continue;
12421
            }
12422
          break;
12423
        }
12424
 
12425
      /* Set `addend'.  */
12426
      tls_type = 0;
12427
      switch (r_type)
12428
        {
12429
        default:
12430
          info->callbacks->einfo
12431
            (_("%B: unknown relocation type %d for symbol %s\n"),
12432
             input_bfd, (int) r_type, sym_name);
12433
 
12434
          bfd_set_error (bfd_error_bad_value);
12435
          ret = FALSE;
12436
          continue;
12437
 
12438
        case R_PPC64_NONE:
12439
        case R_PPC64_TLS:
12440
        case R_PPC64_TLSGD:
12441
        case R_PPC64_TLSLD:
12442
        case R_PPC64_GNU_VTINHERIT:
12443
        case R_PPC64_GNU_VTENTRY:
12444
          continue;
12445
 
12446
          /* GOT16 relocations.  Like an ADDR16 using the symbol's
12447
             address in the GOT as relocation value instead of the
12448
             symbol's value itself.  Also, create a GOT entry for the
12449
             symbol and put the symbol value there.  */
12450
        case R_PPC64_GOT_TLSGD16:
12451
        case R_PPC64_GOT_TLSGD16_LO:
12452
        case R_PPC64_GOT_TLSGD16_HI:
12453
        case R_PPC64_GOT_TLSGD16_HA:
12454
          tls_type = TLS_TLS | TLS_GD;
12455
          goto dogot;
12456
 
12457
        case R_PPC64_GOT_TLSLD16:
12458
        case R_PPC64_GOT_TLSLD16_LO:
12459
        case R_PPC64_GOT_TLSLD16_HI:
12460
        case R_PPC64_GOT_TLSLD16_HA:
12461
          tls_type = TLS_TLS | TLS_LD;
12462
          goto dogot;
12463
 
12464
        case R_PPC64_GOT_TPREL16_DS:
12465
        case R_PPC64_GOT_TPREL16_LO_DS:
12466
        case R_PPC64_GOT_TPREL16_HI:
12467
        case R_PPC64_GOT_TPREL16_HA:
12468
          tls_type = TLS_TLS | TLS_TPREL;
12469
          goto dogot;
12470
 
12471
        case R_PPC64_GOT_DTPREL16_DS:
12472
        case R_PPC64_GOT_DTPREL16_LO_DS:
12473
        case R_PPC64_GOT_DTPREL16_HI:
12474
        case R_PPC64_GOT_DTPREL16_HA:
12475
          tls_type = TLS_TLS | TLS_DTPREL;
12476
          goto dogot;
12477
 
12478
        case R_PPC64_GOT16:
12479
        case R_PPC64_GOT16_LO:
12480
        case R_PPC64_GOT16_HI:
12481
        case R_PPC64_GOT16_HA:
12482
        case R_PPC64_GOT16_DS:
12483
        case R_PPC64_GOT16_LO_DS:
12484
        dogot:
12485
          {
12486
            /* Relocation is to the entry for this symbol in the global
12487
               offset table.  */
12488
            asection *got;
12489
            bfd_vma *offp;
12490
            bfd_vma off;
12491
            unsigned long indx = 0;
12492
            struct got_entry *ent;
12493
 
12494
            if (tls_type == (TLS_TLS | TLS_LD)
12495
                && (h == NULL
12496
                    || !h->elf.def_dynamic))
12497
              ent = ppc64_tlsld_got (input_bfd);
12498
            else
12499
              {
12500
 
12501
                if (h != NULL)
12502
                  {
12503
                    bfd_boolean dyn = htab->elf.dynamic_sections_created;
12504
                    if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
12505
                                                          &h->elf)
12506
                        || (info->shared
12507
                            && SYMBOL_CALLS_LOCAL (info, &h->elf)))
12508
                      /* This is actually a static link, or it is a
12509
                         -Bsymbolic link and the symbol is defined
12510
                         locally, or the symbol was forced to be local
12511
                         because of a version file.  */
12512
                      ;
12513
                    else
12514
                      {
12515
                        indx = h->elf.dynindx;
12516
                        unresolved_reloc = FALSE;
12517
                      }
12518
                    ent = h->elf.got.glist;
12519
                  }
12520
                else
12521
                  {
12522
                    if (local_got_ents == NULL)
12523
                      abort ();
12524
                    ent = local_got_ents[r_symndx];
12525
                  }
12526
 
12527
                for (; ent != NULL; ent = ent->next)
12528
                  if (ent->addend == orig_addend
12529
                      && ent->owner == input_bfd
12530
                      && ent->tls_type == tls_type)
12531
                    break;
12532
              }
12533
 
12534
            if (ent == NULL)
12535
              abort ();
12536
            if (ent->is_indirect)
12537
              ent = ent->got.ent;
12538
            offp = &ent->got.offset;
12539
            got = ppc64_elf_tdata (ent->owner)->got;
12540
            if (got == NULL)
12541
              abort ();
12542
 
12543
            /* The offset must always be a multiple of 8.  We use the
12544
               least significant bit to record whether we have already
12545
               processed this entry.  */
12546
            off = *offp;
12547
            if ((off & 1) != 0)
12548
              off &= ~1;
12549
            else
12550
              {
12551
                /* Generate relocs for the dynamic linker, except in
12552
                   the case of TLSLD where we'll use one entry per
12553
                   module.  */
12554
                asection *relgot;
12555
                bfd_boolean ifunc;
12556
 
12557
                *offp = off | 1;
12558
                relgot = NULL;
12559
                ifunc = (h != NULL
12560
                         ? h->elf.type == STT_GNU_IFUNC
12561
                         : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
12562
                if ((info->shared || indx != 0)
12563
                    && (h == NULL
12564
                        || (tls_type == (TLS_TLS | TLS_LD)
12565
                            && !h->elf.def_dynamic)
12566
                        || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
12567
                        || h->elf.root.type != bfd_link_hash_undefweak))
12568
                  relgot = ppc64_elf_tdata (ent->owner)->relgot;
12569
                else if (ifunc)
12570
                  relgot = htab->reliplt;
12571
                if (relgot != NULL)
12572
                  {
12573
                    outrel.r_offset = (got->output_section->vma
12574
                                       + got->output_offset
12575
                                       + off);
12576
                    outrel.r_addend = addend;
12577
                    if (tls_type & (TLS_LD | TLS_GD))
12578
                      {
12579
                        outrel.r_addend = 0;
12580
                        outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
12581
                        if (tls_type == (TLS_TLS | TLS_GD))
12582
                          {
12583
                            loc = relgot->contents;
12584
                            loc += (relgot->reloc_count++
12585
                                    * sizeof (Elf64_External_Rela));
12586
                            bfd_elf64_swap_reloca_out (output_bfd,
12587
                                                       &outrel, loc);
12588
                            outrel.r_offset += 8;
12589
                            outrel.r_addend = addend;
12590
                            outrel.r_info
12591
                              = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
12592
                          }
12593
                      }
12594
                    else if (tls_type == (TLS_TLS | TLS_DTPREL))
12595
                      outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
12596
                    else if (tls_type == (TLS_TLS | TLS_TPREL))
12597
                      outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
12598
                    else if (indx != 0)
12599
                      outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
12600
                    else
12601
                      {
12602
                        if (ifunc)
12603
                          outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
12604
                        else
12605
                          outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
12606
 
12607
                        /* Write the .got section contents for the sake
12608
                           of prelink.  */
12609
                        loc = got->contents + off;
12610
                        bfd_put_64 (output_bfd, outrel.r_addend + relocation,
12611
                                    loc);
12612
                      }
12613
 
12614
                    if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
12615
                      {
12616
                        outrel.r_addend += relocation;
12617
                        if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
12618
                          outrel.r_addend -= htab->elf.tls_sec->vma;
12619
                      }
12620
                    loc = relgot->contents;
12621
                    loc += (relgot->reloc_count++
12622
                            * sizeof (Elf64_External_Rela));
12623
                    bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
12624
                  }
12625
 
12626
                /* Init the .got section contents here if we're not
12627
                   emitting a reloc.  */
12628
                else
12629
                  {
12630
                    relocation += addend;
12631
                    if (tls_type == (TLS_TLS | TLS_LD))
12632
                      relocation = 1;
12633
                    else if (tls_type != 0)
12634
                      {
12635
                        relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
12636
                        if (tls_type == (TLS_TLS | TLS_TPREL))
12637
                          relocation += DTP_OFFSET - TP_OFFSET;
12638
 
12639
                        if (tls_type == (TLS_TLS | TLS_GD))
12640
                          {
12641
                            bfd_put_64 (output_bfd, relocation,
12642
                                        got->contents + off + 8);
12643
                            relocation = 1;
12644
                          }
12645
                      }
12646
 
12647
                    bfd_put_64 (output_bfd, relocation,
12648
                                got->contents + off);
12649
                  }
12650
              }
12651
 
12652
            if (off >= (bfd_vma) -2)
12653
              abort ();
12654
 
12655
            relocation = got->output_section->vma + got->output_offset + off;
12656
            addend = -(TOCstart + htab->stub_group[input_section->id].toc_off);
12657
          }
12658
          break;
12659
 
12660
        case R_PPC64_PLT16_HA:
12661
        case R_PPC64_PLT16_HI:
12662
        case R_PPC64_PLT16_LO:
12663
        case R_PPC64_PLT32:
12664
        case R_PPC64_PLT64:
12665
          /* Relocation is to the entry for this symbol in the
12666
             procedure linkage table.  */
12667
 
12668
          /* Resolve a PLT reloc against a local symbol directly,
12669
             without using the procedure linkage table.  */
12670
          if (h == NULL)
12671
            break;
12672
 
12673
          /* It's possible that we didn't make a PLT entry for this
12674
             symbol.  This happens when statically linking PIC code,
12675
             or when using -Bsymbolic.  Go find a match if there is a
12676
             PLT entry.  */
12677
          if (htab->plt != NULL)
12678
            {
12679
              struct plt_entry *ent;
12680
              for (ent = h->elf.plt.plist; ent != NULL; ent = ent->next)
12681
                if (ent->addend == orig_addend
12682
                    && ent->plt.offset != (bfd_vma) -1)
12683
                  {
12684
                    relocation = (htab->plt->output_section->vma
12685
                                  + htab->plt->output_offset
12686
                                  + ent->plt.offset);
12687
                    unresolved_reloc = FALSE;
12688
                  }
12689
            }
12690
          break;
12691
 
12692
        case R_PPC64_TOC:
12693
          /* Relocation value is TOC base.  */
12694
          relocation = TOCstart;
12695
          if (r_symndx == STN_UNDEF)
12696
            relocation += htab->stub_group[input_section->id].toc_off;
12697
          else if (unresolved_reloc)
12698
            ;
12699
          else if (sec != NULL && sec->id <= htab->top_id)
12700
            relocation += htab->stub_group[sec->id].toc_off;
12701
          else
12702
            unresolved_reloc = TRUE;
12703
          goto dodyn;
12704
 
12705
          /* TOC16 relocs.  We want the offset relative to the TOC base,
12706
             which is the address of the start of the TOC plus 0x8000.
12707
             The TOC consists of sections .got, .toc, .tocbss, and .plt,
12708
             in this order.  */
12709
        case R_PPC64_TOC16:
12710
        case R_PPC64_TOC16_LO:
12711
        case R_PPC64_TOC16_HI:
12712
        case R_PPC64_TOC16_DS:
12713
        case R_PPC64_TOC16_LO_DS:
12714
        case R_PPC64_TOC16_HA:
12715
          addend -= TOCstart + htab->stub_group[input_section->id].toc_off;
12716
          break;
12717
 
12718
          /* Relocate against the beginning of the section.  */
12719
        case R_PPC64_SECTOFF:
12720
        case R_PPC64_SECTOFF_LO:
12721
        case R_PPC64_SECTOFF_HI:
12722
        case R_PPC64_SECTOFF_DS:
12723
        case R_PPC64_SECTOFF_LO_DS:
12724
        case R_PPC64_SECTOFF_HA:
12725
          if (sec != NULL)
12726
            addend -= sec->output_section->vma;
12727
          break;
12728
 
12729
        case R_PPC64_REL16:
12730
        case R_PPC64_REL16_LO:
12731
        case R_PPC64_REL16_HI:
12732
        case R_PPC64_REL16_HA:
12733
          break;
12734
 
12735
        case R_PPC64_REL14:
12736
        case R_PPC64_REL14_BRNTAKEN:
12737
        case R_PPC64_REL14_BRTAKEN:
12738
        case R_PPC64_REL24:
12739
          break;
12740
 
12741
        case R_PPC64_TPREL16:
12742
        case R_PPC64_TPREL16_LO:
12743
        case R_PPC64_TPREL16_HI:
12744
        case R_PPC64_TPREL16_HA:
12745
        case R_PPC64_TPREL16_DS:
12746
        case R_PPC64_TPREL16_LO_DS:
12747
        case R_PPC64_TPREL16_HIGHER:
12748
        case R_PPC64_TPREL16_HIGHERA:
12749
        case R_PPC64_TPREL16_HIGHEST:
12750
        case R_PPC64_TPREL16_HIGHESTA:
12751
          if (h != NULL
12752
              && h->elf.root.type == bfd_link_hash_undefweak
12753
              && h->elf.dynindx == -1)
12754
            {
12755
              /* Make this relocation against an undefined weak symbol
12756
                 resolve to zero.  This is really just a tweak, since
12757
                 code using weak externs ought to check that they are
12758
                 defined before using them.  */
12759
              bfd_byte *p = contents + rel->r_offset - d_offset;
12760
 
12761
              insn = bfd_get_32 (output_bfd, p);
12762
              insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
12763
              if (insn != 0)
12764
                bfd_put_32 (output_bfd, insn, p);
12765
              break;
12766
            }
12767
          addend -= htab->elf.tls_sec->vma + TP_OFFSET;
12768
          if (info->shared)
12769
            /* The TPREL16 relocs shouldn't really be used in shared
12770
               libs as they will result in DT_TEXTREL being set, but
12771
               support them anyway.  */
12772
            goto dodyn;
12773
          break;
12774
 
12775
        case R_PPC64_DTPREL16:
12776
        case R_PPC64_DTPREL16_LO:
12777
        case R_PPC64_DTPREL16_HI:
12778
        case R_PPC64_DTPREL16_HA:
12779
        case R_PPC64_DTPREL16_DS:
12780
        case R_PPC64_DTPREL16_LO_DS:
12781
        case R_PPC64_DTPREL16_HIGHER:
12782
        case R_PPC64_DTPREL16_HIGHERA:
12783
        case R_PPC64_DTPREL16_HIGHEST:
12784
        case R_PPC64_DTPREL16_HIGHESTA:
12785
          addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
12786
          break;
12787
 
12788
        case R_PPC64_DTPMOD64:
12789
          relocation = 1;
12790
          addend = 0;
12791
          goto dodyn;
12792
 
12793
        case R_PPC64_TPREL64:
12794
          addend -= htab->elf.tls_sec->vma + TP_OFFSET;
12795
          goto dodyn;
12796
 
12797
        case R_PPC64_DTPREL64:
12798
          addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
12799
          /* Fall thru */
12800
 
12801
          /* Relocations that may need to be propagated if this is a
12802
             dynamic object.  */
12803
        case R_PPC64_REL30:
12804
        case R_PPC64_REL32:
12805
        case R_PPC64_REL64:
12806
        case R_PPC64_ADDR14:
12807
        case R_PPC64_ADDR14_BRNTAKEN:
12808
        case R_PPC64_ADDR14_BRTAKEN:
12809
        case R_PPC64_ADDR16:
12810
        case R_PPC64_ADDR16_DS:
12811
        case R_PPC64_ADDR16_HA:
12812
        case R_PPC64_ADDR16_HI:
12813
        case R_PPC64_ADDR16_HIGHER:
12814
        case R_PPC64_ADDR16_HIGHERA:
12815
        case R_PPC64_ADDR16_HIGHEST:
12816
        case R_PPC64_ADDR16_HIGHESTA:
12817
        case R_PPC64_ADDR16_LO:
12818
        case R_PPC64_ADDR16_LO_DS:
12819
        case R_PPC64_ADDR24:
12820
        case R_PPC64_ADDR32:
12821
        case R_PPC64_ADDR64:
12822
        case R_PPC64_UADDR16:
12823
        case R_PPC64_UADDR32:
12824
        case R_PPC64_UADDR64:
12825
        dodyn:
12826
          if ((input_section->flags & SEC_ALLOC) == 0)
12827
            break;
12828
 
12829
          if (NO_OPD_RELOCS && is_opd)
12830
            break;
12831
 
12832
          if ((info->shared
12833
               && (h == NULL
12834
                   || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
12835
                   || h->elf.root.type != bfd_link_hash_undefweak)
12836
               && (must_be_dyn_reloc (info, r_type)
12837
                   || !SYMBOL_CALLS_LOCAL (info, &h->elf)))
12838
              || (ELIMINATE_COPY_RELOCS
12839
                  && !info->shared
12840
                  && h != NULL
12841
                  && h->elf.dynindx != -1
12842
                  && !h->elf.non_got_ref
12843
                  && !h->elf.def_regular)
12844
              || (!info->shared
12845
                  && (h != NULL
12846
                      ? h->elf.type == STT_GNU_IFUNC
12847
                      : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)))
12848
            {
12849
              bfd_boolean skip, relocate;
12850
              asection *sreloc;
12851
              bfd_vma out_off;
12852
 
12853
              /* When generating a dynamic object, these relocations
12854
                 are copied into the output file to be resolved at run
12855
                 time.  */
12856
 
12857
              skip = FALSE;
12858
              relocate = FALSE;
12859
 
12860
              out_off = _bfd_elf_section_offset (output_bfd, info,
12861
                                                 input_section, rel->r_offset);
12862
              if (out_off == (bfd_vma) -1)
12863
                skip = TRUE;
12864
              else if (out_off == (bfd_vma) -2)
12865
                skip = TRUE, relocate = TRUE;
12866
              out_off += (input_section->output_section->vma
12867
                          + input_section->output_offset);
12868
              outrel.r_offset = out_off;
12869
              outrel.r_addend = rel->r_addend;
12870
 
12871
              /* Optimize unaligned reloc use.  */
12872
              if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
12873
                  || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
12874
                r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
12875
              else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
12876
                       || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
12877
                r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
12878
              else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
12879
                       || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
12880
                r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
12881
 
12882
              if (skip)
12883
                memset (&outrel, 0, sizeof outrel);
12884
              else if (!SYMBOL_CALLS_LOCAL (info, &h->elf)
12885
                       && !is_opd
12886
                       && r_type != R_PPC64_TOC)
12887
                outrel.r_info = ELF64_R_INFO (h->elf.dynindx, r_type);
12888
              else
12889
                {
12890
                  /* This symbol is local, or marked to become local,
12891
                     or this is an opd section reloc which must point
12892
                     at a local function.  */
12893
                  outrel.r_addend += relocation;
12894
                  if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
12895
                    {
12896
                      if (is_opd && h != NULL)
12897
                        {
12898
                          /* Lie about opd entries.  This case occurs
12899
                             when building shared libraries and we
12900
                             reference a function in another shared
12901
                             lib.  The same thing happens for a weak
12902
                             definition in an application that's
12903
                             overridden by a strong definition in a
12904
                             shared lib.  (I believe this is a generic
12905
                             bug in binutils handling of weak syms.)
12906
                             In these cases we won't use the opd
12907
                             entry in this lib.  */
12908
                          unresolved_reloc = FALSE;
12909
                        }
12910
                      if (!is_opd
12911
                          && r_type == R_PPC64_ADDR64
12912
                          && (h != NULL
12913
                              ? h->elf.type == STT_GNU_IFUNC
12914
                              : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
12915
                        outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
12916
                      else
12917
                        {
12918
                          outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
12919
 
12920
                          /* We need to relocate .opd contents for ld.so.
12921
                             Prelink also wants simple and consistent rules
12922
                             for relocs.  This make all RELATIVE relocs have
12923
                             *r_offset equal to r_addend.  */
12924
                          relocate = TRUE;
12925
                        }
12926
                    }
12927
                  else
12928
                    {
12929
                      long indx = 0;
12930
 
12931
                      if (h != NULL
12932
                          ? h->elf.type == STT_GNU_IFUNC
12933
                          : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
12934
                        {
12935
                          info->callbacks->einfo
12936
                            (_("%H: relocation %s for indirect "
12937
                               "function %s unsupported\n"),
12938
                             input_bfd, input_section, rel->r_offset,
12939
                             ppc64_elf_howto_table[r_type]->name,
12940
                             sym_name);
12941
                          ret = FALSE;
12942
                        }
12943
                      else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
12944
                        ;
12945
                      else if (sec == NULL || sec->owner == NULL)
12946
                        {
12947
                          bfd_set_error (bfd_error_bad_value);
12948
                          return FALSE;
12949
                        }
12950
                      else
12951
                        {
12952
                          asection *osec;
12953
 
12954
                          osec = sec->output_section;
12955
                          indx = elf_section_data (osec)->dynindx;
12956
 
12957
                          if (indx == 0)
12958
                            {
12959
                              if ((osec->flags & SEC_READONLY) == 0
12960
                                  && htab->elf.data_index_section != NULL)
12961
                                osec = htab->elf.data_index_section;
12962
                              else
12963
                                osec = htab->elf.text_index_section;
12964
                              indx = elf_section_data (osec)->dynindx;
12965
                            }
12966
                          BFD_ASSERT (indx != 0);
12967
 
12968
                          /* We are turning this relocation into one
12969
                             against a section symbol, so subtract out
12970
                             the output section's address but not the
12971
                             offset of the input section in the output
12972
                             section.  */
12973
                          outrel.r_addend -= osec->vma;
12974
                        }
12975
 
12976
                      outrel.r_info = ELF64_R_INFO (indx, r_type);
12977
                    }
12978
                }
12979
 
12980
              sreloc = elf_section_data (input_section)->sreloc;
12981
              if (!htab->elf.dynamic_sections_created)
12982
                sreloc = htab->reliplt;
12983
              if (sreloc == NULL)
12984
                abort ();
12985
 
12986
              if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
12987
                  >= sreloc->size)
12988
                abort ();
12989
              loc = sreloc->contents;
12990
              loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
12991
              bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
12992
 
12993
              /* If this reloc is against an external symbol, it will
12994
                 be computed at runtime, so there's no need to do
12995
                 anything now.  However, for the sake of prelink ensure
12996
                 that the section contents are a known value.  */
12997
              if (! relocate)
12998
                {
12999
                  unresolved_reloc = FALSE;
13000
                  /* The value chosen here is quite arbitrary as ld.so
13001
                     ignores section contents except for the special
13002
                     case of .opd where the contents might be accessed
13003
                     before relocation.  Choose zero, as that won't
13004
                     cause reloc overflow.  */
13005
                  relocation = 0;
13006
                  addend = 0;
13007
                  /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
13008
                     to improve backward compatibility with older
13009
                     versions of ld.  */
13010
                  if (r_type == R_PPC64_ADDR64)
13011
                    addend = outrel.r_addend;
13012
                  /* Adjust pc_relative relocs to have zero in *r_offset.  */
13013
                  else if (ppc64_elf_howto_table[r_type]->pc_relative)
13014
                    addend = (input_section->output_section->vma
13015
                              + input_section->output_offset
13016
                              + rel->r_offset);
13017
                }
13018
            }
13019
          break;
13020
 
13021
        case R_PPC64_COPY:
13022
        case R_PPC64_GLOB_DAT:
13023
        case R_PPC64_JMP_SLOT:
13024
        case R_PPC64_JMP_IREL:
13025
        case R_PPC64_RELATIVE:
13026
          /* We shouldn't ever see these dynamic relocs in relocatable
13027
             files.  */
13028
          /* Fall through.  */
13029
 
13030
        case R_PPC64_PLTGOT16:
13031
        case R_PPC64_PLTGOT16_DS:
13032
        case R_PPC64_PLTGOT16_HA:
13033
        case R_PPC64_PLTGOT16_HI:
13034
        case R_PPC64_PLTGOT16_LO:
13035
        case R_PPC64_PLTGOT16_LO_DS:
13036
        case R_PPC64_PLTREL32:
13037
        case R_PPC64_PLTREL64:
13038
          /* These ones haven't been implemented yet.  */
13039
 
13040
          info->callbacks->einfo
13041
            (_("%B: relocation %s is not supported for symbol %s\n"),
13042
             input_bfd,
13043
             ppc64_elf_howto_table[r_type]->name, sym_name);
13044
 
13045
          bfd_set_error (bfd_error_invalid_operation);
13046
          ret = FALSE;
13047
          continue;
13048
        }
13049
 
13050
      /* Multi-instruction sequences that access the TOC can be
13051
         optimized, eg. addis ra,r2,0; addi rb,ra,x;
13052
         to             nop;           addi rb,r2,x;  */
13053
      switch (r_type)
13054
        {
13055
        default:
13056
          break;
13057
 
13058
        case R_PPC64_GOT_TLSLD16_HI:
13059
        case R_PPC64_GOT_TLSGD16_HI:
13060
        case R_PPC64_GOT_TPREL16_HI:
13061
        case R_PPC64_GOT_DTPREL16_HI:
13062
        case R_PPC64_GOT16_HI:
13063
        case R_PPC64_TOC16_HI:
13064
          /* These relocs would only be useful if building up an
13065
             offset to later add to r2, perhaps in an indexed
13066
             addressing mode instruction.  Don't try to optimize.
13067
             Unfortunately, the possibility of someone building up an
13068
             offset like this or even with the HA relocs, means that
13069
             we need to check the high insn when optimizing the low
13070
             insn.  */
13071
          break;
13072
 
13073
        case R_PPC64_GOT_TLSLD16_HA:
13074
        case R_PPC64_GOT_TLSGD16_HA:
13075
        case R_PPC64_GOT_TPREL16_HA:
13076
        case R_PPC64_GOT_DTPREL16_HA:
13077
        case R_PPC64_GOT16_HA:
13078
        case R_PPC64_TOC16_HA:
13079
          /* nop is done later.  */
13080
          break;
13081
 
13082
        case R_PPC64_GOT_TLSLD16_LO:
13083
        case R_PPC64_GOT_TLSGD16_LO:
13084
        case R_PPC64_GOT_TPREL16_LO_DS:
13085
        case R_PPC64_GOT_DTPREL16_LO_DS:
13086
        case R_PPC64_GOT16_LO:
13087
        case R_PPC64_GOT16_LO_DS:
13088
        case R_PPC64_TOC16_LO:
13089
        case R_PPC64_TOC16_LO_DS:
13090
          if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000)
13091
            {
13092
              bfd_byte *p = contents + (rel->r_offset & ~3);
13093
              insn = bfd_get_32 (input_bfd, p);
13094
              if ((insn & (0x3f << 26)) == 14u << 26 /* addi */
13095
                  || (insn & (0x3f << 26)) == 32u << 26 /* lwz */
13096
                  || (insn & (0x3f << 26)) == 34u << 26 /* lbz */
13097
                  || (insn & (0x3f << 26)) == 36u << 26 /* stw */
13098
                  || (insn & (0x3f << 26)) == 38u << 26 /* stb */
13099
                  || (insn & (0x3f << 26)) == 40u << 26 /* lhz */
13100
                  || (insn & (0x3f << 26)) == 42u << 26 /* lha */
13101
                  || (insn & (0x3f << 26)) == 44u << 26 /* sth */
13102
                  || (insn & (0x3f << 26)) == 46u << 26 /* lmw */
13103
                  || (insn & (0x3f << 26)) == 47u << 26 /* stmw */
13104
                  || (insn & (0x3f << 26)) == 48u << 26 /* lfs */
13105
                  || (insn & (0x3f << 26)) == 50u << 26 /* lfd */
13106
                  || (insn & (0x3f << 26)) == 52u << 26 /* stfs */
13107
                  || (insn & (0x3f << 26)) == 54u << 26 /* stfd */
13108
                  || ((insn & (0x3f << 26)) == 58u << 26 /* lwa,ld,lmd */
13109
                      && (insn & 3) != 1)
13110
                  || ((insn & (0x3f << 26)) == 62u << 26 /* std, stmd */
13111
                      && ((insn & 3) == 0 || (insn & 3) == 3)))
13112
                {
13113
                  unsigned int reg = (insn >> 16) & 0x1f;
13114
                  const Elf_Internal_Rela *ha;
13115
                  bfd_boolean match_addend;
13116
 
13117
                  match_addend = (sym != NULL
13118
                                  && ELF_ST_TYPE (sym->st_info) == STT_SECTION);
13119
                  ha = ha_reloc_match (relocs, rel, &reg, match_addend,
13120
                                       input_bfd, contents);
13121
                  if (ha != NULL)
13122
                    {
13123
                      insn &= ~(0x1f << 16);
13124
                      insn |= reg << 16;
13125
                      bfd_put_32 (input_bfd, insn, p);
13126
                      if (ha_opt == NULL)
13127
                        {
13128
                          ha_opt = bfd_zmalloc (input_section->reloc_count);
13129
                          if (ha_opt == NULL)
13130
                            return FALSE;
13131
                        }
13132
                      ha_opt[ha - relocs] = 1;
13133
                    }
13134
                  else
13135
                    /* If we don't find a matching high part insn,
13136
                       something is fishy.  Refuse to nop any high
13137
                       part insn in this section.  */
13138
                    no_ha_opt = TRUE;
13139
                }
13140
            }
13141
          break;
13142
        }
13143
 
13144
      /* Do any further special processing.  */
13145
      switch (r_type)
13146
        {
13147
        default:
13148
          break;
13149
 
13150
        case R_PPC64_ADDR16_HA:
13151
        case R_PPC64_REL16_HA:
13152
        case R_PPC64_ADDR16_HIGHERA:
13153
        case R_PPC64_ADDR16_HIGHESTA:
13154
        case R_PPC64_TOC16_HA:
13155
        case R_PPC64_SECTOFF_HA:
13156
        case R_PPC64_TPREL16_HA:
13157
        case R_PPC64_DTPREL16_HA:
13158
        case R_PPC64_TPREL16_HIGHER:
13159
        case R_PPC64_TPREL16_HIGHERA:
13160
        case R_PPC64_TPREL16_HIGHEST:
13161
        case R_PPC64_TPREL16_HIGHESTA:
13162
        case R_PPC64_DTPREL16_HIGHER:
13163
        case R_PPC64_DTPREL16_HIGHERA:
13164
        case R_PPC64_DTPREL16_HIGHEST:
13165
        case R_PPC64_DTPREL16_HIGHESTA:
13166
          /* It's just possible that this symbol is a weak symbol
13167
             that's not actually defined anywhere. In that case,
13168
             'sec' would be NULL, and we should leave the symbol
13169
             alone (it will be set to zero elsewhere in the link).  */
13170
          if (sec == NULL)
13171
            break;
13172
          /* Fall thru */
13173
 
13174
        case R_PPC64_GOT16_HA:
13175
        case R_PPC64_PLTGOT16_HA:
13176
        case R_PPC64_PLT16_HA:
13177
        case R_PPC64_GOT_TLSGD16_HA:
13178
        case R_PPC64_GOT_TLSLD16_HA:
13179
        case R_PPC64_GOT_TPREL16_HA:
13180
        case R_PPC64_GOT_DTPREL16_HA:
13181
          /* Add 0x10000 if sign bit in 0:15 is set.
13182
             Bits 0:15 are not used.  */
13183
          addend += 0x8000;
13184
          break;
13185
 
13186
        case R_PPC64_ADDR16_DS:
13187
        case R_PPC64_ADDR16_LO_DS:
13188
        case R_PPC64_GOT16_DS:
13189
        case R_PPC64_GOT16_LO_DS:
13190
        case R_PPC64_PLT16_LO_DS:
13191
        case R_PPC64_SECTOFF_DS:
13192
        case R_PPC64_SECTOFF_LO_DS:
13193
        case R_PPC64_TOC16_DS:
13194
        case R_PPC64_TOC16_LO_DS:
13195
        case R_PPC64_PLTGOT16_DS:
13196
        case R_PPC64_PLTGOT16_LO_DS:
13197
        case R_PPC64_GOT_TPREL16_DS:
13198
        case R_PPC64_GOT_TPREL16_LO_DS:
13199
        case R_PPC64_GOT_DTPREL16_DS:
13200
        case R_PPC64_GOT_DTPREL16_LO_DS:
13201
        case R_PPC64_TPREL16_DS:
13202
        case R_PPC64_TPREL16_LO_DS:
13203
        case R_PPC64_DTPREL16_DS:
13204
        case R_PPC64_DTPREL16_LO_DS:
13205
          insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
13206
          mask = 3;
13207
          /* If this reloc is against an lq insn, then the value must be
13208
             a multiple of 16.  This is somewhat of a hack, but the
13209
             "correct" way to do this by defining _DQ forms of all the
13210
             _DS relocs bloats all reloc switches in this file.  It
13211
             doesn't seem to make much sense to use any of these relocs
13212
             in data, so testing the insn should be safe.  */
13213
          if ((insn & (0x3f << 26)) == (56u << 26))
13214
            mask = 15;
13215
          if (((relocation + addend) & mask) != 0)
13216
            {
13217
              info->callbacks->einfo
13218
                (_("%H: error: %s not a multiple of %u\n"),
13219
                 input_bfd, input_section, rel->r_offset,
13220
                 ppc64_elf_howto_table[r_type]->name,
13221
                 mask + 1);
13222
              bfd_set_error (bfd_error_bad_value);
13223
              ret = FALSE;
13224
              continue;
13225
            }
13226
          break;
13227
        }
13228
 
13229
      /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
13230
         because such sections are not SEC_ALLOC and thus ld.so will
13231
         not process them.  */
13232
      if (unresolved_reloc
13233
          && !((input_section->flags & SEC_DEBUGGING) != 0
13234
               && h->elf.def_dynamic))
13235
        {
13236
          info->callbacks->einfo
13237
            (_("%H: unresolvable %s relocation against symbol `%s'\n"),
13238
             input_bfd, input_section, rel->r_offset,
13239
             ppc64_elf_howto_table[(int) r_type]->name,
13240
             h->elf.root.root.string);
13241
          ret = FALSE;
13242
        }
13243
 
13244
      r = _bfd_final_link_relocate (ppc64_elf_howto_table[(int) r_type],
13245
                                    input_bfd,
13246
                                    input_section,
13247
                                    contents,
13248
                                    rel->r_offset,
13249
                                    relocation,
13250
                                    addend);
13251
 
13252
      if (r != bfd_reloc_ok)
13253
        {
13254
          if (sym_name == NULL)
13255
            sym_name = "(null)";
13256
          if (r == bfd_reloc_overflow)
13257
            {
13258
              if (warned)
13259
                continue;
13260
              if (h != NULL
13261
                  && h->elf.root.type == bfd_link_hash_undefweak
13262
                  && ppc64_elf_howto_table[r_type]->pc_relative)
13263
                {
13264
                  /* Assume this is a call protected by other code that
13265
                     detects the symbol is undefined.  If this is the case,
13266
                     we can safely ignore the overflow.  If not, the
13267
                     program is hosed anyway, and a little warning isn't
13268
                     going to help.  */
13269
 
13270
                  continue;
13271
                }
13272
 
13273
              if (!((*info->callbacks->reloc_overflow)
13274
                    (info, (h ? &h->elf.root : NULL), sym_name,
13275
                     ppc64_elf_howto_table[r_type]->name,
13276
                     orig_addend, input_bfd, input_section, rel->r_offset)))
13277
                return FALSE;
13278
            }
13279
          else
13280
            {
13281
              info->callbacks->einfo
13282
                (_("%H: %s reloc against `%s': error %d\n"),
13283
                 input_bfd, input_section, rel->r_offset,
13284
                 ppc64_elf_howto_table[r_type]->name,
13285
                 sym_name,
13286
                 (int) r);
13287
              ret = FALSE;
13288
            }
13289
        }
13290
    }
13291
 
13292
  if (ha_opt != NULL)
13293
    {
13294
      if (!no_ha_opt)
13295
        {
13296
          unsigned char *opt = ha_opt;
13297
          rel = relocs;
13298
          relend = relocs + input_section->reloc_count;
13299
          for (; rel < relend; opt++, rel++)
13300
            if (*opt != 0)
13301
              {
13302
                bfd_byte *p = contents + (rel->r_offset & ~3);
13303
                bfd_put_32 (input_bfd, NOP, p);
13304
              }
13305
        }
13306
      free (ha_opt);
13307
    }
13308
 
13309
  /* If we're emitting relocations, then shortly after this function
13310
     returns, reloc offsets and addends for this section will be
13311
     adjusted.  Worse, reloc symbol indices will be for the output
13312
     file rather than the input.  Save a copy of the relocs for
13313
     opd_entry_value.  */
13314
  if (is_opd && (info->emitrelocations || info->relocatable))
13315
    {
13316
      bfd_size_type amt;
13317
      amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
13318
      rel = bfd_alloc (input_bfd, amt);
13319
      BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd_relocs == NULL);
13320
      ppc64_elf_tdata (input_bfd)->opd_relocs = rel;
13321
      if (rel == NULL)
13322
        return FALSE;
13323
      memcpy (rel, relocs, amt);
13324
    }
13325
  return ret;
13326
}
13327
 
13328
/* Adjust the value of any local symbols in opd sections.  */
13329
 
13330
static int
13331
ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
13332
                              const char *name ATTRIBUTE_UNUSED,
13333
                              Elf_Internal_Sym *elfsym,
13334
                              asection *input_sec,
13335
                              struct elf_link_hash_entry *h)
13336
{
13337
  struct _opd_sec_data *opd;
13338
  long adjust;
13339
  bfd_vma value;
13340
 
13341
  if (h != NULL)
13342
    return 1;
13343
 
13344
  opd = get_opd_info (input_sec);
13345
  if (opd == NULL || opd->adjust == NULL)
13346
    return 1;
13347
 
13348
  value = elfsym->st_value - input_sec->output_offset;
13349
  if (!info->relocatable)
13350
    value -= input_sec->output_section->vma;
13351
 
13352
  adjust = opd->adjust[value / 8];
13353
  if (adjust == -1)
13354
    return 2;
13355
 
13356
  elfsym->st_value += adjust;
13357
  return 1;
13358
}
13359
 
13360
/* Finish up dynamic symbol handling.  We set the contents of various
13361
   dynamic sections here.  */
13362
 
13363
static bfd_boolean
13364
ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
13365
                                 struct bfd_link_info *info,
13366
                                 struct elf_link_hash_entry *h,
13367
                                 Elf_Internal_Sym *sym)
13368
{
13369
  struct ppc_link_hash_table *htab;
13370
  struct plt_entry *ent;
13371
  Elf_Internal_Rela rela;
13372
  bfd_byte *loc;
13373
 
13374
  htab = ppc_hash_table (info);
13375
  if (htab == NULL)
13376
    return FALSE;
13377
 
13378
  for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13379
    if (ent->plt.offset != (bfd_vma) -1)
13380
      {
13381
        /* This symbol has an entry in the procedure linkage
13382
           table.  Set it up.  */
13383
        if (!htab->elf.dynamic_sections_created
13384
            || h->dynindx == -1)
13385
          {
13386
            BFD_ASSERT (h->type == STT_GNU_IFUNC
13387
                        && h->def_regular
13388
                        && (h->root.type == bfd_link_hash_defined
13389
                            || h->root.type == bfd_link_hash_defweak));
13390
            rela.r_offset = (htab->iplt->output_section->vma
13391
                             + htab->iplt->output_offset
13392
                             + ent->plt.offset);
13393
            rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
13394
            rela.r_addend = (h->root.u.def.value
13395
                             + h->root.u.def.section->output_offset
13396
                             + h->root.u.def.section->output_section->vma
13397
                             + ent->addend);
13398
            loc = (htab->reliplt->contents
13399
                   + (htab->reliplt->reloc_count++
13400
                      * sizeof (Elf64_External_Rela)));
13401
          }
13402
        else
13403
          {
13404
            rela.r_offset = (htab->plt->output_section->vma
13405
                             + htab->plt->output_offset
13406
                             + ent->plt.offset);
13407
            rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
13408
            rela.r_addend = ent->addend;
13409
            loc = (htab->relplt->contents
13410
                   + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE)
13411
                      / (PLT_ENTRY_SIZE / sizeof (Elf64_External_Rela))));
13412
          }
13413
        bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
13414
      }
13415
 
13416
  if (h->needs_copy)
13417
    {
13418
      /* This symbol needs a copy reloc.  Set it up.  */
13419
 
13420
      if (h->dynindx == -1
13421
          || (h->root.type != bfd_link_hash_defined
13422
              && h->root.type != bfd_link_hash_defweak)
13423
          || htab->relbss == NULL)
13424
        abort ();
13425
 
13426
      rela.r_offset = (h->root.u.def.value
13427
                       + h->root.u.def.section->output_section->vma
13428
                       + h->root.u.def.section->output_offset);
13429
      rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
13430
      rela.r_addend = 0;
13431
      loc = htab->relbss->contents;
13432
      loc += htab->relbss->reloc_count++ * sizeof (Elf64_External_Rela);
13433
      bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
13434
    }
13435
 
13436
  /* Mark some specially defined symbols as absolute.  */
13437
  if (strcmp (h->root.root.string, "_DYNAMIC") == 0)
13438
    sym->st_shndx = SHN_ABS;
13439
 
13440
  return TRUE;
13441
}
13442
 
13443
/* Used to decide how to sort relocs in an optimal manner for the
13444
   dynamic linker, before writing them out.  */
13445
 
13446
static enum elf_reloc_type_class
13447
ppc64_elf_reloc_type_class (const Elf_Internal_Rela *rela)
13448
{
13449
  enum elf_ppc64_reloc_type r_type;
13450
 
13451
  r_type = ELF64_R_TYPE (rela->r_info);
13452
  switch (r_type)
13453
    {
13454
    case R_PPC64_RELATIVE:
13455
      return reloc_class_relative;
13456
    case R_PPC64_JMP_SLOT:
13457
      return reloc_class_plt;
13458
    case R_PPC64_COPY:
13459
      return reloc_class_copy;
13460
    default:
13461
      return reloc_class_normal;
13462
    }
13463
}
13464
 
13465
/* Finish up the dynamic sections.  */
13466
 
13467
static bfd_boolean
13468
ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
13469
                                   struct bfd_link_info *info)
13470
{
13471
  struct ppc_link_hash_table *htab;
13472
  bfd *dynobj;
13473
  asection *sdyn;
13474
 
13475
  htab = ppc_hash_table (info);
13476
  if (htab == NULL)
13477
    return FALSE;
13478
 
13479
  dynobj = htab->elf.dynobj;
13480
  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
13481
 
13482
  if (htab->elf.dynamic_sections_created)
13483
    {
13484
      Elf64_External_Dyn *dyncon, *dynconend;
13485
 
13486
      if (sdyn == NULL || htab->got == NULL)
13487
        abort ();
13488
 
13489
      dyncon = (Elf64_External_Dyn *) sdyn->contents;
13490
      dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
13491
      for (; dyncon < dynconend; dyncon++)
13492
        {
13493
          Elf_Internal_Dyn dyn;
13494
          asection *s;
13495
 
13496
          bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
13497
 
13498
          switch (dyn.d_tag)
13499
            {
13500
            default:
13501
              continue;
13502
 
13503
            case DT_PPC64_GLINK:
13504
              s = htab->glink;
13505
              dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
13506
              /* We stupidly defined DT_PPC64_GLINK to be the start
13507
                 of glink rather than the first entry point, which is
13508
                 what ld.so needs, and now have a bigger stub to
13509
                 support automatic multiple TOCs.  */
13510
              dyn.d_un.d_ptr += GLINK_CALL_STUB_SIZE - 32;
13511
              break;
13512
 
13513
            case DT_PPC64_OPD:
13514
              s = bfd_get_section_by_name (output_bfd, ".opd");
13515
              if (s == NULL)
13516
                continue;
13517
              dyn.d_un.d_ptr = s->vma;
13518
              break;
13519
 
13520
            case DT_PPC64_OPDSZ:
13521
              s = bfd_get_section_by_name (output_bfd, ".opd");
13522
              if (s == NULL)
13523
                continue;
13524
              dyn.d_un.d_val = s->size;
13525
              break;
13526
 
13527
            case DT_PLTGOT:
13528
              s = htab->plt;
13529
              dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
13530
              break;
13531
 
13532
            case DT_JMPREL:
13533
              s = htab->relplt;
13534
              dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
13535
              break;
13536
 
13537
            case DT_PLTRELSZ:
13538
              dyn.d_un.d_val = htab->relplt->size;
13539
              break;
13540
 
13541
            case DT_RELASZ:
13542
              /* Don't count procedure linkage table relocs in the
13543
                 overall reloc count.  */
13544
              s = htab->relplt;
13545
              if (s == NULL)
13546
                continue;
13547
              dyn.d_un.d_val -= s->size;
13548
              break;
13549
 
13550
            case DT_RELA:
13551
              /* We may not be using the standard ELF linker script.
13552
                 If .rela.plt is the first .rela section, we adjust
13553
                 DT_RELA to not include it.  */
13554
              s = htab->relplt;
13555
              if (s == NULL)
13556
                continue;
13557
              if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
13558
                continue;
13559
              dyn.d_un.d_ptr += s->size;
13560
              break;
13561
            }
13562
 
13563
          bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
13564
        }
13565
    }
13566
 
13567
  if (htab->got != NULL && htab->got->size != 0)
13568
    {
13569
      /* Fill in the first entry in the global offset table.
13570
         We use it to hold the link-time TOCbase.  */
13571
      bfd_put_64 (output_bfd,
13572
                  elf_gp (output_bfd) + TOC_BASE_OFF,
13573
                  htab->got->contents);
13574
 
13575
      /* Set .got entry size.  */
13576
      elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 8;
13577
    }
13578
 
13579
  if (htab->plt != NULL && htab->plt->size != 0)
13580
    {
13581
      /* Set .plt entry size.  */
13582
      elf_section_data (htab->plt->output_section)->this_hdr.sh_entsize
13583
        = PLT_ENTRY_SIZE;
13584
    }
13585
 
13586
  /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
13587
     brlt ourselves if emitrelocations.  */
13588
  if (htab->brlt != NULL
13589
      && htab->brlt->reloc_count != 0
13590
      && !_bfd_elf_link_output_relocs (output_bfd,
13591
                                       htab->brlt,
13592
                                       elf_section_data (htab->brlt)->rela.hdr,
13593
                                       elf_section_data (htab->brlt)->relocs,
13594
                                       NULL))
13595
    return FALSE;
13596
 
13597
  if (htab->glink != NULL
13598
      && htab->glink->reloc_count != 0
13599
      && !_bfd_elf_link_output_relocs (output_bfd,
13600
                                       htab->glink,
13601
                                       elf_section_data (htab->glink)->rela.hdr,
13602
                                       elf_section_data (htab->glink)->relocs,
13603
                                       NULL))
13604
    return FALSE;
13605
 
13606
  /* We need to handle writing out multiple GOT sections ourselves,
13607
     since we didn't add them to DYNOBJ.  We know dynobj is the first
13608
     bfd.  */
13609
  while ((dynobj = dynobj->link_next) != NULL)
13610
    {
13611
      asection *s;
13612
 
13613
      if (!is_ppc64_elf (dynobj))
13614
        continue;
13615
 
13616
      s = ppc64_elf_tdata (dynobj)->got;
13617
      if (s != NULL
13618
          && s->size != 0
13619
          && s->output_section != bfd_abs_section_ptr
13620
          && !bfd_set_section_contents (output_bfd, s->output_section,
13621
                                        s->contents, s->output_offset,
13622
                                        s->size))
13623
        return FALSE;
13624
      s = ppc64_elf_tdata (dynobj)->relgot;
13625
      if (s != NULL
13626
          && s->size != 0
13627
          && s->output_section != bfd_abs_section_ptr
13628
          && !bfd_set_section_contents (output_bfd, s->output_section,
13629
                                        s->contents, s->output_offset,
13630
                                        s->size))
13631
        return FALSE;
13632
    }
13633
 
13634
  return TRUE;
13635
}
13636
 
13637
#include "elf64-target.h"

powered by: WebSVN 2.1.0

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