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 163

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 161 khays
#include "dwarf2.h"
38 14 khays
 
39
static bfd_reloc_status_type ppc64_elf_ha_reloc
40
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
41
static bfd_reloc_status_type ppc64_elf_branch_reloc
42
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
43
static bfd_reloc_status_type ppc64_elf_brtaken_reloc
44
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
45
static bfd_reloc_status_type ppc64_elf_sectoff_reloc
46
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
47
static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc
48
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
49
static bfd_reloc_status_type ppc64_elf_toc_reloc
50
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
51
static bfd_reloc_status_type ppc64_elf_toc_ha_reloc
52
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
53
static bfd_reloc_status_type ppc64_elf_toc64_reloc
54
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
55
static bfd_reloc_status_type ppc64_elf_unhandled_reloc
56
  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
57
static bfd_vma opd_entry_value
58
  (asection *, bfd_vma, asection **, bfd_vma *);
59
 
60
#define TARGET_LITTLE_SYM       bfd_elf64_powerpcle_vec
61
#define TARGET_LITTLE_NAME      "elf64-powerpcle"
62
#define TARGET_BIG_SYM          bfd_elf64_powerpc_vec
63
#define TARGET_BIG_NAME         "elf64-powerpc"
64
#define ELF_ARCH                bfd_arch_powerpc
65
#define ELF_TARGET_ID           PPC64_ELF_DATA
66
#define ELF_MACHINE_CODE        EM_PPC64
67
#define ELF_MAXPAGESIZE         0x10000
68
#define ELF_COMMONPAGESIZE      0x1000
69
#define elf_info_to_howto       ppc64_elf_info_to_howto
70
 
71
#define elf_backend_want_got_sym 0
72
#define elf_backend_want_plt_sym 0
73
#define elf_backend_plt_alignment 3
74
#define elf_backend_plt_not_loaded 1
75
#define elf_backend_got_header_size 8
76
#define elf_backend_can_gc_sections 1
77
#define elf_backend_can_refcount 1
78
#define elf_backend_rela_normal 1
79
#define elf_backend_default_execstack 0
80
 
81
#define bfd_elf64_mkobject                    ppc64_elf_mkobject
82
#define bfd_elf64_bfd_reloc_type_lookup       ppc64_elf_reloc_type_lookup
83
#define bfd_elf64_bfd_reloc_name_lookup       ppc64_elf_reloc_name_lookup
84 161 khays
#define bfd_elf64_bfd_merge_private_bfd_data  _bfd_generic_verify_endian_match
85 14 khays
#define bfd_elf64_new_section_hook            ppc64_elf_new_section_hook
86
#define bfd_elf64_bfd_link_hash_table_create  ppc64_elf_link_hash_table_create
87
#define bfd_elf64_bfd_link_hash_table_free    ppc64_elf_link_hash_table_free
88
#define bfd_elf64_get_synthetic_symtab        ppc64_elf_get_synthetic_symtab
89
#define bfd_elf64_bfd_link_just_syms          ppc64_elf_link_just_syms
90
 
91
#define elf_backend_object_p                  ppc64_elf_object_p
92
#define elf_backend_grok_prstatus             ppc64_elf_grok_prstatus
93
#define elf_backend_grok_psinfo               ppc64_elf_grok_psinfo
94
#define elf_backend_write_core_note           ppc64_elf_write_core_note
95
#define elf_backend_create_dynamic_sections   ppc64_elf_create_dynamic_sections
96
#define elf_backend_copy_indirect_symbol      ppc64_elf_copy_indirect_symbol
97
#define elf_backend_add_symbol_hook           ppc64_elf_add_symbol_hook
98
#define elf_backend_check_directives          ppc64_elf_process_dot_syms
99
#define elf_backend_as_needed_cleanup         ppc64_elf_as_needed_cleanup
100
#define elf_backend_archive_symbol_lookup     ppc64_elf_archive_symbol_lookup
101
#define elf_backend_check_relocs              ppc64_elf_check_relocs
102
#define elf_backend_gc_keep                   ppc64_elf_gc_keep
103
#define elf_backend_gc_mark_dynamic_ref       ppc64_elf_gc_mark_dynamic_ref
104
#define elf_backend_gc_mark_hook              ppc64_elf_gc_mark_hook
105
#define elf_backend_gc_sweep_hook             ppc64_elf_gc_sweep_hook
106
#define elf_backend_adjust_dynamic_symbol     ppc64_elf_adjust_dynamic_symbol
107
#define elf_backend_hide_symbol               ppc64_elf_hide_symbol
108
#define elf_backend_always_size_sections      ppc64_elf_func_desc_adjust
109
#define elf_backend_size_dynamic_sections     ppc64_elf_size_dynamic_sections
110
#define elf_backend_init_index_section        _bfd_elf_init_2_index_sections
111
#define elf_backend_action_discarded          ppc64_elf_action_discarded
112
#define elf_backend_relocate_section          ppc64_elf_relocate_section
113
#define elf_backend_finish_dynamic_symbol     ppc64_elf_finish_dynamic_symbol
114
#define elf_backend_reloc_type_class          ppc64_elf_reloc_type_class
115
#define elf_backend_finish_dynamic_sections   ppc64_elf_finish_dynamic_sections
116
#define elf_backend_link_output_symbol_hook   ppc64_elf_output_symbol_hook
117
#define elf_backend_special_sections          ppc64_elf_special_sections
118
#define elf_backend_post_process_headers      _bfd_elf_set_osabi
119
 
120
/* The name of the dynamic interpreter.  This is put in the .interp
121
   section.  */
122
#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
123
 
124
/* The size in bytes of an entry in the procedure linkage table.  */
125
#define PLT_ENTRY_SIZE 24
126
 
127
/* The initial size of the plt reserved for the dynamic linker.  */
128
#define PLT_INITIAL_ENTRY_SIZE PLT_ENTRY_SIZE
129
 
130
/* TOC base pointers offset from start of TOC.  */
131
#define TOC_BASE_OFF    0x8000
132
 
133
/* Offset of tp and dtp pointers from start of TLS block.  */
134
#define TP_OFFSET       0x7000
135
#define DTP_OFFSET      0x8000
136
 
137
/* .plt call stub instructions.  The normal stub is like this, but
138
   sometimes the .plt entry crosses a 64k boundary and we need to
139
   insert an addi to adjust r12.  */
140
#define PLT_CALL_STUB_SIZE (7*4)
141
#define ADDIS_R12_R2    0x3d820000      /* addis %r12,%r2,xxx@ha     */
142
#define STD_R2_40R1     0xf8410028      /* std   %r2,40(%r1)         */
143
#define LD_R11_0R12     0xe96c0000      /* ld    %r11,xxx+0@l(%r12)  */
144
#define MTCTR_R11       0x7d6903a6      /* mtctr %r11                */
145
#define LD_R2_0R12      0xe84c0000      /* ld    %r2,xxx+8@l(%r12)   */
146
                                        /* ld    %r11,xxx+16@l(%r12) */
147
#define BCTR            0x4e800420      /* bctr                      */
148
 
149
 
150
#define ADDIS_R12_R12   0x3d8c0000      /* addis %r12,%r12,off@ha  */
151
#define ADDI_R12_R12    0x398c0000      /* addi %r12,%r12,off@l  */
152
#define ADDIS_R2_R2     0x3c420000      /* addis %r2,%r2,off@ha  */
153
#define ADDI_R2_R2      0x38420000      /* addi  %r2,%r2,off@l   */
154
 
155
#define LD_R11_0R2      0xe9620000      /* ld    %r11,xxx+0(%r2) */
156
#define LD_R2_0R2       0xe8420000      /* ld    %r2,xxx+0(%r2)  */
157
 
158
#define LD_R2_40R1      0xe8410028      /* ld    %r2,40(%r1)     */
159
 
160
/* glink call stub instructions.  We enter with the index in R0.  */
161
#define GLINK_CALL_STUB_SIZE (16*4)
162
                                        /* 0:                           */
163
                                        /*  .quad plt0-1f               */
164
                                        /* __glink:                     */
165
#define MFLR_R12        0x7d8802a6      /*  mflr %12                    */
166
#define BCL_20_31       0x429f0005      /*  bcl 20,31,1f                */
167
                                        /* 1:                           */
168
#define MFLR_R11        0x7d6802a6      /*  mflr %11                    */
169
#define LD_R2_M16R11    0xe84bfff0      /*  ld %2,(0b-1b)(%11)          */
170
#define MTLR_R12        0x7d8803a6      /*  mtlr %12                    */
171
#define ADD_R12_R2_R11  0x7d825a14      /*  add %12,%2,%11              */
172
                                        /*  ld %11,0(%12)               */
173
                                        /*  ld %2,8(%12)                */
174
                                        /*  mtctr %11                   */
175
                                        /*  ld %11,16(%12)              */
176
                                        /*  bctr                        */
177
 
178
/* Pad with this.  */
179
#define NOP             0x60000000
180
 
181
/* Some other nops.  */
182
#define CROR_151515     0x4def7b82
183
#define CROR_313131     0x4ffffb82
184
 
185
/* .glink entries for the first 32k functions are two instructions.  */
186
#define LI_R0_0         0x38000000      /* li    %r0,0          */
187
#define B_DOT           0x48000000      /* b     .              */
188
 
189
/* After that, we need two instructions to load the index, followed by
190
   a branch.  */
191
#define LIS_R0_0        0x3c000000      /* lis   %r0,0          */
192
#define ORI_R0_R0_0     0x60000000      /* ori   %r0,%r0,0      */
193
 
194
/* Instructions used by the save and restore reg functions.  */
195
#define STD_R0_0R1      0xf8010000      /* std   %r0,0(%r1)     */
196
#define STD_R0_0R12     0xf80c0000      /* std   %r0,0(%r12)    */
197
#define LD_R0_0R1       0xe8010000      /* ld    %r0,0(%r1)     */
198
#define LD_R0_0R12      0xe80c0000      /* ld    %r0,0(%r12)    */
199
#define STFD_FR0_0R1    0xd8010000      /* stfd  %fr0,0(%r1)    */
200
#define LFD_FR0_0R1     0xc8010000      /* lfd   %fr0,0(%r1)    */
201
#define LI_R12_0        0x39800000      /* li    %r12,0         */
202
#define STVX_VR0_R12_R0 0x7c0c01ce      /* stvx  %v0,%r12,%r0   */
203
#define LVX_VR0_R12_R0  0x7c0c00ce      /* lvx   %v0,%r12,%r0   */
204
#define MTLR_R0         0x7c0803a6      /* mtlr  %r0            */
205
#define BLR             0x4e800020      /* blr                  */
206
 
207
/* Since .opd is an array of descriptors and each entry will end up
208
   with identical R_PPC64_RELATIVE relocs, there is really no need to
209
   propagate .opd relocs;  The dynamic linker should be taught to
210
   relocate .opd without reloc entries.  */
211
#ifndef NO_OPD_RELOCS
212
#define NO_OPD_RELOCS 0
213
#endif
214
 
215
#define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
216
 
217
/* Relocation HOWTO's.  */
218
static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
219
 
220
static reloc_howto_type ppc64_elf_howto_raw[] = {
221
  /* This reloc does nothing.  */
222
  HOWTO (R_PPC64_NONE,          /* type */
223
         0,                      /* rightshift */
224
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
225
         32,                    /* bitsize */
226
         FALSE,                 /* pc_relative */
227
         0,                      /* bitpos */
228
         complain_overflow_dont, /* complain_on_overflow */
229
         bfd_elf_generic_reloc, /* special_function */
230
         "R_PPC64_NONE",        /* name */
231
         FALSE,                 /* partial_inplace */
232
         0,                      /* src_mask */
233
         0,                      /* dst_mask */
234
         FALSE),                /* pcrel_offset */
235
 
236
  /* A standard 32 bit relocation.  */
237
  HOWTO (R_PPC64_ADDR32,        /* type */
238
         0,                      /* rightshift */
239
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
240
         32,                    /* bitsize */
241
         FALSE,                 /* pc_relative */
242
         0,                      /* bitpos */
243
         complain_overflow_bitfield, /* complain_on_overflow */
244
         bfd_elf_generic_reloc, /* special_function */
245
         "R_PPC64_ADDR32",      /* name */
246
         FALSE,                 /* partial_inplace */
247
         0,                      /* src_mask */
248
         0xffffffff,            /* dst_mask */
249
         FALSE),                /* pcrel_offset */
250
 
251
  /* An absolute 26 bit branch; the lower two bits must be zero.
252
     FIXME: we don't check that, we just clear them.  */
253
  HOWTO (R_PPC64_ADDR24,        /* type */
254
         0,                      /* rightshift */
255
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
256
         26,                    /* bitsize */
257
         FALSE,                 /* pc_relative */
258
         0,                      /* bitpos */
259
         complain_overflow_bitfield, /* complain_on_overflow */
260
         bfd_elf_generic_reloc, /* special_function */
261
         "R_PPC64_ADDR24",      /* name */
262
         FALSE,                 /* partial_inplace */
263
         0,                      /* src_mask */
264
         0x03fffffc,            /* dst_mask */
265
         FALSE),                /* pcrel_offset */
266
 
267
  /* A standard 16 bit relocation.  */
268
  HOWTO (R_PPC64_ADDR16,        /* type */
269
         0,                      /* rightshift */
270
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
271
         16,                    /* bitsize */
272
         FALSE,                 /* pc_relative */
273
         0,                      /* bitpos */
274
         complain_overflow_bitfield, /* complain_on_overflow */
275
         bfd_elf_generic_reloc, /* special_function */
276
         "R_PPC64_ADDR16",      /* name */
277
         FALSE,                 /* partial_inplace */
278
         0,                      /* src_mask */
279
         0xffff,                /* dst_mask */
280
         FALSE),                /* pcrel_offset */
281
 
282
  /* A 16 bit relocation without overflow.  */
283
  HOWTO (R_PPC64_ADDR16_LO,     /* type */
284
         0,                      /* rightshift */
285
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
286
         16,                    /* bitsize */
287
         FALSE,                 /* pc_relative */
288
         0,                      /* bitpos */
289
         complain_overflow_dont,/* complain_on_overflow */
290
         bfd_elf_generic_reloc, /* special_function */
291
         "R_PPC64_ADDR16_LO",   /* name */
292
         FALSE,                 /* partial_inplace */
293
         0,                      /* src_mask */
294
         0xffff,                /* dst_mask */
295
         FALSE),                /* pcrel_offset */
296
 
297
  /* Bits 16-31 of an address.  */
298
  HOWTO (R_PPC64_ADDR16_HI,     /* type */
299
         16,                    /* rightshift */
300
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
301
         16,                    /* bitsize */
302
         FALSE,                 /* pc_relative */
303
         0,                      /* bitpos */
304
         complain_overflow_dont, /* complain_on_overflow */
305
         bfd_elf_generic_reloc, /* special_function */
306
         "R_PPC64_ADDR16_HI",   /* name */
307
         FALSE,                 /* partial_inplace */
308
         0,                      /* src_mask */
309
         0xffff,                /* dst_mask */
310
         FALSE),                /* pcrel_offset */
311
 
312
  /* Bits 16-31 of an address, plus 1 if the contents of the low 16
313
     bits, treated as a signed number, is negative.  */
314
  HOWTO (R_PPC64_ADDR16_HA,     /* type */
315
         16,                    /* rightshift */
316
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
317
         16,                    /* bitsize */
318
         FALSE,                 /* pc_relative */
319
         0,                      /* bitpos */
320
         complain_overflow_dont, /* complain_on_overflow */
321
         ppc64_elf_ha_reloc,    /* special_function */
322
         "R_PPC64_ADDR16_HA",   /* name */
323
         FALSE,                 /* partial_inplace */
324
         0,                      /* src_mask */
325
         0xffff,                /* dst_mask */
326
         FALSE),                /* pcrel_offset */
327
 
328
  /* An absolute 16 bit branch; the lower two bits must be zero.
329
     FIXME: we don't check that, we just clear them.  */
330
  HOWTO (R_PPC64_ADDR14,        /* type */
331
         0,                      /* rightshift */
332
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
333
         16,                    /* bitsize */
334
         FALSE,                 /* pc_relative */
335
         0,                      /* bitpos */
336
         complain_overflow_bitfield, /* complain_on_overflow */
337
         ppc64_elf_branch_reloc, /* special_function */
338
         "R_PPC64_ADDR14",      /* name */
339
         FALSE,                 /* partial_inplace */
340
         0,                      /* src_mask */
341
         0x0000fffc,            /* dst_mask */
342
         FALSE),                /* pcrel_offset */
343
 
344
  /* An absolute 16 bit branch, for which bit 10 should be set to
345
     indicate that the branch is expected to be taken.  The lower two
346
     bits must be zero.  */
347
  HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */
348
         0,                      /* rightshift */
349
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
350
         16,                    /* bitsize */
351
         FALSE,                 /* pc_relative */
352
         0,                      /* bitpos */
353
         complain_overflow_bitfield, /* complain_on_overflow */
354
         ppc64_elf_brtaken_reloc, /* special_function */
355
         "R_PPC64_ADDR14_BRTAKEN",/* name */
356
         FALSE,                 /* partial_inplace */
357
         0,                      /* src_mask */
358
         0x0000fffc,            /* dst_mask */
359
         FALSE),                /* pcrel_offset */
360
 
361
  /* An absolute 16 bit branch, for which bit 10 should be set to
362
     indicate that the branch is not expected to be taken.  The lower
363
     two bits must be zero.  */
364
  HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */
365
         0,                      /* rightshift */
366
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
367
         16,                    /* bitsize */
368
         FALSE,                 /* pc_relative */
369
         0,                      /* bitpos */
370
         complain_overflow_bitfield, /* complain_on_overflow */
371
         ppc64_elf_brtaken_reloc, /* special_function */
372
         "R_PPC64_ADDR14_BRNTAKEN",/* name */
373
         FALSE,                 /* partial_inplace */
374
         0,                      /* src_mask */
375
         0x0000fffc,            /* dst_mask */
376
         FALSE),                /* pcrel_offset */
377
 
378
  /* A relative 26 bit branch; the lower two bits must be zero.  */
379
  HOWTO (R_PPC64_REL24,         /* type */
380
         0,                      /* rightshift */
381
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
382
         26,                    /* bitsize */
383
         TRUE,                  /* pc_relative */
384
         0,                      /* bitpos */
385
         complain_overflow_signed, /* complain_on_overflow */
386
         ppc64_elf_branch_reloc, /* special_function */
387
         "R_PPC64_REL24",       /* name */
388
         FALSE,                 /* partial_inplace */
389
         0,                      /* src_mask */
390
         0x03fffffc,            /* dst_mask */
391
         TRUE),                 /* pcrel_offset */
392
 
393
  /* A relative 16 bit branch; the lower two bits must be zero.  */
394
  HOWTO (R_PPC64_REL14,         /* type */
395
         0,                      /* rightshift */
396
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
397
         16,                    /* bitsize */
398
         TRUE,                  /* pc_relative */
399
         0,                      /* bitpos */
400
         complain_overflow_signed, /* complain_on_overflow */
401
         ppc64_elf_branch_reloc, /* special_function */
402
         "R_PPC64_REL14",       /* name */
403
         FALSE,                 /* partial_inplace */
404
         0,                      /* src_mask */
405
         0x0000fffc,            /* dst_mask */
406
         TRUE),                 /* pcrel_offset */
407
 
408
  /* A relative 16 bit branch.  Bit 10 should be set to indicate that
409
     the branch is expected to be taken.  The lower two bits must be
410
     zero.  */
411
  HOWTO (R_PPC64_REL14_BRTAKEN, /* type */
412
         0,                      /* rightshift */
413
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
414
         16,                    /* bitsize */
415
         TRUE,                  /* pc_relative */
416
         0,                      /* bitpos */
417
         complain_overflow_signed, /* complain_on_overflow */
418
         ppc64_elf_brtaken_reloc, /* special_function */
419
         "R_PPC64_REL14_BRTAKEN", /* name */
420
         FALSE,                 /* partial_inplace */
421
         0,                      /* src_mask */
422
         0x0000fffc,            /* dst_mask */
423
         TRUE),                 /* pcrel_offset */
424
 
425
  /* A relative 16 bit branch.  Bit 10 should be set to indicate that
426
     the branch is not expected to be taken.  The lower two bits must
427
     be zero.  */
428
  HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */
429
         0,                      /* rightshift */
430
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
431
         16,                    /* bitsize */
432
         TRUE,                  /* pc_relative */
433
         0,                      /* bitpos */
434
         complain_overflow_signed, /* complain_on_overflow */
435
         ppc64_elf_brtaken_reloc, /* special_function */
436
         "R_PPC64_REL14_BRNTAKEN",/* name */
437
         FALSE,                 /* partial_inplace */
438
         0,                      /* src_mask */
439
         0x0000fffc,            /* dst_mask */
440
         TRUE),                 /* pcrel_offset */
441
 
442
  /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
443
     symbol.  */
444
  HOWTO (R_PPC64_GOT16,         /* type */
445
         0,                      /* rightshift */
446
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
447
         16,                    /* bitsize */
448
         FALSE,                 /* pc_relative */
449
         0,                      /* bitpos */
450
         complain_overflow_signed, /* complain_on_overflow */
451
         ppc64_elf_unhandled_reloc, /* special_function */
452
         "R_PPC64_GOT16",       /* name */
453
         FALSE,                 /* partial_inplace */
454
         0,                      /* src_mask */
455
         0xffff,                /* dst_mask */
456
         FALSE),                /* pcrel_offset */
457
 
458
  /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
459
     the symbol.  */
460
  HOWTO (R_PPC64_GOT16_LO,      /* type */
461
         0,                      /* rightshift */
462
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
463
         16,                    /* bitsize */
464
         FALSE,                 /* pc_relative */
465
         0,                      /* bitpos */
466
         complain_overflow_dont, /* complain_on_overflow */
467
         ppc64_elf_unhandled_reloc, /* special_function */
468
         "R_PPC64_GOT16_LO",    /* name */
469
         FALSE,                 /* partial_inplace */
470
         0,                      /* src_mask */
471
         0xffff,                /* dst_mask */
472
         FALSE),                /* pcrel_offset */
473
 
474
  /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
475
     the symbol.  */
476
  HOWTO (R_PPC64_GOT16_HI,      /* type */
477
         16,                    /* rightshift */
478
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
479
         16,                    /* bitsize */
480
         FALSE,                 /* pc_relative */
481
         0,                      /* bitpos */
482
         complain_overflow_dont,/* complain_on_overflow */
483
         ppc64_elf_unhandled_reloc, /* special_function */
484
         "R_PPC64_GOT16_HI",    /* name */
485
         FALSE,                 /* partial_inplace */
486
         0,                      /* src_mask */
487
         0xffff,                /* dst_mask */
488
         FALSE),                /* pcrel_offset */
489
 
490
  /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
491
     the symbol.  */
492
  HOWTO (R_PPC64_GOT16_HA,      /* type */
493
         16,                    /* rightshift */
494
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
495
         16,                    /* bitsize */
496
         FALSE,                 /* pc_relative */
497
         0,                      /* bitpos */
498
         complain_overflow_dont,/* complain_on_overflow */
499
         ppc64_elf_unhandled_reloc, /* special_function */
500
         "R_PPC64_GOT16_HA",    /* name */
501
         FALSE,                 /* partial_inplace */
502
         0,                      /* src_mask */
503
         0xffff,                /* dst_mask */
504
         FALSE),                /* pcrel_offset */
505
 
506
  /* This is used only by the dynamic linker.  The symbol should exist
507
     both in the object being run and in some shared library.  The
508
     dynamic linker copies the data addressed by the symbol from the
509
     shared library into the object, because the object being
510
     run has to have the data at some particular address.  */
511
  HOWTO (R_PPC64_COPY,          /* type */
512
         0,                      /* rightshift */
513
         0,                      /* this one is variable size */
514
         0,                      /* bitsize */
515
         FALSE,                 /* pc_relative */
516
         0,                      /* bitpos */
517
         complain_overflow_dont, /* complain_on_overflow */
518
         ppc64_elf_unhandled_reloc, /* special_function */
519
         "R_PPC64_COPY",        /* name */
520
         FALSE,                 /* partial_inplace */
521
         0,                      /* src_mask */
522
         0,                      /* dst_mask */
523
         FALSE),                /* pcrel_offset */
524
 
525
  /* Like R_PPC64_ADDR64, but used when setting global offset table
526
     entries.  */
527
  HOWTO (R_PPC64_GLOB_DAT,      /* type */
528
         0,                      /* rightshift */
529
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
530
         64,                    /* bitsize */
531
         FALSE,                 /* pc_relative */
532
         0,                      /* bitpos */
533
         complain_overflow_dont, /* complain_on_overflow */
534
         ppc64_elf_unhandled_reloc,  /* special_function */
535
         "R_PPC64_GLOB_DAT",    /* name */
536
         FALSE,                 /* partial_inplace */
537
         0,                      /* src_mask */
538
         ONES (64),             /* dst_mask */
539
         FALSE),                /* pcrel_offset */
540
 
541
  /* Created by the link editor.  Marks a procedure linkage table
542
     entry for a symbol.  */
543
  HOWTO (R_PPC64_JMP_SLOT,      /* type */
544
         0,                      /* rightshift */
545
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
546
         0,                      /* bitsize */
547
         FALSE,                 /* pc_relative */
548
         0,                      /* bitpos */
549
         complain_overflow_dont, /* complain_on_overflow */
550
         ppc64_elf_unhandled_reloc, /* special_function */
551
         "R_PPC64_JMP_SLOT",    /* name */
552
         FALSE,                 /* partial_inplace */
553
         0,                      /* src_mask */
554
         0,                      /* dst_mask */
555
         FALSE),                /* pcrel_offset */
556
 
557
  /* Used only by the dynamic linker.  When the object is run, this
558
     doubleword64 is set to the load address of the object, plus the
559
     addend.  */
560
  HOWTO (R_PPC64_RELATIVE,      /* type */
561
         0,                      /* rightshift */
562
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
563
         64,                    /* bitsize */
564
         FALSE,                 /* pc_relative */
565
         0,                      /* bitpos */
566
         complain_overflow_dont, /* complain_on_overflow */
567
         bfd_elf_generic_reloc, /* special_function */
568
         "R_PPC64_RELATIVE",    /* name */
569
         FALSE,                 /* partial_inplace */
570
         0,                      /* src_mask */
571
         ONES (64),             /* dst_mask */
572
         FALSE),                /* pcrel_offset */
573
 
574
  /* Like R_PPC64_ADDR32, but may be unaligned.  */
575
  HOWTO (R_PPC64_UADDR32,       /* type */
576
         0,                      /* rightshift */
577
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
578
         32,                    /* bitsize */
579
         FALSE,                 /* pc_relative */
580
         0,                      /* bitpos */
581
         complain_overflow_bitfield, /* complain_on_overflow */
582
         bfd_elf_generic_reloc, /* special_function */
583
         "R_PPC64_UADDR32",     /* name */
584
         FALSE,                 /* partial_inplace */
585
         0,                      /* src_mask */
586
         0xffffffff,            /* dst_mask */
587
         FALSE),                /* pcrel_offset */
588
 
589
  /* Like R_PPC64_ADDR16, but may be unaligned.  */
590
  HOWTO (R_PPC64_UADDR16,       /* type */
591
         0,                      /* rightshift */
592
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
593
         16,                    /* bitsize */
594
         FALSE,                 /* pc_relative */
595
         0,                      /* bitpos */
596
         complain_overflow_bitfield, /* complain_on_overflow */
597
         bfd_elf_generic_reloc, /* special_function */
598
         "R_PPC64_UADDR16",     /* name */
599
         FALSE,                 /* partial_inplace */
600
         0,                      /* src_mask */
601
         0xffff,                /* dst_mask */
602
         FALSE),                /* pcrel_offset */
603
 
604
  /* 32-bit PC relative.  */
605
  HOWTO (R_PPC64_REL32,         /* type */
606
         0,                      /* rightshift */
607
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
608
         32,                    /* bitsize */
609
         TRUE,                  /* pc_relative */
610
         0,                      /* bitpos */
611
         /* FIXME: Verify.  Was complain_overflow_bitfield.  */
612
         complain_overflow_signed, /* complain_on_overflow */
613
         bfd_elf_generic_reloc, /* special_function */
614
         "R_PPC64_REL32",       /* name */
615
         FALSE,                 /* partial_inplace */
616
         0,                      /* src_mask */
617
         0xffffffff,            /* dst_mask */
618
         TRUE),                 /* pcrel_offset */
619
 
620
  /* 32-bit relocation to the symbol's procedure linkage table.  */
621
  HOWTO (R_PPC64_PLT32,         /* type */
622
         0,                      /* rightshift */
623
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
624
         32,                    /* bitsize */
625
         FALSE,                 /* pc_relative */
626
         0,                      /* bitpos */
627
         complain_overflow_bitfield, /* complain_on_overflow */
628
         ppc64_elf_unhandled_reloc, /* special_function */
629
         "R_PPC64_PLT32",       /* name */
630
         FALSE,                 /* partial_inplace */
631
         0,                      /* src_mask */
632
         0xffffffff,            /* dst_mask */
633
         FALSE),                /* pcrel_offset */
634
 
635
  /* 32-bit PC relative relocation to the symbol's procedure linkage table.
636
     FIXME: R_PPC64_PLTREL32 not supported.  */
637
  HOWTO (R_PPC64_PLTREL32,      /* type */
638
         0,                      /* rightshift */
639
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
640
         32,                    /* bitsize */
641
         TRUE,                  /* pc_relative */
642
         0,                      /* bitpos */
643
         complain_overflow_signed, /* complain_on_overflow */
644
         bfd_elf_generic_reloc, /* special_function */
645
         "R_PPC64_PLTREL32",    /* name */
646
         FALSE,                 /* partial_inplace */
647
         0,                      /* src_mask */
648
         0xffffffff,            /* dst_mask */
649
         TRUE),                 /* pcrel_offset */
650
 
651
  /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
652
     the symbol.  */
653
  HOWTO (R_PPC64_PLT16_LO,      /* type */
654
         0,                      /* rightshift */
655
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
656
         16,                    /* bitsize */
657
         FALSE,                 /* pc_relative */
658
         0,                      /* bitpos */
659
         complain_overflow_dont, /* complain_on_overflow */
660
         ppc64_elf_unhandled_reloc, /* special_function */
661
         "R_PPC64_PLT16_LO",    /* name */
662
         FALSE,                 /* partial_inplace */
663
         0,                      /* src_mask */
664
         0xffff,                /* dst_mask */
665
         FALSE),                /* pcrel_offset */
666
 
667
  /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
668
     the symbol.  */
669
  HOWTO (R_PPC64_PLT16_HI,      /* type */
670
         16,                    /* rightshift */
671
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
672
         16,                    /* bitsize */
673
         FALSE,                 /* pc_relative */
674
         0,                      /* bitpos */
675
         complain_overflow_dont, /* complain_on_overflow */
676
         ppc64_elf_unhandled_reloc, /* special_function */
677
         "R_PPC64_PLT16_HI",    /* name */
678
         FALSE,                 /* partial_inplace */
679
         0,                      /* src_mask */
680
         0xffff,                /* dst_mask */
681
         FALSE),                /* pcrel_offset */
682
 
683
  /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
684
     the symbol.  */
685
  HOWTO (R_PPC64_PLT16_HA,      /* type */
686
         16,                    /* rightshift */
687
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
688
         16,                    /* bitsize */
689
         FALSE,                 /* pc_relative */
690
         0,                      /* bitpos */
691
         complain_overflow_dont, /* complain_on_overflow */
692
         ppc64_elf_unhandled_reloc, /* special_function */
693
         "R_PPC64_PLT16_HA",    /* name */
694
         FALSE,                 /* partial_inplace */
695
         0,                      /* src_mask */
696
         0xffff,                /* dst_mask */
697
         FALSE),                /* pcrel_offset */
698
 
699
  /* 16-bit section relative relocation.  */
700
  HOWTO (R_PPC64_SECTOFF,       /* type */
701
         0,                      /* rightshift */
702
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
703
         16,                    /* bitsize */
704
         FALSE,                 /* pc_relative */
705
         0,                      /* bitpos */
706
         complain_overflow_bitfield, /* complain_on_overflow */
707
         ppc64_elf_sectoff_reloc, /* special_function */
708
         "R_PPC64_SECTOFF",     /* name */
709
         FALSE,                 /* partial_inplace */
710
         0,                      /* src_mask */
711
         0xffff,                /* dst_mask */
712
         FALSE),                /* pcrel_offset */
713
 
714
  /* Like R_PPC64_SECTOFF, but no overflow warning.  */
715
  HOWTO (R_PPC64_SECTOFF_LO,    /* type */
716
         0,                      /* rightshift */
717
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
718
         16,                    /* bitsize */
719
         FALSE,                 /* pc_relative */
720
         0,                      /* bitpos */
721
         complain_overflow_dont, /* complain_on_overflow */
722
         ppc64_elf_sectoff_reloc, /* special_function */
723
         "R_PPC64_SECTOFF_LO",  /* name */
724
         FALSE,                 /* partial_inplace */
725
         0,                      /* src_mask */
726
         0xffff,                /* dst_mask */
727
         FALSE),                /* pcrel_offset */
728
 
729
  /* 16-bit upper half section relative relocation.  */
730
  HOWTO (R_PPC64_SECTOFF_HI,    /* type */
731
         16,                    /* rightshift */
732
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
733
         16,                    /* bitsize */
734
         FALSE,                 /* pc_relative */
735
         0,                      /* bitpos */
736
         complain_overflow_dont, /* complain_on_overflow */
737
         ppc64_elf_sectoff_reloc, /* special_function */
738
         "R_PPC64_SECTOFF_HI",  /* name */
739
         FALSE,                 /* partial_inplace */
740
         0,                      /* src_mask */
741
         0xffff,                /* dst_mask */
742
         FALSE),                /* pcrel_offset */
743
 
744
  /* 16-bit upper half adjusted section relative relocation.  */
745
  HOWTO (R_PPC64_SECTOFF_HA,    /* type */
746
         16,                    /* rightshift */
747
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
748
         16,                    /* bitsize */
749
         FALSE,                 /* pc_relative */
750
         0,                      /* bitpos */
751
         complain_overflow_dont, /* complain_on_overflow */
752
         ppc64_elf_sectoff_ha_reloc, /* special_function */
753
         "R_PPC64_SECTOFF_HA",  /* name */
754
         FALSE,                 /* partial_inplace */
755
         0,                      /* src_mask */
756
         0xffff,                /* dst_mask */
757
         FALSE),                /* pcrel_offset */
758
 
759
  /* Like R_PPC64_REL24 without touching the two least significant bits.  */
760
  HOWTO (R_PPC64_REL30,         /* type */
761
         2,                     /* rightshift */
762
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
763
         30,                    /* bitsize */
764
         TRUE,                  /* pc_relative */
765
         0,                      /* bitpos */
766
         complain_overflow_dont, /* complain_on_overflow */
767
         bfd_elf_generic_reloc, /* special_function */
768
         "R_PPC64_REL30",       /* name */
769
         FALSE,                 /* partial_inplace */
770
         0,                      /* src_mask */
771
         0xfffffffc,            /* dst_mask */
772
         TRUE),                 /* pcrel_offset */
773
 
774
  /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI.  */
775
 
776
  /* A standard 64-bit relocation.  */
777
  HOWTO (R_PPC64_ADDR64,        /* type */
778
         0,                      /* rightshift */
779
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
780
         64,                    /* bitsize */
781
         FALSE,                 /* pc_relative */
782
         0,                      /* bitpos */
783
         complain_overflow_dont, /* complain_on_overflow */
784
         bfd_elf_generic_reloc, /* special_function */
785
         "R_PPC64_ADDR64",      /* name */
786
         FALSE,                 /* partial_inplace */
787
         0,                      /* src_mask */
788
         ONES (64),             /* dst_mask */
789
         FALSE),                /* pcrel_offset */
790
 
791
  /* The bits 32-47 of an address.  */
792
  HOWTO (R_PPC64_ADDR16_HIGHER, /* type */
793
         32,                    /* rightshift */
794
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
795
         16,                    /* bitsize */
796
         FALSE,                 /* pc_relative */
797
         0,                      /* bitpos */
798
         complain_overflow_dont, /* complain_on_overflow */
799
         bfd_elf_generic_reloc, /* special_function */
800
         "R_PPC64_ADDR16_HIGHER", /* name */
801
         FALSE,                 /* partial_inplace */
802
         0,                      /* src_mask */
803
         0xffff,                /* dst_mask */
804
         FALSE),                /* pcrel_offset */
805
 
806
  /* The bits 32-47 of an address, plus 1 if the contents of the low
807
     16 bits, treated as a signed number, is negative.  */
808
  HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */
809
         32,                    /* rightshift */
810
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
811
         16,                    /* bitsize */
812
         FALSE,                 /* pc_relative */
813
         0,                      /* bitpos */
814
         complain_overflow_dont, /* complain_on_overflow */
815
         ppc64_elf_ha_reloc,    /* special_function */
816
         "R_PPC64_ADDR16_HIGHERA", /* name */
817
         FALSE,                 /* partial_inplace */
818
         0,                      /* src_mask */
819
         0xffff,                /* dst_mask */
820
         FALSE),                /* pcrel_offset */
821
 
822
  /* The bits 48-63 of an address.  */
823
  HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */
824
         48,                    /* rightshift */
825
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
826
         16,                    /* bitsize */
827
         FALSE,                 /* pc_relative */
828
         0,                      /* bitpos */
829
         complain_overflow_dont, /* complain_on_overflow */
830
         bfd_elf_generic_reloc, /* special_function */
831
         "R_PPC64_ADDR16_HIGHEST", /* name */
832
         FALSE,                 /* partial_inplace */
833
         0,                      /* src_mask */
834
         0xffff,                /* dst_mask */
835
         FALSE),                /* pcrel_offset */
836
 
837
  /* The bits 48-63 of an address, plus 1 if the contents of the low
838
     16 bits, treated as a signed number, is negative.  */
839
  HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */
840
         48,                    /* rightshift */
841
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
842
         16,                    /* bitsize */
843
         FALSE,                 /* pc_relative */
844
         0,                      /* bitpos */
845
         complain_overflow_dont, /* complain_on_overflow */
846
         ppc64_elf_ha_reloc,    /* special_function */
847
         "R_PPC64_ADDR16_HIGHESTA", /* name */
848
         FALSE,                 /* partial_inplace */
849
         0,                      /* src_mask */
850
         0xffff,                /* dst_mask */
851
         FALSE),                /* pcrel_offset */
852
 
853
  /* Like ADDR64, but may be unaligned.  */
854
  HOWTO (R_PPC64_UADDR64,       /* type */
855
         0,                      /* rightshift */
856
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
857
         64,                    /* bitsize */
858
         FALSE,                 /* pc_relative */
859
         0,                      /* bitpos */
860
         complain_overflow_dont, /* complain_on_overflow */
861
         bfd_elf_generic_reloc, /* special_function */
862
         "R_PPC64_UADDR64",     /* name */
863
         FALSE,                 /* partial_inplace */
864
         0,                      /* src_mask */
865
         ONES (64),             /* dst_mask */
866
         FALSE),                /* pcrel_offset */
867
 
868
  /* 64-bit relative relocation.  */
869
  HOWTO (R_PPC64_REL64,         /* type */
870
         0,                      /* rightshift */
871
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
872
         64,                    /* bitsize */
873
         TRUE,                  /* pc_relative */
874
         0,                      /* bitpos */
875
         complain_overflow_dont, /* complain_on_overflow */
876
         bfd_elf_generic_reloc, /* special_function */
877
         "R_PPC64_REL64",       /* name */
878
         FALSE,                 /* partial_inplace */
879
         0,                      /* src_mask */
880
         ONES (64),             /* dst_mask */
881
         TRUE),                 /* pcrel_offset */
882
 
883
  /* 64-bit relocation to the symbol's procedure linkage table.  */
884
  HOWTO (R_PPC64_PLT64,         /* type */
885
         0,                      /* rightshift */
886
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
887
         64,                    /* bitsize */
888
         FALSE,                 /* pc_relative */
889
         0,                      /* bitpos */
890
         complain_overflow_dont, /* complain_on_overflow */
891
         ppc64_elf_unhandled_reloc, /* special_function */
892
         "R_PPC64_PLT64",       /* name */
893
         FALSE,                 /* partial_inplace */
894
         0,                      /* src_mask */
895
         ONES (64),             /* dst_mask */
896
         FALSE),                /* pcrel_offset */
897
 
898
  /* 64-bit PC relative relocation to the symbol's procedure linkage
899
     table.  */
900
  /* FIXME: R_PPC64_PLTREL64 not supported.  */
901
  HOWTO (R_PPC64_PLTREL64,      /* type */
902
         0,                      /* rightshift */
903
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
904
         64,                    /* bitsize */
905
         TRUE,                  /* pc_relative */
906
         0,                      /* bitpos */
907
         complain_overflow_dont, /* complain_on_overflow */
908
         ppc64_elf_unhandled_reloc, /* special_function */
909
         "R_PPC64_PLTREL64",    /* name */
910
         FALSE,                 /* partial_inplace */
911
         0,                      /* src_mask */
912
         ONES (64),             /* dst_mask */
913
         TRUE),                 /* pcrel_offset */
914
 
915
  /* 16 bit TOC-relative relocation.  */
916
 
917
  /* R_PPC64_TOC16        47       half16*      S + A - .TOC.  */
918
  HOWTO (R_PPC64_TOC16,         /* type */
919
         0,                      /* rightshift */
920
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
921
         16,                    /* bitsize */
922
         FALSE,                 /* pc_relative */
923
         0,                      /* bitpos */
924
         complain_overflow_signed, /* complain_on_overflow */
925
         ppc64_elf_toc_reloc,   /* special_function */
926
         "R_PPC64_TOC16",       /* name */
927
         FALSE,                 /* partial_inplace */
928
         0,                      /* src_mask */
929
         0xffff,                /* dst_mask */
930
         FALSE),                /* pcrel_offset */
931
 
932
  /* 16 bit TOC-relative relocation without overflow.  */
933
 
934
  /* R_PPC64_TOC16_LO     48       half16        #lo (S + A - .TOC.)  */
935
  HOWTO (R_PPC64_TOC16_LO,      /* type */
936
         0,                      /* rightshift */
937
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
938
         16,                    /* bitsize */
939
         FALSE,                 /* pc_relative */
940
         0,                      /* bitpos */
941
         complain_overflow_dont, /* complain_on_overflow */
942
         ppc64_elf_toc_reloc,   /* special_function */
943
         "R_PPC64_TOC16_LO",    /* name */
944
         FALSE,                 /* partial_inplace */
945
         0,                      /* src_mask */
946
         0xffff,                /* dst_mask */
947
         FALSE),                /* pcrel_offset */
948
 
949
  /* 16 bit TOC-relative relocation, high 16 bits.  */
950
 
951
  /* R_PPC64_TOC16_HI     49       half16        #hi (S + A - .TOC.)  */
952
  HOWTO (R_PPC64_TOC16_HI,      /* type */
953
         16,                    /* rightshift */
954
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
955
         16,                    /* bitsize */
956
         FALSE,                 /* pc_relative */
957
         0,                      /* bitpos */
958
         complain_overflow_dont, /* complain_on_overflow */
959
         ppc64_elf_toc_reloc,   /* special_function */
960
         "R_PPC64_TOC16_HI",    /* name */
961
         FALSE,                 /* partial_inplace */
962
         0,                      /* src_mask */
963
         0xffff,                /* dst_mask */
964
         FALSE),                /* pcrel_offset */
965
 
966
  /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
967
     contents of the low 16 bits, treated as a signed number, is
968
     negative.  */
969
 
970
  /* R_PPC64_TOC16_HA     50       half16        #ha (S + A - .TOC.)  */
971
  HOWTO (R_PPC64_TOC16_HA,      /* type */
972
         16,                    /* rightshift */
973
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
974
         16,                    /* bitsize */
975
         FALSE,                 /* pc_relative */
976
         0,                      /* bitpos */
977
         complain_overflow_dont, /* complain_on_overflow */
978
         ppc64_elf_toc_ha_reloc, /* special_function */
979
         "R_PPC64_TOC16_HA",    /* name */
980
         FALSE,                 /* partial_inplace */
981
         0,                      /* src_mask */
982
         0xffff,                /* dst_mask */
983
         FALSE),                /* pcrel_offset */
984
 
985
  /* 64-bit relocation; insert value of TOC base (.TOC.).  */
986
 
987
  /* R_PPC64_TOC                  51       doubleword64  .TOC.  */
988
  HOWTO (R_PPC64_TOC,           /* type */
989
         0,                      /* rightshift */
990
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
991
         64,                    /* bitsize */
992
         FALSE,                 /* pc_relative */
993
         0,                      /* bitpos */
994
         complain_overflow_bitfield, /* complain_on_overflow */
995
         ppc64_elf_toc64_reloc, /* special_function */
996
         "R_PPC64_TOC",         /* name */
997
         FALSE,                 /* partial_inplace */
998
         0,                      /* src_mask */
999
         ONES (64),             /* dst_mask */
1000
         FALSE),                /* pcrel_offset */
1001
 
1002
  /* Like R_PPC64_GOT16, but also informs the link editor that the
1003
     value to relocate may (!) refer to a PLT entry which the link
1004
     editor (a) may replace with the symbol value.  If the link editor
1005
     is unable to fully resolve the symbol, it may (b) create a PLT
1006
     entry and store the address to the new PLT entry in the GOT.
1007
     This permits lazy resolution of function symbols at run time.
1008
     The link editor may also skip all of this and just (c) emit a
1009
     R_PPC64_GLOB_DAT to tie the symbol to the GOT entry.  */
1010
  /* FIXME: R_PPC64_PLTGOT16 not implemented.  */
1011
    HOWTO (R_PPC64_PLTGOT16,    /* type */
1012
         0,                      /* rightshift */
1013
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1014
         16,                    /* bitsize */
1015
         FALSE,                 /* pc_relative */
1016
         0,                      /* bitpos */
1017
         complain_overflow_signed, /* complain_on_overflow */
1018
         ppc64_elf_unhandled_reloc, /* special_function */
1019
         "R_PPC64_PLTGOT16",    /* name */
1020
         FALSE,                 /* partial_inplace */
1021
         0,                      /* src_mask */
1022
         0xffff,                /* dst_mask */
1023
         FALSE),                /* pcrel_offset */
1024
 
1025
  /* Like R_PPC64_PLTGOT16, but without overflow.  */
1026
  /* FIXME: R_PPC64_PLTGOT16_LO not implemented.  */
1027
  HOWTO (R_PPC64_PLTGOT16_LO,   /* type */
1028
         0,                      /* rightshift */
1029
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1030
         16,                    /* bitsize */
1031
         FALSE,                 /* pc_relative */
1032
         0,                      /* bitpos */
1033
         complain_overflow_dont, /* complain_on_overflow */
1034
         ppc64_elf_unhandled_reloc, /* special_function */
1035
         "R_PPC64_PLTGOT16_LO", /* name */
1036
         FALSE,                 /* partial_inplace */
1037
         0,                      /* src_mask */
1038
         0xffff,                /* dst_mask */
1039
         FALSE),                /* pcrel_offset */
1040
 
1041
  /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address.  */
1042
  /* FIXME: R_PPC64_PLTGOT16_HI not implemented.  */
1043
  HOWTO (R_PPC64_PLTGOT16_HI,   /* type */
1044
         16,                    /* rightshift */
1045
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1046
         16,                    /* bitsize */
1047
         FALSE,                 /* pc_relative */
1048
         0,                      /* bitpos */
1049
         complain_overflow_dont, /* complain_on_overflow */
1050
         ppc64_elf_unhandled_reloc, /* special_function */
1051
         "R_PPC64_PLTGOT16_HI", /* name */
1052
         FALSE,                 /* partial_inplace */
1053
         0,                      /* src_mask */
1054
         0xffff,                /* dst_mask */
1055
         FALSE),                /* pcrel_offset */
1056
 
1057
  /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1058
     1 if the contents of the low 16 bits, treated as a signed number,
1059
     is negative.  */
1060
  /* FIXME: R_PPC64_PLTGOT16_HA not implemented.  */
1061
  HOWTO (R_PPC64_PLTGOT16_HA,   /* type */
1062
         16,                    /* rightshift */
1063
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1064
         16,                    /* bitsize */
1065
         FALSE,                 /* pc_relative */
1066
         0,                      /* bitpos */
1067
         complain_overflow_dont,/* complain_on_overflow */
1068
         ppc64_elf_unhandled_reloc, /* special_function */
1069
         "R_PPC64_PLTGOT16_HA", /* name */
1070
         FALSE,                 /* partial_inplace */
1071
         0,                      /* src_mask */
1072
         0xffff,                /* dst_mask */
1073
         FALSE),                /* pcrel_offset */
1074
 
1075
  /* Like R_PPC64_ADDR16, but for instructions with a DS field.  */
1076
  HOWTO (R_PPC64_ADDR16_DS,     /* type */
1077
         0,                      /* rightshift */
1078
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1079
         16,                    /* bitsize */
1080
         FALSE,                 /* pc_relative */
1081
         0,                      /* bitpos */
1082
         complain_overflow_bitfield, /* complain_on_overflow */
1083
         bfd_elf_generic_reloc, /* special_function */
1084
         "R_PPC64_ADDR16_DS",   /* name */
1085
         FALSE,                 /* partial_inplace */
1086
         0,                      /* src_mask */
1087
         0xfffc,                /* dst_mask */
1088
         FALSE),                /* pcrel_offset */
1089
 
1090
  /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field.  */
1091
  HOWTO (R_PPC64_ADDR16_LO_DS,  /* type */
1092
         0,                      /* rightshift */
1093
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1094
         16,                    /* bitsize */
1095
         FALSE,                 /* pc_relative */
1096
         0,                      /* bitpos */
1097
         complain_overflow_dont,/* complain_on_overflow */
1098
         bfd_elf_generic_reloc, /* special_function */
1099
         "R_PPC64_ADDR16_LO_DS",/* name */
1100
         FALSE,                 /* partial_inplace */
1101
         0,                      /* src_mask */
1102
         0xfffc,                /* dst_mask */
1103
         FALSE),                /* pcrel_offset */
1104
 
1105
  /* Like R_PPC64_GOT16, but for instructions with a DS field.  */
1106
  HOWTO (R_PPC64_GOT16_DS,      /* type */
1107
         0,                      /* rightshift */
1108
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1109
         16,                    /* bitsize */
1110
         FALSE,                 /* pc_relative */
1111
         0,                      /* bitpos */
1112
         complain_overflow_signed, /* complain_on_overflow */
1113
         ppc64_elf_unhandled_reloc, /* special_function */
1114
         "R_PPC64_GOT16_DS",    /* name */
1115
         FALSE,                 /* partial_inplace */
1116
         0,                      /* src_mask */
1117
         0xfffc,                /* dst_mask */
1118
         FALSE),                /* pcrel_offset */
1119
 
1120
  /* Like R_PPC64_GOT16_LO, but for instructions with a DS field.  */
1121
  HOWTO (R_PPC64_GOT16_LO_DS,   /* type */
1122
         0,                      /* rightshift */
1123
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1124
         16,                    /* bitsize */
1125
         FALSE,                 /* pc_relative */
1126
         0,                      /* bitpos */
1127
         complain_overflow_dont, /* complain_on_overflow */
1128
         ppc64_elf_unhandled_reloc, /* special_function */
1129
         "R_PPC64_GOT16_LO_DS", /* name */
1130
         FALSE,                 /* partial_inplace */
1131
         0,                      /* src_mask */
1132
         0xfffc,                /* dst_mask */
1133
         FALSE),                /* pcrel_offset */
1134
 
1135
  /* Like R_PPC64_PLT16_LO, but for instructions with a DS field.  */
1136
  HOWTO (R_PPC64_PLT16_LO_DS,   /* type */
1137
         0,                      /* rightshift */
1138
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1139
         16,                    /* bitsize */
1140
         FALSE,                 /* pc_relative */
1141
         0,                      /* bitpos */
1142
         complain_overflow_dont, /* complain_on_overflow */
1143
         ppc64_elf_unhandled_reloc, /* special_function */
1144
         "R_PPC64_PLT16_LO_DS", /* name */
1145
         FALSE,                 /* partial_inplace */
1146
         0,                      /* src_mask */
1147
         0xfffc,                /* dst_mask */
1148
         FALSE),                /* pcrel_offset */
1149
 
1150
  /* Like R_PPC64_SECTOFF, but for instructions with a DS field.  */
1151
  HOWTO (R_PPC64_SECTOFF_DS,    /* type */
1152
         0,                      /* rightshift */
1153
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1154
         16,                    /* bitsize */
1155
         FALSE,                 /* pc_relative */
1156
         0,                      /* bitpos */
1157
         complain_overflow_bitfield, /* complain_on_overflow */
1158
         ppc64_elf_sectoff_reloc, /* special_function */
1159
         "R_PPC64_SECTOFF_DS",  /* name */
1160
         FALSE,                 /* partial_inplace */
1161
         0,                      /* src_mask */
1162
         0xfffc,                /* dst_mask */
1163
         FALSE),                /* pcrel_offset */
1164
 
1165
  /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field.  */
1166
  HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */
1167
         0,                      /* rightshift */
1168
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1169
         16,                    /* bitsize */
1170
         FALSE,                 /* pc_relative */
1171
         0,                      /* bitpos */
1172
         complain_overflow_dont, /* complain_on_overflow */
1173
         ppc64_elf_sectoff_reloc, /* special_function */
1174
         "R_PPC64_SECTOFF_LO_DS",/* name */
1175
         FALSE,                 /* partial_inplace */
1176
         0,                      /* src_mask */
1177
         0xfffc,                /* dst_mask */
1178
         FALSE),                /* pcrel_offset */
1179
 
1180
  /* Like R_PPC64_TOC16, but for instructions with a DS field.  */
1181
  HOWTO (R_PPC64_TOC16_DS,      /* type */
1182
         0,                      /* rightshift */
1183
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1184
         16,                    /* bitsize */
1185
         FALSE,                 /* pc_relative */
1186
         0,                      /* bitpos */
1187
         complain_overflow_signed, /* complain_on_overflow */
1188
         ppc64_elf_toc_reloc,   /* special_function */
1189
         "R_PPC64_TOC16_DS",    /* name */
1190
         FALSE,                 /* partial_inplace */
1191
         0,                      /* src_mask */
1192
         0xfffc,                /* dst_mask */
1193
         FALSE),                /* pcrel_offset */
1194
 
1195
  /* Like R_PPC64_TOC16_LO, but for instructions with a DS field.  */
1196
  HOWTO (R_PPC64_TOC16_LO_DS,   /* type */
1197
         0,                      /* rightshift */
1198
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1199
         16,                    /* bitsize */
1200
         FALSE,                 /* pc_relative */
1201
         0,                      /* bitpos */
1202
         complain_overflow_dont, /* complain_on_overflow */
1203
         ppc64_elf_toc_reloc,   /* special_function */
1204
         "R_PPC64_TOC16_LO_DS", /* name */
1205
         FALSE,                 /* partial_inplace */
1206
         0,                      /* src_mask */
1207
         0xfffc,                /* dst_mask */
1208
         FALSE),                /* pcrel_offset */
1209
 
1210
  /* Like R_PPC64_PLTGOT16, but for instructions with a DS field.  */
1211
  /* FIXME: R_PPC64_PLTGOT16_DS not implemented.  */
1212
  HOWTO (R_PPC64_PLTGOT16_DS,   /* type */
1213
         0,                      /* rightshift */
1214
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1215
         16,                    /* bitsize */
1216
         FALSE,                 /* pc_relative */
1217
         0,                      /* bitpos */
1218
         complain_overflow_signed, /* complain_on_overflow */
1219
         ppc64_elf_unhandled_reloc, /* special_function */
1220
         "R_PPC64_PLTGOT16_DS", /* name */
1221
         FALSE,                 /* partial_inplace */
1222
         0,                      /* src_mask */
1223
         0xfffc,                /* dst_mask */
1224
         FALSE),                /* pcrel_offset */
1225
 
1226
  /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field.  */
1227
  /* FIXME: R_PPC64_PLTGOT16_LO not implemented.  */
1228
  HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */
1229
         0,                      /* rightshift */
1230
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1231
         16,                    /* bitsize */
1232
         FALSE,                 /* pc_relative */
1233
         0,                      /* bitpos */
1234
         complain_overflow_dont, /* complain_on_overflow */
1235
         ppc64_elf_unhandled_reloc, /* special_function */
1236
         "R_PPC64_PLTGOT16_LO_DS",/* name */
1237
         FALSE,                 /* partial_inplace */
1238
         0,                      /* src_mask */
1239
         0xfffc,                /* dst_mask */
1240
         FALSE),                /* pcrel_offset */
1241
 
1242
  /* Marker relocs for TLS.  */
1243
  HOWTO (R_PPC64_TLS,
1244
         0,                      /* rightshift */
1245
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1246
         32,                    /* bitsize */
1247
         FALSE,                 /* pc_relative */
1248
         0,                      /* bitpos */
1249
         complain_overflow_dont, /* complain_on_overflow */
1250
         bfd_elf_generic_reloc, /* special_function */
1251
         "R_PPC64_TLS",         /* name */
1252
         FALSE,                 /* partial_inplace */
1253
         0,                      /* src_mask */
1254
         0,                      /* dst_mask */
1255
         FALSE),                /* pcrel_offset */
1256
 
1257
  HOWTO (R_PPC64_TLSGD,
1258
         0,                      /* rightshift */
1259
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1260
         32,                    /* bitsize */
1261
         FALSE,                 /* pc_relative */
1262
         0,                      /* bitpos */
1263
         complain_overflow_dont, /* complain_on_overflow */
1264
         bfd_elf_generic_reloc, /* special_function */
1265
         "R_PPC64_TLSGD",       /* name */
1266
         FALSE,                 /* partial_inplace */
1267
         0,                      /* src_mask */
1268
         0,                      /* dst_mask */
1269
         FALSE),                /* pcrel_offset */
1270
 
1271
  HOWTO (R_PPC64_TLSLD,
1272
         0,                      /* rightshift */
1273
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1274
         32,                    /* bitsize */
1275
         FALSE,                 /* pc_relative */
1276
         0,                      /* bitpos */
1277
         complain_overflow_dont, /* complain_on_overflow */
1278
         bfd_elf_generic_reloc, /* special_function */
1279
         "R_PPC64_TLSLD",       /* name */
1280
         FALSE,                 /* partial_inplace */
1281
         0,                      /* src_mask */
1282
         0,                      /* dst_mask */
1283
         FALSE),                /* pcrel_offset */
1284
 
1285 163 khays
  HOWTO (R_PPC64_TOCSAVE,
1286
         0,                      /* rightshift */
1287
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1288
         32,                    /* bitsize */
1289
         FALSE,                 /* pc_relative */
1290
         0,                      /* bitpos */
1291
         complain_overflow_dont, /* complain_on_overflow */
1292
         bfd_elf_generic_reloc, /* special_function */
1293
         "R_PPC64_TOCSAVE",     /* name */
1294
         FALSE,                 /* partial_inplace */
1295
         0,                      /* src_mask */
1296
         0,                      /* dst_mask */
1297
         FALSE),                /* pcrel_offset */
1298
 
1299 14 khays
  /* Computes the load module index of the load module that contains the
1300
     definition of its TLS sym.  */
1301
  HOWTO (R_PPC64_DTPMOD64,
1302
         0,                      /* rightshift */
1303
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
1304
         64,                    /* bitsize */
1305
         FALSE,                 /* pc_relative */
1306
         0,                      /* bitpos */
1307
         complain_overflow_dont, /* complain_on_overflow */
1308
         ppc64_elf_unhandled_reloc, /* special_function */
1309
         "R_PPC64_DTPMOD64",    /* name */
1310
         FALSE,                 /* partial_inplace */
1311
         0,                      /* src_mask */
1312
         ONES (64),             /* dst_mask */
1313
         FALSE),                /* pcrel_offset */
1314
 
1315
  /* Computes a dtv-relative displacement, the difference between the value
1316
     of sym+add and the base address of the thread-local storage block that
1317
     contains the definition of sym, minus 0x8000.  */
1318
  HOWTO (R_PPC64_DTPREL64,
1319
         0,                      /* rightshift */
1320
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
1321
         64,                    /* bitsize */
1322
         FALSE,                 /* pc_relative */
1323
         0,                      /* bitpos */
1324
         complain_overflow_dont, /* complain_on_overflow */
1325
         ppc64_elf_unhandled_reloc, /* special_function */
1326
         "R_PPC64_DTPREL64",    /* name */
1327
         FALSE,                 /* partial_inplace */
1328
         0,                      /* src_mask */
1329
         ONES (64),             /* dst_mask */
1330
         FALSE),                /* pcrel_offset */
1331
 
1332
  /* A 16 bit dtprel reloc.  */
1333
  HOWTO (R_PPC64_DTPREL16,
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_signed, /* complain_on_overflow */
1340
         ppc64_elf_unhandled_reloc, /* special_function */
1341
         "R_PPC64_DTPREL16",    /* name */
1342
         FALSE,                 /* partial_inplace */
1343
         0,                      /* src_mask */
1344
         0xffff,                /* dst_mask */
1345
         FALSE),                /* pcrel_offset */
1346
 
1347
  /* Like DTPREL16, but no overflow.  */
1348
  HOWTO (R_PPC64_DTPREL16_LO,
1349
         0,                      /* 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_LO", /* name */
1357
         FALSE,                 /* partial_inplace */
1358
         0,                      /* src_mask */
1359
         0xffff,                /* dst_mask */
1360
         FALSE),                /* pcrel_offset */
1361
 
1362
  /* Like DTPREL16_LO, but next higher group of 16 bits.  */
1363
  HOWTO (R_PPC64_DTPREL16_HI,
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_HI", /* name */
1372
         FALSE,                 /* partial_inplace */
1373
         0,                      /* src_mask */
1374
         0xffff,                /* dst_mask */
1375
         FALSE),                /* pcrel_offset */
1376
 
1377
  /* Like DTPREL16_HI, but adjust for low 16 bits.  */
1378
  HOWTO (R_PPC64_DTPREL16_HA,
1379
         16,                    /* 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_HA", /* name */
1387
         FALSE,                 /* partial_inplace */
1388
         0,                      /* src_mask */
1389
         0xffff,                /* dst_mask */
1390
         FALSE),                /* pcrel_offset */
1391
 
1392
  /* Like DTPREL16_HI, but next higher group of 16 bits.  */
1393
  HOWTO (R_PPC64_DTPREL16_HIGHER,
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_HIGHER", /* name */
1402
         FALSE,                 /* partial_inplace */
1403
         0,                      /* src_mask */
1404
         0xffff,                /* dst_mask */
1405
         FALSE),                /* pcrel_offset */
1406
 
1407
  /* Like DTPREL16_HIGHER, but adjust for low 16 bits.  */
1408
  HOWTO (R_PPC64_DTPREL16_HIGHERA,
1409
         32,                    /* 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_HIGHERA", /* name */
1417
         FALSE,                 /* partial_inplace */
1418
         0,                      /* src_mask */
1419
         0xffff,                /* dst_mask */
1420
         FALSE),                /* pcrel_offset */
1421
 
1422
  /* Like DTPREL16_HIGHER, but next higher group of 16 bits.  */
1423
  HOWTO (R_PPC64_DTPREL16_HIGHEST,
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_HIGHEST", /* name */
1432
         FALSE,                 /* partial_inplace */
1433
         0,                      /* src_mask */
1434
         0xffff,                /* dst_mask */
1435
         FALSE),                /* pcrel_offset */
1436
 
1437
  /* Like DTPREL16_HIGHEST, but adjust for low 16 bits.  */
1438
  HOWTO (R_PPC64_DTPREL16_HIGHESTA,
1439
         48,                    /* rightshift */
1440
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1441
         16,                    /* bitsize */
1442
         FALSE,                 /* pc_relative */
1443
         0,                      /* bitpos */
1444
         complain_overflow_dont, /* complain_on_overflow */
1445
         ppc64_elf_unhandled_reloc, /* special_function */
1446
         "R_PPC64_DTPREL16_HIGHESTA", /* name */
1447
         FALSE,                 /* partial_inplace */
1448
         0,                      /* src_mask */
1449
         0xffff,                /* dst_mask */
1450
         FALSE),                /* pcrel_offset */
1451
 
1452
  /* Like DTPREL16, but for insns with a DS field.  */
1453
  HOWTO (R_PPC64_DTPREL16_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_signed, /* complain_on_overflow */
1460
         ppc64_elf_unhandled_reloc, /* special_function */
1461
         "R_PPC64_DTPREL16_DS", /* name */
1462
         FALSE,                 /* partial_inplace */
1463
         0,                      /* src_mask */
1464
         0xfffc,                /* dst_mask */
1465
         FALSE),                /* pcrel_offset */
1466
 
1467
  /* Like DTPREL16_DS, but no overflow.  */
1468
  HOWTO (R_PPC64_DTPREL16_LO_DS,
1469
         0,                      /* rightshift */
1470
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1471
         16,                    /* bitsize */
1472
         FALSE,                 /* pc_relative */
1473
         0,                      /* bitpos */
1474
         complain_overflow_dont, /* complain_on_overflow */
1475
         ppc64_elf_unhandled_reloc, /* special_function */
1476
         "R_PPC64_DTPREL16_LO_DS", /* name */
1477
         FALSE,                 /* partial_inplace */
1478
         0,                      /* src_mask */
1479
         0xfffc,                /* dst_mask */
1480
         FALSE),                /* pcrel_offset */
1481
 
1482
  /* Computes a tp-relative displacement, the difference between the value of
1483
     sym+add and the value of the thread pointer (r13).  */
1484
  HOWTO (R_PPC64_TPREL64,
1485
         0,                      /* rightshift */
1486
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
1487
         64,                    /* bitsize */
1488
         FALSE,                 /* pc_relative */
1489
         0,                      /* bitpos */
1490
         complain_overflow_dont, /* complain_on_overflow */
1491
         ppc64_elf_unhandled_reloc, /* special_function */
1492
         "R_PPC64_TPREL64",     /* name */
1493
         FALSE,                 /* partial_inplace */
1494
         0,                      /* src_mask */
1495
         ONES (64),             /* dst_mask */
1496
         FALSE),                /* pcrel_offset */
1497
 
1498
  /* A 16 bit tprel reloc.  */
1499
  HOWTO (R_PPC64_TPREL16,
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_signed, /* complain_on_overflow */
1506
         ppc64_elf_unhandled_reloc, /* special_function */
1507
         "R_PPC64_TPREL16",     /* name */
1508
         FALSE,                 /* partial_inplace */
1509
         0,                      /* src_mask */
1510
         0xffff,                /* dst_mask */
1511
         FALSE),                /* pcrel_offset */
1512
 
1513
  /* Like TPREL16, but no overflow.  */
1514
  HOWTO (R_PPC64_TPREL16_LO,
1515
         0,                      /* 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_LO",  /* name */
1523
         FALSE,                 /* partial_inplace */
1524
         0,                      /* src_mask */
1525
         0xffff,                /* dst_mask */
1526
         FALSE),                /* pcrel_offset */
1527
 
1528
  /* Like TPREL16_LO, but next higher group of 16 bits.  */
1529
  HOWTO (R_PPC64_TPREL16_HI,
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_HI",  /* name */
1538
         FALSE,                 /* partial_inplace */
1539
         0,                      /* src_mask */
1540
         0xffff,                /* dst_mask */
1541
         FALSE),                /* pcrel_offset */
1542
 
1543
  /* Like TPREL16_HI, but adjust for low 16 bits.  */
1544
  HOWTO (R_PPC64_TPREL16_HA,
1545
         16,                    /* 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_HA",  /* name */
1553
         FALSE,                 /* partial_inplace */
1554
         0,                      /* src_mask */
1555
         0xffff,                /* dst_mask */
1556
         FALSE),                /* pcrel_offset */
1557
 
1558
  /* Like TPREL16_HI, but next higher group of 16 bits.  */
1559
  HOWTO (R_PPC64_TPREL16_HIGHER,
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_HIGHER",      /* name */
1568
         FALSE,                 /* partial_inplace */
1569
         0,                      /* src_mask */
1570
         0xffff,                /* dst_mask */
1571
         FALSE),                /* pcrel_offset */
1572
 
1573
  /* Like TPREL16_HIGHER, but adjust for low 16 bits.  */
1574
  HOWTO (R_PPC64_TPREL16_HIGHERA,
1575
         32,                    /* 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_HIGHERA", /* name */
1583
         FALSE,                 /* partial_inplace */
1584
         0,                      /* src_mask */
1585
         0xffff,                /* dst_mask */
1586
         FALSE),                /* pcrel_offset */
1587
 
1588
  /* Like TPREL16_HIGHER, but next higher group of 16 bits.  */
1589
  HOWTO (R_PPC64_TPREL16_HIGHEST,
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_HIGHEST", /* name */
1598
         FALSE,                 /* partial_inplace */
1599
         0,                      /* src_mask */
1600
         0xffff,                /* dst_mask */
1601
         FALSE),                /* pcrel_offset */
1602
 
1603
  /* Like TPREL16_HIGHEST, but adjust for low 16 bits.  */
1604
  HOWTO (R_PPC64_TPREL16_HIGHESTA,
1605
         48,                    /* rightshift */
1606
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1607
         16,                    /* bitsize */
1608
         FALSE,                 /* pc_relative */
1609
         0,                      /* bitpos */
1610
         complain_overflow_dont, /* complain_on_overflow */
1611
         ppc64_elf_unhandled_reloc, /* special_function */
1612
         "R_PPC64_TPREL16_HIGHESTA", /* name */
1613
         FALSE,                 /* partial_inplace */
1614
         0,                      /* src_mask */
1615
         0xffff,                /* dst_mask */
1616
         FALSE),                /* pcrel_offset */
1617
 
1618
  /* Like TPREL16, but for insns with a DS field.  */
1619
  HOWTO (R_PPC64_TPREL16_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_signed, /* complain_on_overflow */
1626
         ppc64_elf_unhandled_reloc, /* special_function */
1627
         "R_PPC64_TPREL16_DS",  /* name */
1628
         FALSE,                 /* partial_inplace */
1629
         0,                      /* src_mask */
1630
         0xfffc,                /* dst_mask */
1631
         FALSE),                /* pcrel_offset */
1632
 
1633
  /* Like TPREL16_DS, but no overflow.  */
1634
  HOWTO (R_PPC64_TPREL16_LO_DS,
1635
         0,                      /* rightshift */
1636
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1637
         16,                    /* bitsize */
1638
         FALSE,                 /* pc_relative */
1639
         0,                      /* bitpos */
1640
         complain_overflow_dont, /* complain_on_overflow */
1641
         ppc64_elf_unhandled_reloc, /* special_function */
1642
         "R_PPC64_TPREL16_LO_DS", /* name */
1643
         FALSE,                 /* partial_inplace */
1644
         0,                      /* src_mask */
1645
         0xfffc,                /* dst_mask */
1646
         FALSE),                /* pcrel_offset */
1647
 
1648
  /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1649
     with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1650
     to the first entry relative to the TOC base (r2).  */
1651
  HOWTO (R_PPC64_GOT_TLSGD16,
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_signed, /* complain_on_overflow */
1658
         ppc64_elf_unhandled_reloc, /* special_function */
1659
         "R_PPC64_GOT_TLSGD16", /* name */
1660
         FALSE,                 /* partial_inplace */
1661
         0,                      /* src_mask */
1662
         0xffff,                /* dst_mask */
1663
         FALSE),                /* pcrel_offset */
1664
 
1665
  /* Like GOT_TLSGD16, but no overflow.  */
1666
  HOWTO (R_PPC64_GOT_TLSGD16_LO,
1667
         0,                      /* 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_LO", /* name */
1675
         FALSE,                 /* partial_inplace */
1676
         0,                      /* src_mask */
1677
         0xffff,                /* dst_mask */
1678
         FALSE),                /* pcrel_offset */
1679
 
1680
  /* Like GOT_TLSGD16_LO, but next higher group of 16 bits.  */
1681
  HOWTO (R_PPC64_GOT_TLSGD16_HI,
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_HI", /* name */
1690
         FALSE,                 /* partial_inplace */
1691
         0,                      /* src_mask */
1692
         0xffff,                /* dst_mask */
1693
         FALSE),                /* pcrel_offset */
1694
 
1695
  /* Like GOT_TLSGD16_HI, but adjust for low 16 bits.  */
1696
  HOWTO (R_PPC64_GOT_TLSGD16_HA,
1697
         16,                    /* rightshift */
1698
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1699
         16,                    /* bitsize */
1700
         FALSE,                 /* pc_relative */
1701
         0,                      /* bitpos */
1702
         complain_overflow_dont, /* complain_on_overflow */
1703
         ppc64_elf_unhandled_reloc, /* special_function */
1704
         "R_PPC64_GOT_TLSGD16_HA", /* name */
1705
         FALSE,                 /* partial_inplace */
1706
         0,                      /* src_mask */
1707
         0xffff,                /* dst_mask */
1708
         FALSE),                /* pcrel_offset */
1709
 
1710
  /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1711
     with values (sym+add)@dtpmod and zero, and computes the offset to the
1712
     first entry relative to the TOC base (r2).  */
1713
  HOWTO (R_PPC64_GOT_TLSLD16,
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_signed, /* complain_on_overflow */
1720
         ppc64_elf_unhandled_reloc, /* special_function */
1721
         "R_PPC64_GOT_TLSLD16", /* name */
1722
         FALSE,                 /* partial_inplace */
1723
         0,                      /* src_mask */
1724
         0xffff,                /* dst_mask */
1725
         FALSE),                /* pcrel_offset */
1726
 
1727
  /* Like GOT_TLSLD16, but no overflow.  */
1728
  HOWTO (R_PPC64_GOT_TLSLD16_LO,
1729
         0,                      /* rightshift */
1730
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1731
         16,                    /* bitsize */
1732
         FALSE,                 /* pc_relative */
1733
         0,                      /* bitpos */
1734
         complain_overflow_dont, /* complain_on_overflow */
1735
         ppc64_elf_unhandled_reloc, /* special_function */
1736
         "R_PPC64_GOT_TLSLD16_LO", /* name */
1737
         FALSE,                 /* partial_inplace */
1738
         0,                      /* src_mask */
1739
         0xffff,                /* dst_mask */
1740
         FALSE),                /* pcrel_offset */
1741
 
1742
  /* Like GOT_TLSLD16_LO, but next higher group of 16 bits.  */
1743
  HOWTO (R_PPC64_GOT_TLSLD16_HI,
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_HI", /* name */
1752
         FALSE,                 /* partial_inplace */
1753
         0,                      /* src_mask */
1754
         0xffff,                /* dst_mask */
1755
         FALSE),                /* pcrel_offset */
1756
 
1757
  /* Like GOT_TLSLD16_HI, but adjust for low 16 bits.  */
1758
  HOWTO (R_PPC64_GOT_TLSLD16_HA,
1759
         16,                    /* rightshift */
1760
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1761
         16,                    /* bitsize */
1762
         FALSE,                 /* pc_relative */
1763
         0,                      /* bitpos */
1764
         complain_overflow_dont, /* complain_on_overflow */
1765
         ppc64_elf_unhandled_reloc, /* special_function */
1766
         "R_PPC64_GOT_TLSLD16_HA", /* name */
1767
         FALSE,                 /* partial_inplace */
1768
         0,                      /* src_mask */
1769
         0xffff,                /* dst_mask */
1770
         FALSE),                /* pcrel_offset */
1771
 
1772
  /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1773
     the offset to the entry relative to the TOC base (r2).  */
1774
  HOWTO (R_PPC64_GOT_DTPREL16_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_signed, /* complain_on_overflow */
1781
         ppc64_elf_unhandled_reloc, /* special_function */
1782
         "R_PPC64_GOT_DTPREL16_DS", /* name */
1783
         FALSE,                 /* partial_inplace */
1784
         0,                      /* src_mask */
1785
         0xfffc,                /* dst_mask */
1786
         FALSE),                /* pcrel_offset */
1787
 
1788
  /* Like GOT_DTPREL16_DS, but no overflow.  */
1789
  HOWTO (R_PPC64_GOT_DTPREL16_LO_DS,
1790
         0,                      /* rightshift */
1791
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1792
         16,                    /* bitsize */
1793
         FALSE,                 /* pc_relative */
1794
         0,                      /* bitpos */
1795
         complain_overflow_dont, /* complain_on_overflow */
1796
         ppc64_elf_unhandled_reloc, /* special_function */
1797
         "R_PPC64_GOT_DTPREL16_LO_DS", /* name */
1798
         FALSE,                 /* partial_inplace */
1799
         0,                      /* src_mask */
1800
         0xfffc,                /* dst_mask */
1801
         FALSE),                /* pcrel_offset */
1802
 
1803
  /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits.  */
1804
  HOWTO (R_PPC64_GOT_DTPREL16_HI,
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_HI", /* name */
1813
         FALSE,                 /* partial_inplace */
1814
         0,                      /* src_mask */
1815
         0xffff,                /* dst_mask */
1816
         FALSE),                /* pcrel_offset */
1817
 
1818
  /* Like GOT_DTPREL16_HI, but adjust for low 16 bits.  */
1819
  HOWTO (R_PPC64_GOT_DTPREL16_HA,
1820
         16,                    /* rightshift */
1821
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1822
         16,                    /* bitsize */
1823
         FALSE,                 /* pc_relative */
1824
         0,                      /* bitpos */
1825
         complain_overflow_dont, /* complain_on_overflow */
1826
         ppc64_elf_unhandled_reloc, /* special_function */
1827
         "R_PPC64_GOT_DTPREL16_HA", /* name */
1828
         FALSE,                 /* partial_inplace */
1829
         0,                      /* src_mask */
1830
         0xffff,                /* dst_mask */
1831
         FALSE),                /* pcrel_offset */
1832
 
1833
  /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1834
     offset to the entry relative to the TOC base (r2).  */
1835
  HOWTO (R_PPC64_GOT_TPREL16_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_signed, /* complain_on_overflow */
1842
         ppc64_elf_unhandled_reloc, /* special_function */
1843
         "R_PPC64_GOT_TPREL16_DS", /* name */
1844
         FALSE,                 /* partial_inplace */
1845
         0,                      /* src_mask */
1846
         0xfffc,                /* dst_mask */
1847
         FALSE),                /* pcrel_offset */
1848
 
1849
  /* Like GOT_TPREL16_DS, but no overflow.  */
1850
  HOWTO (R_PPC64_GOT_TPREL16_LO_DS,
1851
         0,                      /* 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_LO_DS", /* name */
1859
         FALSE,                 /* partial_inplace */
1860
         0,                      /* src_mask */
1861
         0xfffc,                /* dst_mask */
1862
         FALSE),                /* pcrel_offset */
1863
 
1864
  /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits.  */
1865
  HOWTO (R_PPC64_GOT_TPREL16_HI,
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_HI", /* name */
1874
         FALSE,                 /* partial_inplace */
1875
         0,                      /* src_mask */
1876
         0xffff,                /* dst_mask */
1877
         FALSE),                /* pcrel_offset */
1878
 
1879
  /* Like GOT_TPREL16_HI, but adjust for low 16 bits.  */
1880
  HOWTO (R_PPC64_GOT_TPREL16_HA,
1881
         16,                    /* rightshift */
1882
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1883
         16,                    /* bitsize */
1884
         FALSE,                 /* pc_relative */
1885
         0,                      /* bitpos */
1886
         complain_overflow_dont, /* complain_on_overflow */
1887
         ppc64_elf_unhandled_reloc, /* special_function */
1888
         "R_PPC64_GOT_TPREL16_HA", /* name */
1889
         FALSE,                 /* partial_inplace */
1890
         0,                      /* src_mask */
1891
         0xffff,                /* dst_mask */
1892
         FALSE),                /* pcrel_offset */
1893
 
1894
  HOWTO (R_PPC64_JMP_IREL,      /* type */
1895
         0,                      /* rightshift */
1896
         0,                      /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1897
         0,                      /* bitsize */
1898
         FALSE,                 /* pc_relative */
1899
         0,                      /* bitpos */
1900
         complain_overflow_dont, /* complain_on_overflow */
1901
         ppc64_elf_unhandled_reloc, /* special_function */
1902
         "R_PPC64_JMP_IREL",    /* name */
1903
         FALSE,                 /* partial_inplace */
1904
         0,                      /* src_mask */
1905
         0,                      /* dst_mask */
1906
         FALSE),                /* pcrel_offset */
1907
 
1908
  HOWTO (R_PPC64_IRELATIVE,     /* type */
1909
         0,                      /* rightshift */
1910
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1911
         64,                    /* bitsize */
1912
         FALSE,                 /* pc_relative */
1913
         0,                      /* bitpos */
1914
         complain_overflow_dont, /* complain_on_overflow */
1915
         bfd_elf_generic_reloc, /* special_function */
1916
         "R_PPC64_IRELATIVE",   /* name */
1917
         FALSE,                 /* partial_inplace */
1918
         0,                      /* src_mask */
1919
         ONES (64),             /* dst_mask */
1920
         FALSE),                /* pcrel_offset */
1921
 
1922
  /* A 16 bit relative relocation.  */
1923
  HOWTO (R_PPC64_REL16,         /* 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_bitfield, /* complain_on_overflow */
1930
         bfd_elf_generic_reloc, /* special_function */
1931
         "R_PPC64_REL16",       /* name */
1932
         FALSE,                 /* partial_inplace */
1933
         0,                      /* src_mask */
1934
         0xffff,                /* dst_mask */
1935
         TRUE),                 /* pcrel_offset */
1936
 
1937
  /* A 16 bit relative relocation without overflow.  */
1938
  HOWTO (R_PPC64_REL16_LO,      /* type */
1939
         0,                      /* 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_LO",    /* 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.  */
1953
  HOWTO (R_PPC64_REL16_HI,      /* type */
1954
         16,                    /* rightshift */
1955
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1956
         16,                    /* bitsize */
1957
         TRUE,                  /* pc_relative */
1958
         0,                      /* bitpos */
1959
         complain_overflow_dont, /* complain_on_overflow */
1960
         bfd_elf_generic_reloc, /* special_function */
1961
         "R_PPC64_REL16_HI",    /* name */
1962
         FALSE,                 /* partial_inplace */
1963
         0,                      /* src_mask */
1964
         0xffff,                /* dst_mask */
1965
         TRUE),                 /* pcrel_offset */
1966
 
1967
  /* The high order 16 bits of a relative address, plus 1 if the contents of
1968
     the low 16 bits, treated as a signed number, is negative.  */
1969
  HOWTO (R_PPC64_REL16_HA,      /* type */
1970
         16,                    /* rightshift */
1971
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1972
         16,                    /* bitsize */
1973
         TRUE,                  /* pc_relative */
1974
         0,                      /* bitpos */
1975
         complain_overflow_dont, /* complain_on_overflow */
1976
         ppc64_elf_ha_reloc,    /* special_function */
1977
         "R_PPC64_REL16_HA",    /* name */
1978
         FALSE,                 /* partial_inplace */
1979
         0,                      /* src_mask */
1980
         0xffff,                /* dst_mask */
1981
         TRUE),                 /* pcrel_offset */
1982
 
1983
  /* GNU extension to record C++ vtable hierarchy.  */
1984
  HOWTO (R_PPC64_GNU_VTINHERIT, /* 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_VTINHERIT", /* name */
1993
         FALSE,                 /* partial_inplace */
1994
         0,                      /* src_mask */
1995
         0,                      /* dst_mask */
1996
         FALSE),                /* pcrel_offset */
1997
 
1998
  /* GNU extension to record C++ vtable member usage.  */
1999
  HOWTO (R_PPC64_GNU_VTENTRY,   /* type */
2000
         0,                      /* rightshift */
2001
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
2002
         0,                      /* bitsize */
2003
         FALSE,                 /* pc_relative */
2004
         0,                      /* bitpos */
2005
         complain_overflow_dont, /* complain_on_overflow */
2006
         NULL,                  /* special_function */
2007
         "R_PPC64_GNU_VTENTRY", /* name */
2008
         FALSE,                 /* partial_inplace */
2009
         0,                      /* src_mask */
2010
         0,                      /* dst_mask */
2011
         FALSE),                /* pcrel_offset */
2012
};
2013
 
2014
 
2015
/* Initialize the ppc64_elf_howto_table, so that linear accesses can
2016
   be done.  */
2017
 
2018
static void
2019
ppc_howto_init (void)
2020
{
2021
  unsigned int i, type;
2022
 
2023
  for (i = 0;
2024
       i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
2025
       i++)
2026
    {
2027
      type = ppc64_elf_howto_raw[i].type;
2028
      BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table)
2029
                          / sizeof (ppc64_elf_howto_table[0])));
2030
      ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
2031
    }
2032
}
2033
 
2034
static reloc_howto_type *
2035
ppc64_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2036
                             bfd_reloc_code_real_type code)
2037
{
2038
  enum elf_ppc64_reloc_type r = R_PPC64_NONE;
2039
 
2040
  if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2041
    /* Initialize howto table if needed.  */
2042
    ppc_howto_init ();
2043
 
2044
  switch (code)
2045
    {
2046
    default:
2047
      return NULL;
2048
 
2049
    case BFD_RELOC_NONE:                        r = R_PPC64_NONE;
2050
      break;
2051
    case BFD_RELOC_32:                          r = R_PPC64_ADDR32;
2052
      break;
2053
    case BFD_RELOC_PPC_BA26:                    r = R_PPC64_ADDR24;
2054
      break;
2055
    case BFD_RELOC_16:                          r = R_PPC64_ADDR16;
2056
      break;
2057
    case BFD_RELOC_LO16:                        r = R_PPC64_ADDR16_LO;
2058
      break;
2059
    case BFD_RELOC_HI16:                        r = R_PPC64_ADDR16_HI;
2060
      break;
2061
    case BFD_RELOC_HI16_S:                      r = R_PPC64_ADDR16_HA;
2062
      break;
2063
    case BFD_RELOC_PPC_BA16:                    r = R_PPC64_ADDR14;
2064
      break;
2065
    case BFD_RELOC_PPC_BA16_BRTAKEN:            r = R_PPC64_ADDR14_BRTAKEN;
2066
      break;
2067
    case BFD_RELOC_PPC_BA16_BRNTAKEN:           r = R_PPC64_ADDR14_BRNTAKEN;
2068
      break;
2069
    case BFD_RELOC_PPC_B26:                     r = R_PPC64_REL24;
2070
      break;
2071
    case BFD_RELOC_PPC_B16:                     r = R_PPC64_REL14;
2072
      break;
2073
    case BFD_RELOC_PPC_B16_BRTAKEN:             r = R_PPC64_REL14_BRTAKEN;
2074
      break;
2075
    case BFD_RELOC_PPC_B16_BRNTAKEN:            r = R_PPC64_REL14_BRNTAKEN;
2076
      break;
2077
    case BFD_RELOC_16_GOTOFF:                   r = R_PPC64_GOT16;
2078
      break;
2079
    case BFD_RELOC_LO16_GOTOFF:                 r = R_PPC64_GOT16_LO;
2080
      break;
2081
    case BFD_RELOC_HI16_GOTOFF:                 r = R_PPC64_GOT16_HI;
2082
      break;
2083
    case BFD_RELOC_HI16_S_GOTOFF:               r = R_PPC64_GOT16_HA;
2084
      break;
2085
    case BFD_RELOC_PPC_COPY:                    r = R_PPC64_COPY;
2086
      break;
2087
    case BFD_RELOC_PPC_GLOB_DAT:                r = R_PPC64_GLOB_DAT;
2088
      break;
2089
    case BFD_RELOC_32_PCREL:                    r = R_PPC64_REL32;
2090
      break;
2091
    case BFD_RELOC_32_PLTOFF:                   r = R_PPC64_PLT32;
2092
      break;
2093
    case BFD_RELOC_32_PLT_PCREL:                r = R_PPC64_PLTREL32;
2094
      break;
2095
    case BFD_RELOC_LO16_PLTOFF:                 r = R_PPC64_PLT16_LO;
2096
      break;
2097
    case BFD_RELOC_HI16_PLTOFF:                 r = R_PPC64_PLT16_HI;
2098
      break;
2099
    case BFD_RELOC_HI16_S_PLTOFF:               r = R_PPC64_PLT16_HA;
2100
      break;
2101
    case BFD_RELOC_16_BASEREL:                  r = R_PPC64_SECTOFF;
2102
      break;
2103
    case BFD_RELOC_LO16_BASEREL:                r = R_PPC64_SECTOFF_LO;
2104
      break;
2105
    case BFD_RELOC_HI16_BASEREL:                r = R_PPC64_SECTOFF_HI;
2106
      break;
2107
    case BFD_RELOC_HI16_S_BASEREL:              r = R_PPC64_SECTOFF_HA;
2108
      break;
2109
    case BFD_RELOC_CTOR:                        r = R_PPC64_ADDR64;
2110
      break;
2111
    case BFD_RELOC_64:                          r = R_PPC64_ADDR64;
2112
      break;
2113
    case BFD_RELOC_PPC64_HIGHER:                r = R_PPC64_ADDR16_HIGHER;
2114
      break;
2115
    case BFD_RELOC_PPC64_HIGHER_S:              r = R_PPC64_ADDR16_HIGHERA;
2116
      break;
2117
    case BFD_RELOC_PPC64_HIGHEST:               r = R_PPC64_ADDR16_HIGHEST;
2118
      break;
2119
    case BFD_RELOC_PPC64_HIGHEST_S:             r = R_PPC64_ADDR16_HIGHESTA;
2120
      break;
2121
    case BFD_RELOC_64_PCREL:                    r = R_PPC64_REL64;
2122
      break;
2123
    case BFD_RELOC_64_PLTOFF:                   r = R_PPC64_PLT64;
2124
      break;
2125
    case BFD_RELOC_64_PLT_PCREL:                r = R_PPC64_PLTREL64;
2126
      break;
2127
    case BFD_RELOC_PPC_TOC16:                   r = R_PPC64_TOC16;
2128
      break;
2129
    case BFD_RELOC_PPC64_TOC16_LO:              r = R_PPC64_TOC16_LO;
2130
      break;
2131
    case BFD_RELOC_PPC64_TOC16_HI:              r = R_PPC64_TOC16_HI;
2132
      break;
2133
    case BFD_RELOC_PPC64_TOC16_HA:              r = R_PPC64_TOC16_HA;
2134
      break;
2135
    case BFD_RELOC_PPC64_TOC:                   r = R_PPC64_TOC;
2136
      break;
2137
    case BFD_RELOC_PPC64_PLTGOT16:              r = R_PPC64_PLTGOT16;
2138
      break;
2139
    case BFD_RELOC_PPC64_PLTGOT16_LO:           r = R_PPC64_PLTGOT16_LO;
2140
      break;
2141
    case BFD_RELOC_PPC64_PLTGOT16_HI:           r = R_PPC64_PLTGOT16_HI;
2142
      break;
2143
    case BFD_RELOC_PPC64_PLTGOT16_HA:           r = R_PPC64_PLTGOT16_HA;
2144
      break;
2145
    case BFD_RELOC_PPC64_ADDR16_DS:             r = R_PPC64_ADDR16_DS;
2146
      break;
2147
    case BFD_RELOC_PPC64_ADDR16_LO_DS:          r = R_PPC64_ADDR16_LO_DS;
2148
      break;
2149
    case BFD_RELOC_PPC64_GOT16_DS:              r = R_PPC64_GOT16_DS;
2150
      break;
2151
    case BFD_RELOC_PPC64_GOT16_LO_DS:           r = R_PPC64_GOT16_LO_DS;
2152
      break;
2153
    case BFD_RELOC_PPC64_PLT16_LO_DS:           r = R_PPC64_PLT16_LO_DS;
2154
      break;
2155
    case BFD_RELOC_PPC64_SECTOFF_DS:            r = R_PPC64_SECTOFF_DS;
2156
      break;
2157
    case BFD_RELOC_PPC64_SECTOFF_LO_DS:         r = R_PPC64_SECTOFF_LO_DS;
2158
      break;
2159
    case BFD_RELOC_PPC64_TOC16_DS:              r = R_PPC64_TOC16_DS;
2160
      break;
2161
    case BFD_RELOC_PPC64_TOC16_LO_DS:           r = R_PPC64_TOC16_LO_DS;
2162
      break;
2163
    case BFD_RELOC_PPC64_PLTGOT16_DS:           r = R_PPC64_PLTGOT16_DS;
2164
      break;
2165
    case BFD_RELOC_PPC64_PLTGOT16_LO_DS:        r = R_PPC64_PLTGOT16_LO_DS;
2166
      break;
2167
    case BFD_RELOC_PPC_TLS:                     r = R_PPC64_TLS;
2168
      break;
2169
    case BFD_RELOC_PPC_TLSGD:                   r = R_PPC64_TLSGD;
2170
      break;
2171
    case BFD_RELOC_PPC_TLSLD:                   r = R_PPC64_TLSLD;
2172
      break;
2173
    case BFD_RELOC_PPC_DTPMOD:                  r = R_PPC64_DTPMOD64;
2174
      break;
2175
    case BFD_RELOC_PPC_TPREL16:                 r = R_PPC64_TPREL16;
2176
      break;
2177
    case BFD_RELOC_PPC_TPREL16_LO:              r = R_PPC64_TPREL16_LO;
2178
      break;
2179
    case BFD_RELOC_PPC_TPREL16_HI:              r = R_PPC64_TPREL16_HI;
2180
      break;
2181
    case BFD_RELOC_PPC_TPREL16_HA:              r = R_PPC64_TPREL16_HA;
2182
      break;
2183
    case BFD_RELOC_PPC_TPREL:                   r = R_PPC64_TPREL64;
2184
      break;
2185
    case BFD_RELOC_PPC_DTPREL16:                r = R_PPC64_DTPREL16;
2186
      break;
2187
    case BFD_RELOC_PPC_DTPREL16_LO:             r = R_PPC64_DTPREL16_LO;
2188
      break;
2189
    case BFD_RELOC_PPC_DTPREL16_HI:             r = R_PPC64_DTPREL16_HI;
2190
      break;
2191
    case BFD_RELOC_PPC_DTPREL16_HA:             r = R_PPC64_DTPREL16_HA;
2192
      break;
2193
    case BFD_RELOC_PPC_DTPREL:                  r = R_PPC64_DTPREL64;
2194
      break;
2195
    case BFD_RELOC_PPC_GOT_TLSGD16:             r = R_PPC64_GOT_TLSGD16;
2196
      break;
2197
    case BFD_RELOC_PPC_GOT_TLSGD16_LO:          r = R_PPC64_GOT_TLSGD16_LO;
2198
      break;
2199
    case BFD_RELOC_PPC_GOT_TLSGD16_HI:          r = R_PPC64_GOT_TLSGD16_HI;
2200
      break;
2201
    case BFD_RELOC_PPC_GOT_TLSGD16_HA:          r = R_PPC64_GOT_TLSGD16_HA;
2202
      break;
2203
    case BFD_RELOC_PPC_GOT_TLSLD16:             r = R_PPC64_GOT_TLSLD16;
2204
      break;
2205
    case BFD_RELOC_PPC_GOT_TLSLD16_LO:          r = R_PPC64_GOT_TLSLD16_LO;
2206
      break;
2207
    case BFD_RELOC_PPC_GOT_TLSLD16_HI:          r = R_PPC64_GOT_TLSLD16_HI;
2208
      break;
2209
    case BFD_RELOC_PPC_GOT_TLSLD16_HA:          r = R_PPC64_GOT_TLSLD16_HA;
2210
      break;
2211
    case BFD_RELOC_PPC_GOT_TPREL16:             r = R_PPC64_GOT_TPREL16_DS;
2212
      break;
2213
    case BFD_RELOC_PPC_GOT_TPREL16_LO:          r = R_PPC64_GOT_TPREL16_LO_DS;
2214
      break;
2215
    case BFD_RELOC_PPC_GOT_TPREL16_HI:          r = R_PPC64_GOT_TPREL16_HI;
2216
      break;
2217
    case BFD_RELOC_PPC_GOT_TPREL16_HA:          r = R_PPC64_GOT_TPREL16_HA;
2218
      break;
2219
    case BFD_RELOC_PPC_GOT_DTPREL16:            r = R_PPC64_GOT_DTPREL16_DS;
2220
      break;
2221
    case BFD_RELOC_PPC_GOT_DTPREL16_LO:         r = R_PPC64_GOT_DTPREL16_LO_DS;
2222
      break;
2223
    case BFD_RELOC_PPC_GOT_DTPREL16_HI:         r = R_PPC64_GOT_DTPREL16_HI;
2224
      break;
2225
    case BFD_RELOC_PPC_GOT_DTPREL16_HA:         r = R_PPC64_GOT_DTPREL16_HA;
2226
      break;
2227
    case BFD_RELOC_PPC64_TPREL16_DS:            r = R_PPC64_TPREL16_DS;
2228
      break;
2229
    case BFD_RELOC_PPC64_TPREL16_LO_DS:         r = R_PPC64_TPREL16_LO_DS;
2230
      break;
2231
    case BFD_RELOC_PPC64_TPREL16_HIGHER:        r = R_PPC64_TPREL16_HIGHER;
2232
      break;
2233
    case BFD_RELOC_PPC64_TPREL16_HIGHERA:       r = R_PPC64_TPREL16_HIGHERA;
2234
      break;
2235
    case BFD_RELOC_PPC64_TPREL16_HIGHEST:       r = R_PPC64_TPREL16_HIGHEST;
2236
      break;
2237
    case BFD_RELOC_PPC64_TPREL16_HIGHESTA:      r = R_PPC64_TPREL16_HIGHESTA;
2238
      break;
2239
    case BFD_RELOC_PPC64_DTPREL16_DS:           r = R_PPC64_DTPREL16_DS;
2240
      break;
2241
    case BFD_RELOC_PPC64_DTPREL16_LO_DS:        r = R_PPC64_DTPREL16_LO_DS;
2242
      break;
2243
    case BFD_RELOC_PPC64_DTPREL16_HIGHER:       r = R_PPC64_DTPREL16_HIGHER;
2244
      break;
2245
    case BFD_RELOC_PPC64_DTPREL16_HIGHERA:      r = R_PPC64_DTPREL16_HIGHERA;
2246
      break;
2247
    case BFD_RELOC_PPC64_DTPREL16_HIGHEST:      r = R_PPC64_DTPREL16_HIGHEST;
2248
      break;
2249
    case BFD_RELOC_PPC64_DTPREL16_HIGHESTA:     r = R_PPC64_DTPREL16_HIGHESTA;
2250
      break;
2251
    case BFD_RELOC_16_PCREL:                    r = R_PPC64_REL16;
2252
      break;
2253
    case BFD_RELOC_LO16_PCREL:                  r = R_PPC64_REL16_LO;
2254
      break;
2255
    case BFD_RELOC_HI16_PCREL:                  r = R_PPC64_REL16_HI;
2256
      break;
2257
    case BFD_RELOC_HI16_S_PCREL:                r = R_PPC64_REL16_HA;
2258
      break;
2259
    case BFD_RELOC_VTABLE_INHERIT:              r = R_PPC64_GNU_VTINHERIT;
2260
      break;
2261
    case BFD_RELOC_VTABLE_ENTRY:                r = R_PPC64_GNU_VTENTRY;
2262
      break;
2263
    }
2264
 
2265
  return ppc64_elf_howto_table[r];
2266
};
2267
 
2268
static reloc_howto_type *
2269
ppc64_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2270
                             const char *r_name)
2271
{
2272
  unsigned int i;
2273
 
2274
  for (i = 0;
2275
       i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
2276
       i++)
2277
    if (ppc64_elf_howto_raw[i].name != NULL
2278
        && strcasecmp (ppc64_elf_howto_raw[i].name, r_name) == 0)
2279
      return &ppc64_elf_howto_raw[i];
2280
 
2281
  return NULL;
2282
}
2283
 
2284
/* Set the howto pointer for a PowerPC ELF reloc.  */
2285
 
2286
static void
2287
ppc64_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2288
                         Elf_Internal_Rela *dst)
2289
{
2290
  unsigned int type;
2291
 
2292
  /* Initialize howto table if needed.  */
2293
  if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2294
    ppc_howto_init ();
2295
 
2296
  type = ELF64_R_TYPE (dst->r_info);
2297
  if (type >= (sizeof (ppc64_elf_howto_table)
2298
               / sizeof (ppc64_elf_howto_table[0])))
2299
    {
2300
      (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
2301
                             abfd, (int) type);
2302
      type = R_PPC64_NONE;
2303
    }
2304
  cache_ptr->howto = ppc64_elf_howto_table[type];
2305
}
2306
 
2307
/* Handle the R_PPC64_ADDR16_HA and similar relocs.  */
2308
 
2309
static bfd_reloc_status_type
2310
ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2311
                    void *data, asection *input_section,
2312
                    bfd *output_bfd, char **error_message)
2313
{
2314
  /* If this is a relocatable link (output_bfd test tells us), just
2315
     call the generic function.  Any adjustment will be done at final
2316
     link time.  */
2317
  if (output_bfd != NULL)
2318
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2319
                                  input_section, output_bfd, error_message);
2320
 
2321
  /* Adjust the addend for sign extension of the low 16 bits.
2322
     We won't actually be using the low 16 bits, so trashing them
2323
     doesn't matter.  */
2324
  reloc_entry->addend += 0x8000;
2325
  return bfd_reloc_continue;
2326
}
2327
 
2328
static bfd_reloc_status_type
2329
ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2330
                        void *data, asection *input_section,
2331
                        bfd *output_bfd, char **error_message)
2332
{
2333
  if (output_bfd != NULL)
2334
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2335
                                  input_section, output_bfd, error_message);
2336
 
2337
  if (strcmp (symbol->section->name, ".opd") == 0
2338
      && (symbol->section->owner->flags & DYNAMIC) == 0)
2339
    {
2340
      bfd_vma dest = opd_entry_value (symbol->section,
2341
                                      symbol->value + reloc_entry->addend,
2342
                                      NULL, NULL);
2343
      if (dest != (bfd_vma) -1)
2344
        reloc_entry->addend = dest - (symbol->value
2345
                                      + symbol->section->output_section->vma
2346
                                      + symbol->section->output_offset);
2347
    }
2348
  return bfd_reloc_continue;
2349
}
2350
 
2351
static bfd_reloc_status_type
2352
ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2353
                         void *data, asection *input_section,
2354
                         bfd *output_bfd, char **error_message)
2355
{
2356
  long insn;
2357
  enum elf_ppc64_reloc_type r_type;
2358
  bfd_size_type octets;
2359
  /* Disabled until we sort out how ld should choose 'y' vs 'at'.  */
2360
  bfd_boolean is_power4 = FALSE;
2361
 
2362
  /* If this is a relocatable link (output_bfd test tells us), just
2363
     call the generic function.  Any adjustment will be done at final
2364
     link time.  */
2365
  if (output_bfd != NULL)
2366
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2367
                                  input_section, output_bfd, error_message);
2368
 
2369
  octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2370
  insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2371
  insn &= ~(0x01 << 21);
2372
  r_type = reloc_entry->howto->type;
2373
  if (r_type == R_PPC64_ADDR14_BRTAKEN
2374
      || r_type == R_PPC64_REL14_BRTAKEN)
2375
    insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field.  */
2376
 
2377
  if (is_power4)
2378
    {
2379
      /* Set 'a' bit.  This is 0b00010 in BO field for branch
2380
         on CR(BI) insns (BO == 001at or 011at), and 0b01000
2381
         for branch on CTR insns (BO == 1a00t or 1a01t).  */
2382
      if ((insn & (0x14 << 21)) == (0x04 << 21))
2383
        insn |= 0x02 << 21;
2384
      else if ((insn & (0x14 << 21)) == (0x10 << 21))
2385
        insn |= 0x08 << 21;
2386
      else
2387
        goto out;
2388
    }
2389
  else
2390
    {
2391
      bfd_vma target = 0;
2392
      bfd_vma from;
2393
 
2394
      if (!bfd_is_com_section (symbol->section))
2395
        target = symbol->value;
2396
      target += symbol->section->output_section->vma;
2397
      target += symbol->section->output_offset;
2398
      target += reloc_entry->addend;
2399
 
2400
      from = (reloc_entry->address
2401
              + input_section->output_offset
2402
              + input_section->output_section->vma);
2403
 
2404
      /* Invert 'y' bit if not the default.  */
2405
      if ((bfd_signed_vma) (target - from) < 0)
2406
        insn ^= 0x01 << 21;
2407
    }
2408
  bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2409
 out:
2410
  return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
2411
                                 input_section, output_bfd, error_message);
2412
}
2413
 
2414
static bfd_reloc_status_type
2415
ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2416
                         void *data, asection *input_section,
2417
                         bfd *output_bfd, char **error_message)
2418
{
2419
  /* If this is a relocatable link (output_bfd test tells us), just
2420
     call the generic function.  Any adjustment will be done at final
2421
     link time.  */
2422
  if (output_bfd != NULL)
2423
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2424
                                  input_section, output_bfd, error_message);
2425
 
2426
  /* Subtract the symbol section base address.  */
2427
  reloc_entry->addend -= symbol->section->output_section->vma;
2428
  return bfd_reloc_continue;
2429
}
2430
 
2431
static bfd_reloc_status_type
2432
ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2433
                            void *data, asection *input_section,
2434
                            bfd *output_bfd, char **error_message)
2435
{
2436
  /* If this is a relocatable link (output_bfd test tells us), just
2437
     call the generic function.  Any adjustment will be done at final
2438
     link time.  */
2439
  if (output_bfd != NULL)
2440
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2441
                                  input_section, output_bfd, error_message);
2442
 
2443
  /* Subtract the symbol section base address.  */
2444
  reloc_entry->addend -= symbol->section->output_section->vma;
2445
 
2446
  /* Adjust the addend for sign extension of the low 16 bits.  */
2447
  reloc_entry->addend += 0x8000;
2448
  return bfd_reloc_continue;
2449
}
2450
 
2451
static bfd_reloc_status_type
2452
ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2453
                     void *data, asection *input_section,
2454
                     bfd *output_bfd, char **error_message)
2455
{
2456
  bfd_vma TOCstart;
2457
 
2458
  /* If this is a relocatable link (output_bfd test tells us), just
2459
     call the generic function.  Any adjustment will be done at final
2460
     link time.  */
2461
  if (output_bfd != NULL)
2462
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2463
                                  input_section, output_bfd, error_message);
2464
 
2465
  TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2466
  if (TOCstart == 0)
2467
    TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2468
 
2469
  /* Subtract the TOC base address.  */
2470
  reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2471
  return bfd_reloc_continue;
2472
}
2473
 
2474
static bfd_reloc_status_type
2475
ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2476
                        void *data, asection *input_section,
2477
                        bfd *output_bfd, char **error_message)
2478
{
2479
  bfd_vma TOCstart;
2480
 
2481
  /* If this is a relocatable link (output_bfd test tells us), just
2482
     call the generic function.  Any adjustment will be done at final
2483
     link time.  */
2484
  if (output_bfd != NULL)
2485
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2486
                                  input_section, output_bfd, error_message);
2487
 
2488
  TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2489
  if (TOCstart == 0)
2490
    TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2491
 
2492
  /* Subtract the TOC base address.  */
2493
  reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2494
 
2495
  /* Adjust the addend for sign extension of the low 16 bits.  */
2496
  reloc_entry->addend += 0x8000;
2497
  return bfd_reloc_continue;
2498
}
2499
 
2500
static bfd_reloc_status_type
2501
ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2502
                       void *data, asection *input_section,
2503
                       bfd *output_bfd, char **error_message)
2504
{
2505
  bfd_vma TOCstart;
2506
  bfd_size_type octets;
2507
 
2508
  /* If this is a relocatable link (output_bfd test tells us), just
2509
     call the generic function.  Any adjustment will be done at final
2510
     link time.  */
2511
  if (output_bfd != NULL)
2512
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2513
                                  input_section, output_bfd, error_message);
2514
 
2515
  TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2516
  if (TOCstart == 0)
2517
    TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2518
 
2519
  octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2520
  bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
2521
  return bfd_reloc_ok;
2522
}
2523
 
2524
static bfd_reloc_status_type
2525
ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2526
                           void *data, asection *input_section,
2527
                           bfd *output_bfd, char **error_message)
2528
{
2529
  /* If this is a relocatable link (output_bfd test tells us), just
2530
     call the generic function.  Any adjustment will be done at final
2531
     link time.  */
2532
  if (output_bfd != NULL)
2533
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2534
                                  input_section, output_bfd, error_message);
2535
 
2536
  if (error_message != NULL)
2537
    {
2538
      static char buf[60];
2539
      sprintf (buf, "generic linker can't handle %s",
2540
               reloc_entry->howto->name);
2541
      *error_message = buf;
2542
    }
2543
  return bfd_reloc_dangerous;
2544
}
2545
 
2546
/* Track GOT entries needed for a given symbol.  We might need more
2547
   than one got entry per symbol.  */
2548
struct got_entry
2549
{
2550
  struct got_entry *next;
2551
 
2552
  /* The symbol addend that we'll be placing in the GOT.  */
2553
  bfd_vma addend;
2554
 
2555
  /* Unlike other ELF targets, we use separate GOT entries for the same
2556
     symbol referenced from different input files.  This is to support
2557
     automatic multiple TOC/GOT sections, where the TOC base can vary
2558
     from one input file to another.  After partitioning into TOC groups
2559
     we merge entries within the group.
2560
 
2561
     Point to the BFD owning this GOT entry.  */
2562
  bfd *owner;
2563
 
2564
  /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
2565
     TLS_TPREL or TLS_DTPREL for tls entries.  */
2566
  unsigned char tls_type;
2567
 
2568
  /* Non-zero if got.ent points to real entry.  */
2569
  unsigned char is_indirect;
2570
 
2571
  /* Reference count until size_dynamic_sections, GOT offset thereafter.  */
2572
  union
2573
    {
2574
      bfd_signed_vma refcount;
2575
      bfd_vma offset;
2576
      struct got_entry *ent;
2577
    } got;
2578
};
2579
 
2580
/* The same for PLT.  */
2581
struct plt_entry
2582
{
2583
  struct plt_entry *next;
2584
 
2585
  bfd_vma addend;
2586
 
2587
  union
2588
    {
2589
      bfd_signed_vma refcount;
2590
      bfd_vma offset;
2591
    } plt;
2592
};
2593
 
2594
struct ppc64_elf_obj_tdata
2595
{
2596
  struct elf_obj_tdata elf;
2597
 
2598
  /* Shortcuts to dynamic linker sections.  */
2599
  asection *got;
2600
  asection *relgot;
2601
 
2602
  /* Used during garbage collection.  We attach global symbols defined
2603
     on removed .opd entries to this section so that the sym is removed.  */
2604
  asection *deleted_section;
2605
 
2606
  /* TLS local dynamic got entry handling.  Support for multiple GOT
2607
     sections means we potentially need one of these for each input bfd.  */
2608
  struct got_entry tlsld_got;
2609
 
2610
  /* A copy of relocs before they are modified for --emit-relocs.  */
2611
  Elf_Internal_Rela *opd_relocs;
2612
 
2613
  /* Nonzero if this bfd has small toc/got relocs, ie. that expect
2614
     the reloc to be in the range -32768 to 32767.  */
2615 163 khays
  unsigned int has_small_toc_reloc : 1;
2616
 
2617
  /* Set if toc/got ha relocs detected not using r2, or lo reloc
2618
     instruction not one we handle.  */
2619
  unsigned int unexpected_toc_insn : 1;
2620 14 khays
};
2621
 
2622
#define ppc64_elf_tdata(bfd) \
2623
  ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
2624
 
2625
#define ppc64_tlsld_got(bfd) \
2626
  (&ppc64_elf_tdata (bfd)->tlsld_got)
2627
 
2628
#define is_ppc64_elf(bfd) \
2629
  (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2630
   && elf_object_id (bfd) == PPC64_ELF_DATA)
2631
 
2632
/* Override the generic function because we store some extras.  */
2633
 
2634
static bfd_boolean
2635
ppc64_elf_mkobject (bfd *abfd)
2636
{
2637
  return bfd_elf_allocate_object (abfd, sizeof (struct ppc64_elf_obj_tdata),
2638
                                  PPC64_ELF_DATA);
2639
}
2640
 
2641
/* Fix bad default arch selected for a 64 bit input bfd when the
2642
   default is 32 bit.  */
2643
 
2644
static bfd_boolean
2645
ppc64_elf_object_p (bfd *abfd)
2646
{
2647
  if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 32)
2648
    {
2649
      Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2650
 
2651
      if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
2652
        {
2653
          /* Relies on arch after 32 bit default being 64 bit default.  */
2654
          abfd->arch_info = abfd->arch_info->next;
2655
          BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
2656
        }
2657
    }
2658
  return TRUE;
2659
}
2660
 
2661
/* Support for core dump NOTE sections.  */
2662
 
2663
static bfd_boolean
2664
ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2665
{
2666
  size_t offset, size;
2667
 
2668
  if (note->descsz != 504)
2669
    return FALSE;
2670
 
2671
  /* pr_cursig */
2672
  elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2673
 
2674
  /* pr_pid */
2675
  elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 32);
2676
 
2677
  /* pr_reg */
2678
  offset = 112;
2679
  size = 384;
2680
 
2681
  /* Make a ".reg/999" section.  */
2682
  return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2683
                                          size, note->descpos + offset);
2684
}
2685
 
2686
static bfd_boolean
2687
ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2688
{
2689
  if (note->descsz != 136)
2690
    return FALSE;
2691
 
2692
  elf_tdata (abfd)->core_pid
2693
    = bfd_get_32 (abfd, note->descdata + 24);
2694
  elf_tdata (abfd)->core_program
2695
    = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
2696
  elf_tdata (abfd)->core_command
2697
    = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
2698
 
2699
  return TRUE;
2700
}
2701
 
2702
static char *
2703
ppc64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
2704
                           ...)
2705
{
2706
  switch (note_type)
2707
    {
2708
    default:
2709
      return NULL;
2710
 
2711
    case NT_PRPSINFO:
2712
      {
2713
        char data[136];
2714
        va_list ap;
2715
 
2716
        va_start (ap, note_type);
2717
        memset (data, 0, 40);
2718
        strncpy (data + 40, va_arg (ap, const char *), 16);
2719
        strncpy (data + 56, va_arg (ap, const char *), 80);
2720
        va_end (ap);
2721
        return elfcore_write_note (abfd, buf, bufsiz,
2722
                                   "CORE", note_type, data, sizeof (data));
2723
      }
2724
 
2725
    case NT_PRSTATUS:
2726
      {
2727
        char data[504];
2728
        va_list ap;
2729
        long pid;
2730
        int cursig;
2731
        const void *greg;
2732
 
2733
        va_start (ap, note_type);
2734
        memset (data, 0, 112);
2735
        pid = va_arg (ap, long);
2736
        bfd_put_32 (abfd, pid, data + 32);
2737
        cursig = va_arg (ap, int);
2738
        bfd_put_16 (abfd, cursig, data + 12);
2739
        greg = va_arg (ap, const void *);
2740
        memcpy (data + 112, greg, 384);
2741
        memset (data + 496, 0, 8);
2742
        va_end (ap);
2743
        return elfcore_write_note (abfd, buf, bufsiz,
2744
                                   "CORE", note_type, data, sizeof (data));
2745
      }
2746
    }
2747
}
2748
 
2749
/* Add extra PPC sections.  */
2750
 
2751
static const struct bfd_elf_special_section ppc64_elf_special_sections[]=
2752
{
2753
  { STRING_COMMA_LEN (".plt"),    0, SHT_NOBITS,   0 },
2754
  { STRING_COMMA_LEN (".sbss"),  -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
2755
  { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2756
  { STRING_COMMA_LEN (".toc"),    0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2757
  { STRING_COMMA_LEN (".toc1"),   0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2758
  { STRING_COMMA_LEN (".tocbss"), 0, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
2759
  { NULL,                     0,  0, 0,            0 }
2760
};
2761
 
2762
enum _ppc64_sec_type {
2763
  sec_normal = 0,
2764
  sec_opd = 1,
2765
  sec_toc = 2
2766
};
2767
 
2768
struct _ppc64_elf_section_data
2769
{
2770
  struct bfd_elf_section_data elf;
2771
 
2772
  union
2773
  {
2774
    /* An array with one entry for each opd function descriptor.  */
2775
    struct _opd_sec_data
2776
    {
2777
      /* Points to the function code section for local opd entries.  */
2778
      asection **func_sec;
2779
 
2780
      /* After editing .opd, adjust references to opd local syms.  */
2781
      long *adjust;
2782
    } opd;
2783
 
2784
    /* An array for toc sections, indexed by offset/8.  */
2785
    struct _toc_sec_data
2786
    {
2787
      /* Specifies the relocation symbol index used at a given toc offset.  */
2788
      unsigned *symndx;
2789
 
2790
      /* And the relocation addend.  */
2791
      bfd_vma *add;
2792
    } toc;
2793
  } u;
2794
 
2795
  enum _ppc64_sec_type sec_type:2;
2796
 
2797
  /* Flag set when small branches are detected.  Used to
2798
     select suitable defaults for the stub group size.  */
2799
  unsigned int has_14bit_branch:1;
2800
};
2801
 
2802
#define ppc64_elf_section_data(sec) \
2803
  ((struct _ppc64_elf_section_data *) elf_section_data (sec))
2804
 
2805
static bfd_boolean
2806
ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
2807
{
2808
  if (!sec->used_by_bfd)
2809
    {
2810
      struct _ppc64_elf_section_data *sdata;
2811
      bfd_size_type amt = sizeof (*sdata);
2812
 
2813
      sdata = bfd_zalloc (abfd, amt);
2814
      if (sdata == NULL)
2815
        return FALSE;
2816
      sec->used_by_bfd = sdata;
2817
    }
2818
 
2819
  return _bfd_elf_new_section_hook (abfd, sec);
2820
}
2821
 
2822
static struct _opd_sec_data *
2823
get_opd_info (asection * sec)
2824
{
2825
  if (sec != NULL
2826
      && ppc64_elf_section_data (sec) != NULL
2827
      && ppc64_elf_section_data (sec)->sec_type == sec_opd)
2828
    return &ppc64_elf_section_data (sec)->u.opd;
2829
  return NULL;
2830
}
2831
 
2832
/* Parameters for the qsort hook.  */
2833
static bfd_boolean synthetic_relocatable;
2834
 
2835
/* qsort comparison function for ppc64_elf_get_synthetic_symtab.  */
2836
 
2837
static int
2838
compare_symbols (const void *ap, const void *bp)
2839
{
2840
  const asymbol *a = * (const asymbol **) ap;
2841
  const asymbol *b = * (const asymbol **) bp;
2842
 
2843
  /* Section symbols first.  */
2844
  if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
2845
    return -1;
2846
  if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
2847
    return 1;
2848
 
2849
  /* then .opd symbols.  */
2850
  if (strcmp (a->section->name, ".opd") == 0
2851
      && strcmp (b->section->name, ".opd") != 0)
2852
    return -1;
2853
  if (strcmp (a->section->name, ".opd") != 0
2854
      && strcmp (b->section->name, ".opd") == 0)
2855
    return 1;
2856
 
2857
  /* then other code symbols.  */
2858
  if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2859
      == (SEC_CODE | SEC_ALLOC)
2860
      && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2861
         != (SEC_CODE | SEC_ALLOC))
2862
    return -1;
2863
 
2864
  if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2865
      != (SEC_CODE | SEC_ALLOC)
2866
      && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2867
         == (SEC_CODE | SEC_ALLOC))
2868
    return 1;
2869
 
2870
  if (synthetic_relocatable)
2871
    {
2872
      if (a->section->id < b->section->id)
2873
        return -1;
2874
 
2875
      if (a->section->id > b->section->id)
2876
        return 1;
2877
    }
2878
 
2879
  if (a->value + a->section->vma < b->value + b->section->vma)
2880
    return -1;
2881
 
2882
  if (a->value + a->section->vma > b->value + b->section->vma)
2883
    return 1;
2884
 
2885
  /* For syms with the same value, prefer strong dynamic global function
2886
     syms over other syms.  */
2887
  if ((a->flags & BSF_GLOBAL) != 0 && (b->flags & BSF_GLOBAL) == 0)
2888
    return -1;
2889
 
2890
  if ((a->flags & BSF_GLOBAL) == 0 && (b->flags & BSF_GLOBAL) != 0)
2891
    return 1;
2892
 
2893
  if ((a->flags & BSF_FUNCTION) != 0 && (b->flags & BSF_FUNCTION) == 0)
2894
    return -1;
2895
 
2896
  if ((a->flags & BSF_FUNCTION) == 0 && (b->flags & BSF_FUNCTION) != 0)
2897
    return 1;
2898
 
2899
  if ((a->flags & BSF_WEAK) == 0 && (b->flags & BSF_WEAK) != 0)
2900
    return -1;
2901
 
2902
  if ((a->flags & BSF_WEAK) != 0 && (b->flags & BSF_WEAK) == 0)
2903
    return 1;
2904
 
2905
  if ((a->flags & BSF_DYNAMIC) != 0 && (b->flags & BSF_DYNAMIC) == 0)
2906
    return -1;
2907
 
2908
  if ((a->flags & BSF_DYNAMIC) == 0 && (b->flags & BSF_DYNAMIC) != 0)
2909
    return 1;
2910
 
2911
  return 0;
2912
}
2913
 
2914
/* Search SYMS for a symbol of the given VALUE.  */
2915
 
2916
static asymbol *
2917
sym_exists_at (asymbol **syms, long lo, long hi, int id, bfd_vma value)
2918
{
2919
  long mid;
2920
 
2921
  if (id == -1)
2922
    {
2923
      while (lo < hi)
2924
        {
2925
          mid = (lo + hi) >> 1;
2926
          if (syms[mid]->value + syms[mid]->section->vma < value)
2927
            lo = mid + 1;
2928
          else if (syms[mid]->value + syms[mid]->section->vma > value)
2929
            hi = mid;
2930
          else
2931
            return syms[mid];
2932
        }
2933
    }
2934
  else
2935
    {
2936
      while (lo < hi)
2937
        {
2938
          mid = (lo + hi) >> 1;
2939
          if (syms[mid]->section->id < id)
2940
            lo = mid + 1;
2941
          else if (syms[mid]->section->id > id)
2942
            hi = mid;
2943
          else if (syms[mid]->value < value)
2944
            lo = mid + 1;
2945
          else if (syms[mid]->value > value)
2946
            hi = mid;
2947
          else
2948
            return syms[mid];
2949
        }
2950
    }
2951
  return NULL;
2952
}
2953
 
2954
static bfd_boolean
2955
section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
2956
{
2957
  bfd_vma vma = *(bfd_vma *) ptr;
2958
  return ((section->flags & SEC_ALLOC) != 0
2959
          && section->vma <= vma
2960
          && vma < section->vma + section->size);
2961
}
2962
 
2963
/* Create synthetic symbols, effectively restoring "dot-symbol" function
2964
   entry syms.  Also generate @plt symbols for the glink branch table.  */
2965
 
2966
static long
2967
ppc64_elf_get_synthetic_symtab (bfd *abfd,
2968
                                long static_count, asymbol **static_syms,
2969
                                long dyn_count, asymbol **dyn_syms,
2970
                                asymbol **ret)
2971
{
2972
  asymbol *s;
2973
  long i;
2974
  long count;
2975
  char *names;
2976
  long symcount, codesecsym, codesecsymend, secsymend, opdsymend;
2977
  asection *opd;
2978
  bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
2979
  asymbol **syms;
2980
 
2981
  *ret = NULL;
2982
 
2983
  opd = bfd_get_section_by_name (abfd, ".opd");
2984
  if (opd == NULL)
2985
    return 0;
2986
 
2987
  symcount = static_count;
2988
  if (!relocatable)
2989
    symcount += dyn_count;
2990
  if (symcount == 0)
2991
    return 0;
2992
 
2993
  syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
2994
  if (syms == NULL)
2995
    return -1;
2996
 
2997
  if (!relocatable && static_count != 0 && dyn_count != 0)
2998
    {
2999
      /* Use both symbol tables.  */
3000
      memcpy (syms, static_syms, static_count * sizeof (*syms));
3001
      memcpy (syms + static_count, dyn_syms, (dyn_count + 1) * sizeof (*syms));
3002
    }
3003
  else if (!relocatable && static_count == 0)
3004
    memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
3005
  else
3006
    memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
3007
 
3008
  synthetic_relocatable = relocatable;
3009
  qsort (syms, symcount, sizeof (*syms), compare_symbols);
3010
 
3011
  if (!relocatable && symcount > 1)
3012
    {
3013
      long j;
3014
      /* Trim duplicate syms, since we may have merged the normal and
3015
         dynamic symbols.  Actually, we only care about syms that have
3016
         different values, so trim any with the same value.  */
3017
      for (i = 1, j = 1; i < symcount; ++i)
3018
        if (syms[i - 1]->value + syms[i - 1]->section->vma
3019
            != syms[i]->value + syms[i]->section->vma)
3020
          syms[j++] = syms[i];
3021
      symcount = j;
3022
    }
3023
 
3024
  i = 0;
3025
  if (strcmp (syms[i]->section->name, ".opd") == 0)
3026
    ++i;
3027
  codesecsym = i;
3028
 
3029
  for (; i < symcount; ++i)
3030
    if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3031
         != (SEC_CODE | SEC_ALLOC))
3032
        || (syms[i]->flags & BSF_SECTION_SYM) == 0)
3033
      break;
3034
  codesecsymend = i;
3035
 
3036
  for (; i < symcount; ++i)
3037
    if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
3038
      break;
3039
  secsymend = i;
3040
 
3041
  for (; i < symcount; ++i)
3042
    if (strcmp (syms[i]->section->name, ".opd") != 0)
3043
      break;
3044
  opdsymend = i;
3045
 
3046
  for (; i < symcount; ++i)
3047
    if ((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3048
        != (SEC_CODE | SEC_ALLOC))
3049
      break;
3050
  symcount = i;
3051
 
3052
  count = 0;
3053
 
3054
  if (relocatable)
3055
    {
3056
      bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3057
      arelent *r;
3058
      size_t size;
3059
      long relcount;
3060
 
3061
      if (opdsymend == secsymend)
3062
        goto done;
3063
 
3064
      slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3065
      relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
3066
      if (relcount == 0)
3067
        goto done;
3068
 
3069
      if (!(*slurp_relocs) (abfd, opd, static_syms, FALSE))
3070
        {
3071
          count = -1;
3072
          goto done;
3073
        }
3074
 
3075
      size = 0;
3076
      for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
3077
        {
3078
          asymbol *sym;
3079
 
3080
          while (r < opd->relocation + relcount
3081
                 && r->address < syms[i]->value + opd->vma)
3082
            ++r;
3083
 
3084
          if (r == opd->relocation + relcount)
3085
            break;
3086
 
3087
          if (r->address != syms[i]->value + opd->vma)
3088
            continue;
3089
 
3090
          if (r->howto->type != R_PPC64_ADDR64)
3091
            continue;
3092
 
3093
          sym = *r->sym_ptr_ptr;
3094
          if (!sym_exists_at (syms, opdsymend, symcount,
3095
                              sym->section->id, sym->value + r->addend))
3096
            {
3097
              ++count;
3098
              size += sizeof (asymbol);
3099
              size += strlen (syms[i]->name) + 2;
3100
            }
3101
        }
3102
 
3103
      s = *ret = bfd_malloc (size);
3104
      if (s == NULL)
3105
        {
3106
          count = -1;
3107
          goto done;
3108
        }
3109
 
3110
      names = (char *) (s + count);
3111
 
3112
      for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
3113
        {
3114
          asymbol *sym;
3115
 
3116
          while (r < opd->relocation + relcount
3117
                 && r->address < syms[i]->value + opd->vma)
3118
            ++r;
3119
 
3120
          if (r == opd->relocation + relcount)
3121
            break;
3122
 
3123
          if (r->address != syms[i]->value + opd->vma)
3124
            continue;
3125
 
3126
          if (r->howto->type != R_PPC64_ADDR64)
3127
            continue;
3128
 
3129
          sym = *r->sym_ptr_ptr;
3130
          if (!sym_exists_at (syms, opdsymend, symcount,
3131
                              sym->section->id, sym->value + r->addend))
3132
            {
3133
              size_t len;
3134
 
3135
              *s = *syms[i];
3136
              s->flags |= BSF_SYNTHETIC;
3137
              s->section = sym->section;
3138
              s->value = sym->value + r->addend;
3139
              s->name = names;
3140
              *names++ = '.';
3141
              len = strlen (syms[i]->name);
3142
              memcpy (names, syms[i]->name, len + 1);
3143
              names += len + 1;
3144
              /* Have udata.p point back to the original symbol this
3145
                 synthetic symbol was derived from.  */
3146
              s->udata.p = syms[i];
3147
              s++;
3148
            }
3149
        }
3150
    }
3151
  else
3152
    {
3153
      bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3154
      bfd_byte *contents;
3155
      size_t size;
3156
      long plt_count = 0;
3157
      bfd_vma glink_vma = 0, resolv_vma = 0;
3158
      asection *dynamic, *glink = NULL, *relplt = NULL;
3159
      arelent *p;
3160
 
3161
      if (!bfd_malloc_and_get_section (abfd, opd, &contents))
3162
        {
3163
          if (contents)
3164
            {
3165
            free_contents_and_exit:
3166
              free (contents);
3167
            }
3168
          count = -1;
3169
          goto done;
3170
        }
3171
 
3172
      size = 0;
3173
      for (i = secsymend; i < opdsymend; ++i)
3174
        {
3175
          bfd_vma ent;
3176
 
3177
          /* Ignore bogus symbols.  */
3178
          if (syms[i]->value > opd->size - 8)
3179
            continue;
3180
 
3181
          ent = bfd_get_64 (abfd, contents + syms[i]->value);
3182
          if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3183
            {
3184
              ++count;
3185
              size += sizeof (asymbol);
3186
              size += strlen (syms[i]->name) + 2;
3187
            }
3188
        }
3189
 
3190
      /* Get start of .glink stubs from DT_PPC64_GLINK.  */
3191
      if (dyn_count != 0
3192
          && (dynamic = bfd_get_section_by_name (abfd, ".dynamic")) != NULL)
3193
        {
3194
          bfd_byte *dynbuf, *extdyn, *extdynend;
3195
          size_t extdynsize;
3196
          void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
3197
 
3198
          if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
3199
            goto free_contents_and_exit;
3200
 
3201
          extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
3202
          swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
3203
 
3204
          extdyn = dynbuf;
3205
          extdynend = extdyn + dynamic->size;
3206
          for (; extdyn < extdynend; extdyn += extdynsize)
3207
            {
3208
              Elf_Internal_Dyn dyn;
3209
              (*swap_dyn_in) (abfd, extdyn, &dyn);
3210
 
3211
              if (dyn.d_tag == DT_NULL)
3212
                break;
3213
 
3214
              if (dyn.d_tag == DT_PPC64_GLINK)
3215
                {
3216
                  /* The first glink stub starts at offset 32; see comment in
3217
                     ppc64_elf_finish_dynamic_sections. */
3218
                  glink_vma = dyn.d_un.d_val + 32;
3219
                  /* The .glink section usually does not survive the final
3220
                     link; search for the section (usually .text) where the
3221
                     glink stubs now reside.  */
3222
                  glink = bfd_sections_find_if (abfd, section_covers_vma,
3223
                                                &glink_vma);
3224
                  break;
3225
                }
3226
            }
3227
 
3228
          free (dynbuf);
3229
        }
3230
 
3231
      if (glink != NULL)
3232
        {
3233
          /* Determine __glink trampoline by reading the relative branch
3234
             from the first glink stub.  */
3235
          bfd_byte buf[4];
3236
          if (bfd_get_section_contents (abfd, glink, buf,
3237
                                        glink_vma + 4 - glink->vma, 4))
3238
            {
3239
              unsigned int insn = bfd_get_32 (abfd, buf);
3240
              insn ^= B_DOT;
3241
              if ((insn & ~0x3fffffc) == 0)
3242
                resolv_vma = glink_vma + 4 + (insn ^ 0x2000000) - 0x2000000;
3243
            }
3244
 
3245
          if (resolv_vma)
3246
            size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
3247
 
3248
          relplt = bfd_get_section_by_name (abfd, ".rela.plt");
3249
          if (relplt != NULL)
3250
            {
3251
              slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3252
              if (! (*slurp_relocs) (abfd, relplt, dyn_syms, TRUE))
3253
                goto free_contents_and_exit;
3254
 
3255
              plt_count = relplt->size / sizeof (Elf64_External_Rela);
3256
              size += plt_count * sizeof (asymbol);
3257
 
3258
              p = relplt->relocation;
3259
              for (i = 0; i < plt_count; i++, p++)
3260
                {
3261
                  size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
3262
                  if (p->addend != 0)
3263
                    size += sizeof ("+0x") - 1 + 16;
3264
                }
3265
            }
3266
        }
3267
 
3268
      s = *ret = bfd_malloc (size);
3269
      if (s == NULL)
3270
        goto free_contents_and_exit;
3271
 
3272
      names = (char *) (s + count + plt_count + (resolv_vma != 0));
3273
 
3274
      for (i = secsymend; i < opdsymend; ++i)
3275
        {
3276
          bfd_vma ent;
3277
 
3278
          if (syms[i]->value > opd->size - 8)
3279
            continue;
3280
 
3281
          ent = bfd_get_64 (abfd, contents + syms[i]->value);
3282
          if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3283
            {
3284
              long lo, hi;
3285
              size_t len;
3286
              asection *sec = abfd->sections;
3287
 
3288
              *s = *syms[i];
3289
              lo = codesecsym;
3290
              hi = codesecsymend;
3291
              while (lo < hi)
3292
                {
3293
                  long mid = (lo + hi) >> 1;
3294
                  if (syms[mid]->section->vma < ent)
3295
                    lo = mid + 1;
3296
                  else if (syms[mid]->section->vma > ent)
3297
                    hi = mid;
3298
                  else
3299
                    {
3300
                      sec = syms[mid]->section;
3301
                      break;
3302
                    }
3303
                }
3304
 
3305
              if (lo >= hi && lo > codesecsym)
3306
                sec = syms[lo - 1]->section;
3307
 
3308
              for (; sec != NULL; sec = sec->next)
3309
                {
3310
                  if (sec->vma > ent)
3311
                    break;
3312
                  /* SEC_LOAD may not be set if SEC is from a separate debug
3313
                     info file.  */
3314
                  if ((sec->flags & SEC_ALLOC) == 0)
3315
                    break;
3316
                  if ((sec->flags & SEC_CODE) != 0)
3317
                    s->section = sec;
3318
                }
3319
              s->flags |= BSF_SYNTHETIC;
3320
              s->value = ent - s->section->vma;
3321
              s->name = names;
3322
              *names++ = '.';
3323
              len = strlen (syms[i]->name);
3324
              memcpy (names, syms[i]->name, len + 1);
3325
              names += len + 1;
3326
              /* Have udata.p point back to the original symbol this
3327
                 synthetic symbol was derived from.  */
3328
              s->udata.p = syms[i];
3329
              s++;
3330
            }
3331
        }
3332
      free (contents);
3333
 
3334
      if (glink != NULL && relplt != NULL)
3335
        {
3336
          if (resolv_vma)
3337
            {
3338
              /* Add a symbol for the main glink trampoline.  */
3339
              memset (s, 0, sizeof *s);
3340
              s->the_bfd = abfd;
3341
              s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
3342
              s->section = glink;
3343
              s->value = resolv_vma - glink->vma;
3344
              s->name = names;
3345
              memcpy (names, "__glink_PLTresolve", sizeof ("__glink_PLTresolve"));
3346
              names += sizeof ("__glink_PLTresolve");
3347
              s++;
3348
              count++;
3349
            }
3350
 
3351
          /* FIXME: It would be very much nicer to put sym@plt on the
3352
             stub rather than on the glink branch table entry.  The
3353
             objdump disassembler would then use a sensible symbol
3354
             name on plt calls.  The difficulty in doing so is
3355
             a) finding the stubs, and,
3356
             b) matching stubs against plt entries, and,
3357
             c) there can be multiple stubs for a given plt entry.
3358
 
3359
             Solving (a) could be done by code scanning, but older
3360
             ppc64 binaries used different stubs to current code.
3361
             (b) is the tricky one since you need to known the toc
3362
             pointer for at least one function that uses a pic stub to
3363
             be able to calculate the plt address referenced.
3364
             (c) means gdb would need to set multiple breakpoints (or
3365
             find the glink branch itself) when setting breakpoints
3366
             for pending shared library loads.  */
3367
          p = relplt->relocation;
3368
          for (i = 0; i < plt_count; i++, p++)
3369
            {
3370
              size_t len;
3371
 
3372
              *s = **p->sym_ptr_ptr;
3373
              /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set.  Since
3374
                 we are defining a symbol, ensure one of them is set.  */
3375
              if ((s->flags & BSF_LOCAL) == 0)
3376
                s->flags |= BSF_GLOBAL;
3377
              s->flags |= BSF_SYNTHETIC;
3378
              s->section = glink;
3379
              s->value = glink_vma - glink->vma;
3380
              s->name = names;
3381
              s->udata.p = NULL;
3382
              len = strlen ((*p->sym_ptr_ptr)->name);
3383
              memcpy (names, (*p->sym_ptr_ptr)->name, len);
3384
              names += len;
3385
              if (p->addend != 0)
3386
                {
3387
                  memcpy (names, "+0x", sizeof ("+0x") - 1);
3388
                  names += sizeof ("+0x") - 1;
3389
                  bfd_sprintf_vma (abfd, names, p->addend);
3390
                  names += strlen (names);
3391
                }
3392
              memcpy (names, "@plt", sizeof ("@plt"));
3393
              names += sizeof ("@plt");
3394
              s++;
3395
              glink_vma += 8;
3396
              if (i >= 0x8000)
3397
                glink_vma += 4;
3398
            }
3399
          count += plt_count;
3400
        }
3401
    }
3402
 
3403
 done:
3404
  free (syms);
3405
  return count;
3406
}
3407
 
3408
/* The following functions are specific to the ELF linker, while
3409
   functions above are used generally.  Those named ppc64_elf_* are
3410
   called by the main ELF linker code.  They appear in this file more
3411
   or less in the order in which they are called.  eg.
3412
   ppc64_elf_check_relocs is called early in the link process,
3413
   ppc64_elf_finish_dynamic_sections is one of the last functions
3414
   called.
3415
 
3416
   PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
3417
   functions have both a function code symbol and a function descriptor
3418
   symbol.  A call to foo in a relocatable object file looks like:
3419
 
3420
   .            .text
3421
   .    x:
3422
   .            bl      .foo
3423
   .            nop
3424
 
3425
   The function definition in another object file might be:
3426
 
3427
   .            .section .opd
3428
   .    foo:    .quad   .foo
3429
   .            .quad   .TOC.@tocbase
3430
   .            .quad   0
3431
   .
3432
   .            .text
3433
   .    .foo:   blr
3434
 
3435
   When the linker resolves the call during a static link, the branch
3436
   unsurprisingly just goes to .foo and the .opd information is unused.
3437
   If the function definition is in a shared library, things are a little
3438
   different:  The call goes via a plt call stub, the opd information gets
3439
   copied to the plt, and the linker patches the nop.
3440
 
3441
   .    x:
3442
   .            bl      .foo_stub
3443
   .            ld      2,40(1)
3444
   .
3445
   .
3446
   .    .foo_stub:
3447
   .            addis   12,2,Lfoo@toc@ha        # in practice, the call stub
3448
   .            addi    12,12,Lfoo@toc@l        # is slightly optimized, but
3449
   .            std     2,40(1)                 # this is the general idea
3450
   .            ld      11,0(12)
3451
   .            ld      2,8(12)
3452
   .            mtctr   11
3453
   .            ld      11,16(12)
3454
   .            bctr
3455
   .
3456
   .            .section .plt
3457
   .    Lfoo:   reloc (R_PPC64_JMP_SLOT, foo)
3458
 
3459
   The "reloc ()" notation is supposed to indicate that the linker emits
3460
   an R_PPC64_JMP_SLOT reloc against foo.  The dynamic linker does the opd
3461
   copying.
3462
 
3463
   What are the difficulties here?  Well, firstly, the relocations
3464
   examined by the linker in check_relocs are against the function code
3465
   sym .foo, while the dynamic relocation in the plt is emitted against
3466
   the function descriptor symbol, foo.  Somewhere along the line, we need
3467
   to carefully copy dynamic link information from one symbol to the other.
3468
   Secondly, the generic part of the elf linker will make .foo a dynamic
3469
   symbol as is normal for most other backends.  We need foo dynamic
3470
   instead, at least for an application final link.  However, when
3471
   creating a shared library containing foo, we need to have both symbols
3472
   dynamic so that references to .foo are satisfied during the early
3473
   stages of linking.  Otherwise the linker might decide to pull in a
3474
   definition from some other object, eg. a static library.
3475
 
3476
   Update: As of August 2004, we support a new convention.  Function
3477
   calls may use the function descriptor symbol, ie. "bl foo".  This
3478
   behaves exactly as "bl .foo".  */
3479
 
3480
/* Of those relocs that might be copied as dynamic relocs, this function
3481
   selects those that must be copied when linking a shared library,
3482
   even when the symbol is local.  */
3483
 
3484
static int
3485
must_be_dyn_reloc (struct bfd_link_info *info,
3486
                   enum elf_ppc64_reloc_type r_type)
3487
{
3488
  switch (r_type)
3489
    {
3490
    default:
3491
      return 1;
3492
 
3493
    case R_PPC64_REL32:
3494
    case R_PPC64_REL64:
3495
    case R_PPC64_REL30:
3496
      return 0;
3497
 
3498
    case R_PPC64_TPREL16:
3499
    case R_PPC64_TPREL16_LO:
3500
    case R_PPC64_TPREL16_HI:
3501
    case R_PPC64_TPREL16_HA:
3502
    case R_PPC64_TPREL16_DS:
3503
    case R_PPC64_TPREL16_LO_DS:
3504
    case R_PPC64_TPREL16_HIGHER:
3505
    case R_PPC64_TPREL16_HIGHERA:
3506
    case R_PPC64_TPREL16_HIGHEST:
3507
    case R_PPC64_TPREL16_HIGHESTA:
3508
    case R_PPC64_TPREL64:
3509
      return !info->executable;
3510
    }
3511
}
3512
 
3513
/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
3514
   copying dynamic variables from a shared lib into an app's dynbss
3515
   section, and instead use a dynamic relocation to point into the
3516
   shared lib.  With code that gcc generates, it's vital that this be
3517
   enabled;  In the PowerPC64 ABI, the address of a function is actually
3518
   the address of a function descriptor, which resides in the .opd
3519
   section.  gcc uses the descriptor directly rather than going via the
3520
   GOT as some other ABI's do, which means that initialized function
3521
   pointers must reference the descriptor.  Thus, a function pointer
3522
   initialized to the address of a function in a shared library will
3523
   either require a copy reloc, or a dynamic reloc.  Using a copy reloc
3524
   redefines the function descriptor symbol to point to the copy.  This
3525
   presents a problem as a plt entry for that function is also
3526
   initialized from the function descriptor symbol and the copy reloc
3527
   may not be initialized first.  */
3528
#define ELIMINATE_COPY_RELOCS 1
3529
 
3530
/* Section name for stubs is the associated section name plus this
3531
   string.  */
3532
#define STUB_SUFFIX ".stub"
3533
 
3534
/* Linker stubs.
3535
   ppc_stub_long_branch:
3536
   Used when a 14 bit branch (or even a 24 bit branch) can't reach its
3537
   destination, but a 24 bit branch in a stub section will reach.
3538
   .    b       dest
3539
 
3540
   ppc_stub_plt_branch:
3541
   Similar to the above, but a 24 bit branch in the stub section won't
3542
   reach its destination.
3543
   .    addis   %r12,%r2,xxx@toc@ha
3544
   .    ld      %r11,xxx@toc@l(%r12)
3545
   .    mtctr   %r11
3546
   .    bctr
3547
 
3548
   ppc_stub_plt_call:
3549
   Used to call a function in a shared library.  If it so happens that
3550
   the plt entry referenced crosses a 64k boundary, then an extra
3551
   "addi %r12,%r12,xxx@toc@l" will be inserted before the "mtctr".
3552
   .    addis   %r12,%r2,xxx@toc@ha
3553
   .    std     %r2,40(%r1)
3554
   .    ld      %r11,xxx+0@toc@l(%r12)
3555
   .    mtctr   %r11
3556
   .    ld      %r2,xxx+8@toc@l(%r12)
3557
   .    ld      %r11,xxx+16@toc@l(%r12)
3558
   .    bctr
3559
 
3560
   ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
3561
   code to adjust the value and save r2 to support multiple toc sections.
3562
   A ppc_stub_long_branch with an r2 offset looks like:
3563
   .    std     %r2,40(%r1)
3564
   .    addis   %r2,%r2,off@ha
3565
   .    addi    %r2,%r2,off@l
3566
   .    b       dest
3567
 
3568
   A ppc_stub_plt_branch with an r2 offset looks like:
3569
   .    std     %r2,40(%r1)
3570
   .    addis   %r12,%r2,xxx@toc@ha
3571
   .    ld      %r11,xxx@toc@l(%r12)
3572
   .    addis   %r2,%r2,off@ha
3573
   .    addi    %r2,%r2,off@l
3574
   .    mtctr   %r11
3575
   .    bctr
3576
 
3577
   In cases where the "addis" instruction would add zero, the "addis" is
3578
   omitted and following instructions modified slightly in some cases.
3579
*/
3580
 
3581
enum ppc_stub_type {
3582
  ppc_stub_none,
3583
  ppc_stub_long_branch,
3584
  ppc_stub_long_branch_r2off,
3585
  ppc_stub_plt_branch,
3586
  ppc_stub_plt_branch_r2off,
3587
  ppc_stub_plt_call
3588
};
3589
 
3590
struct ppc_stub_hash_entry {
3591
 
3592
  /* Base hash table entry structure.  */
3593
  struct bfd_hash_entry root;
3594
 
3595
  enum ppc_stub_type stub_type;
3596
 
3597
  /* The stub section.  */
3598
  asection *stub_sec;
3599
 
3600
  /* Offset within stub_sec of the beginning of this stub.  */
3601
  bfd_vma stub_offset;
3602
 
3603
  /* Given the symbol's value and its section we can determine its final
3604
     value when building the stubs (so the stub knows where to jump.  */
3605
  bfd_vma target_value;
3606
  asection *target_section;
3607
 
3608
  /* The symbol table entry, if any, that this was derived from.  */
3609
  struct ppc_link_hash_entry *h;
3610
  struct plt_entry *plt_ent;
3611
 
3612
  /* And the reloc addend that this was derived from.  */
3613
  bfd_vma addend;
3614
 
3615
  /* Where this stub is being called from, or, in the case of combined
3616
     stub sections, the first input section in the group.  */
3617
  asection *id_sec;
3618
};
3619
 
3620
struct ppc_branch_hash_entry {
3621
 
3622
  /* Base hash table entry structure.  */
3623
  struct bfd_hash_entry root;
3624
 
3625
  /* Offset within branch lookup table.  */
3626
  unsigned int offset;
3627
 
3628
  /* Generation marker.  */
3629
  unsigned int iter;
3630
};
3631
 
3632
struct ppc_link_hash_entry
3633
{
3634
  struct elf_link_hash_entry elf;
3635
 
3636
  union {
3637
    /* A pointer to the most recently used stub hash entry against this
3638
       symbol.  */
3639
    struct ppc_stub_hash_entry *stub_cache;
3640
 
3641
    /* A pointer to the next symbol starting with a '.'  */
3642
    struct ppc_link_hash_entry *next_dot_sym;
3643
  } u;
3644
 
3645
  /* Track dynamic relocs copied for this symbol.  */
3646
  struct elf_dyn_relocs *dyn_relocs;
3647
 
3648
  /* Link between function code and descriptor symbols.  */
3649
  struct ppc_link_hash_entry *oh;
3650
 
3651
  /* Flag function code and descriptor symbols.  */
3652
  unsigned int is_func:1;
3653
  unsigned int is_func_descriptor:1;
3654
  unsigned int fake:1;
3655
 
3656
  /* Whether global opd/toc sym has been adjusted or not.
3657
     After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
3658
     should be set for all globals defined in any opd/toc section.  */
3659
  unsigned int adjust_done:1;
3660
 
3661
  /* Set if we twiddled this symbol to weak at some stage.  */
3662
  unsigned int was_undefined:1;
3663
 
3664
  /* Contexts in which symbol is used in the GOT (or TOC).
3665
     TLS_GD .. TLS_EXPLICIT bits are or'd into the mask as the
3666
     corresponding relocs are encountered during check_relocs.
3667
     tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
3668
     indicate the corresponding GOT entry type is not needed.
3669
     tls_optimize may also set TLS_TPRELGD when a GD reloc turns into
3670
     a TPREL one.  We use a separate flag rather than setting TPREL
3671
     just for convenience in distinguishing the two cases.  */
3672
#define TLS_GD           1      /* GD reloc. */
3673
#define TLS_LD           2      /* LD reloc. */
3674
#define TLS_TPREL        4      /* TPREL reloc, => IE. */
3675
#define TLS_DTPREL       8      /* DTPREL reloc, => LD. */
3676
#define TLS_TLS         16      /* Any TLS reloc.  */
3677
#define TLS_EXPLICIT    32      /* Marks TOC section TLS relocs. */
3678
#define TLS_TPRELGD     64      /* TPREL reloc resulting from GD->IE. */
3679
#define PLT_IFUNC      128      /* STT_GNU_IFUNC.  */
3680
  unsigned char tls_mask;
3681
};
3682
 
3683
/* ppc64 ELF linker hash table.  */
3684
 
3685
struct ppc_link_hash_table
3686
{
3687
  struct elf_link_hash_table elf;
3688
 
3689
  /* The stub hash table.  */
3690
  struct bfd_hash_table stub_hash_table;
3691
 
3692
  /* Another hash table for plt_branch stubs.  */
3693
  struct bfd_hash_table branch_hash_table;
3694
 
3695 163 khays
  /* Hash table for function prologue tocsave.  */
3696
  htab_t tocsave_htab;
3697
 
3698 14 khays
  /* Linker stub bfd.  */
3699
  bfd *stub_bfd;
3700
 
3701
  /* Linker call-backs.  */
3702
  asection * (*add_stub_section) (const char *, asection *);
3703
  void (*layout_sections_again) (void);
3704
 
3705
  /* Array to keep track of which stub sections have been created, and
3706
     information on stub grouping.  */
3707
  struct map_stub {
3708
    /* This is the section to which stubs in the group will be attached.  */
3709
    asection *link_sec;
3710
    /* The stub section.  */
3711
    asection *stub_sec;
3712
    /* Along with elf_gp, specifies the TOC pointer used in this group.  */
3713
    bfd_vma toc_off;
3714
  } *stub_group;
3715
 
3716
  /* Temp used when calculating TOC pointers.  */
3717
  bfd_vma toc_curr;
3718
  bfd *toc_bfd;
3719
  asection *toc_first_sec;
3720
 
3721
  /* Highest input section id.  */
3722
  int top_id;
3723
 
3724
  /* Highest output section index.  */
3725
  int top_index;
3726
 
3727
  /* Used when adding symbols.  */
3728
  struct ppc_link_hash_entry *dot_syms;
3729
 
3730
  /* List of input sections for each output section.  */
3731
  asection **input_list;
3732
 
3733
  /* Short-cuts to get to dynamic linker sections.  */
3734
  asection *got;
3735
  asection *plt;
3736
  asection *relplt;
3737
  asection *iplt;
3738
  asection *reliplt;
3739
  asection *dynbss;
3740
  asection *relbss;
3741
  asection *glink;
3742
  asection *sfpr;
3743
  asection *brlt;
3744
  asection *relbrlt;
3745 161 khays
  asection *glink_eh_frame;
3746 14 khays
 
3747
  /* Shortcut to .__tls_get_addr and __tls_get_addr.  */
3748
  struct ppc_link_hash_entry *tls_get_addr;
3749
  struct ppc_link_hash_entry *tls_get_addr_fd;
3750
 
3751
  /* The size of reliplt used by got entry relocs.  */
3752
  bfd_size_type got_reli_size;
3753
 
3754
  /* Statistics.  */
3755
  unsigned long stub_count[ppc_stub_plt_call];
3756
 
3757
  /* Number of stubs against global syms.  */
3758
  unsigned long stub_globals;
3759
 
3760 161 khays
  /* Set if PLT call stubs should load r11.  */
3761
  unsigned int plt_static_chain:1;
3762
 
3763 14 khays
  /* Set if we should emit symbols for stubs.  */
3764
  unsigned int emit_stub_syms:1;
3765
 
3766
  /* Set if __tls_get_addr optimization should not be done.  */
3767
  unsigned int no_tls_get_addr_opt:1;
3768
 
3769
  /* Support for multiple toc sections.  */
3770
  unsigned int do_multi_toc:1;
3771
  unsigned int multi_toc_needed:1;
3772
  unsigned int second_toc_pass:1;
3773
  unsigned int do_toc_opt:1;
3774
 
3775
  /* Set on error.  */
3776
  unsigned int stub_error:1;
3777
 
3778
  /* Temp used by ppc64_elf_process_dot_syms.  */
3779
  unsigned int twiddled_syms:1;
3780
 
3781
  /* Incremented every time we size stubs.  */
3782
  unsigned int stub_iteration;
3783
 
3784
  /* Small local sym cache.  */
3785
  struct sym_cache sym_cache;
3786
};
3787
 
3788
/* Rename some of the generic section flags to better document how they
3789
   are used here.  */
3790
 
3791
/* Nonzero if this section has TLS related relocations.  */
3792
#define has_tls_reloc sec_flg0
3793
 
3794
/* Nonzero if this section has a call to __tls_get_addr.  */
3795
#define has_tls_get_addr_call sec_flg1
3796
 
3797
/* Nonzero if this section has any toc or got relocs.  */
3798
#define has_toc_reloc sec_flg2
3799
 
3800
/* Nonzero if this section has a call to another section that uses
3801
   the toc or got.  */
3802
#define makes_toc_func_call sec_flg3
3803
 
3804
/* Recursion protection when determining above flag.  */
3805
#define call_check_in_progress sec_flg4
3806
#define call_check_done sec_flg5
3807
 
3808
/* Get the ppc64 ELF linker hash table from a link_info structure.  */
3809
 
3810
#define ppc_hash_table(p) \
3811
  (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
3812
  == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL)
3813
 
3814
#define ppc_stub_hash_lookup(table, string, create, copy) \
3815
  ((struct ppc_stub_hash_entry *) \
3816
   bfd_hash_lookup ((table), (string), (create), (copy)))
3817
 
3818
#define ppc_branch_hash_lookup(table, string, create, copy) \
3819
  ((struct ppc_branch_hash_entry *) \
3820
   bfd_hash_lookup ((table), (string), (create), (copy)))
3821
 
3822
/* Create an entry in the stub hash table.  */
3823
 
3824
static struct bfd_hash_entry *
3825
stub_hash_newfunc (struct bfd_hash_entry *entry,
3826
                   struct bfd_hash_table *table,
3827
                   const char *string)
3828
{
3829
  /* Allocate the structure if it has not already been allocated by a
3830
     subclass.  */
3831
  if (entry == NULL)
3832
    {
3833
      entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
3834
      if (entry == NULL)
3835
        return entry;
3836
    }
3837
 
3838
  /* Call the allocation method of the superclass.  */
3839
  entry = bfd_hash_newfunc (entry, table, string);
3840
  if (entry != NULL)
3841
    {
3842
      struct ppc_stub_hash_entry *eh;
3843
 
3844
      /* Initialize the local fields.  */
3845
      eh = (struct ppc_stub_hash_entry *) entry;
3846
      eh->stub_type = ppc_stub_none;
3847
      eh->stub_sec = NULL;
3848
      eh->stub_offset = 0;
3849
      eh->target_value = 0;
3850
      eh->target_section = NULL;
3851
      eh->h = NULL;
3852
      eh->id_sec = NULL;
3853
    }
3854
 
3855
  return entry;
3856
}
3857
 
3858
/* Create an entry in the branch hash table.  */
3859
 
3860
static struct bfd_hash_entry *
3861
branch_hash_newfunc (struct bfd_hash_entry *entry,
3862
                     struct bfd_hash_table *table,
3863
                     const char *string)
3864
{
3865
  /* Allocate the structure if it has not already been allocated by a
3866
     subclass.  */
3867
  if (entry == NULL)
3868
    {
3869
      entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
3870
      if (entry == NULL)
3871
        return entry;
3872
    }
3873
 
3874
  /* Call the allocation method of the superclass.  */
3875
  entry = bfd_hash_newfunc (entry, table, string);
3876
  if (entry != NULL)
3877
    {
3878
      struct ppc_branch_hash_entry *eh;
3879
 
3880
      /* Initialize the local fields.  */
3881
      eh = (struct ppc_branch_hash_entry *) entry;
3882
      eh->offset = 0;
3883
      eh->iter = 0;
3884
    }
3885
 
3886
  return entry;
3887
}
3888
 
3889
/* Create an entry in a ppc64 ELF linker hash table.  */
3890
 
3891
static struct bfd_hash_entry *
3892
link_hash_newfunc (struct bfd_hash_entry *entry,
3893
                   struct bfd_hash_table *table,
3894
                   const char *string)
3895
{
3896
  /* Allocate the structure if it has not already been allocated by a
3897
     subclass.  */
3898
  if (entry == NULL)
3899
    {
3900
      entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
3901
      if (entry == NULL)
3902
        return entry;
3903
    }
3904
 
3905
  /* Call the allocation method of the superclass.  */
3906
  entry = _bfd_elf_link_hash_newfunc (entry, table, string);
3907
  if (entry != NULL)
3908
    {
3909
      struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
3910
 
3911
      memset (&eh->u.stub_cache, 0,
3912
              (sizeof (struct ppc_link_hash_entry)
3913
               - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
3914
 
3915
      /* When making function calls, old ABI code references function entry
3916
         points (dot symbols), while new ABI code references the function
3917
         descriptor symbol.  We need to make any combination of reference and
3918
         definition work together, without breaking archive linking.
3919
 
3920
         For a defined function "foo" and an undefined call to "bar":
3921
         An old object defines "foo" and ".foo", references ".bar" (possibly
3922
         "bar" too).
3923
         A new object defines "foo" and references "bar".
3924
 
3925
         A new object thus has no problem with its undefined symbols being
3926
         satisfied by definitions in an old object.  On the other hand, the
3927
         old object won't have ".bar" satisfied by a new object.
3928
 
3929
         Keep a list of newly added dot-symbols.  */
3930
 
3931
      if (string[0] == '.')
3932
        {
3933
          struct ppc_link_hash_table *htab;
3934
 
3935
          htab = (struct ppc_link_hash_table *) table;
3936
          eh->u.next_dot_sym = htab->dot_syms;
3937
          htab->dot_syms = eh;
3938
        }
3939
    }
3940
 
3941
  return entry;
3942
}
3943
 
3944 163 khays
struct tocsave_entry {
3945
  asection *sec;
3946
  bfd_vma offset;
3947
};
3948
 
3949
static hashval_t
3950
tocsave_htab_hash (const void *p)
3951
{
3952
  const struct tocsave_entry *e = (const struct tocsave_entry *) p;
3953
  return ((bfd_vma)(intptr_t) e->sec ^ e->offset) >> 3;
3954
}
3955
 
3956
static int
3957
tocsave_htab_eq (const void *p1, const void *p2)
3958
{
3959
  const struct tocsave_entry *e1 = (const struct tocsave_entry *) p1;
3960
  const struct tocsave_entry *e2 = (const struct tocsave_entry *) p2;
3961
  return e1->sec == e2->sec && e1->offset == e2->offset;
3962
}
3963
 
3964 14 khays
/* Create a ppc64 ELF linker hash table.  */
3965
 
3966
static struct bfd_link_hash_table *
3967
ppc64_elf_link_hash_table_create (bfd *abfd)
3968
{
3969
  struct ppc_link_hash_table *htab;
3970
  bfd_size_type amt = sizeof (struct ppc_link_hash_table);
3971
 
3972
  htab = bfd_zmalloc (amt);
3973
  if (htab == NULL)
3974
    return NULL;
3975
 
3976
  if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
3977
                                      sizeof (struct ppc_link_hash_entry),
3978
                                      PPC64_ELF_DATA))
3979
    {
3980
      free (htab);
3981
      return NULL;
3982
    }
3983
 
3984
  /* Init the stub hash table too.  */
3985
  if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
3986
                            sizeof (struct ppc_stub_hash_entry)))
3987
    return NULL;
3988
 
3989
  /* And the branch hash table.  */
3990
  if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
3991
                            sizeof (struct ppc_branch_hash_entry)))
3992
    return NULL;
3993
 
3994 163 khays
  htab->tocsave_htab = htab_try_create (1024,
3995
                                        tocsave_htab_hash,
3996
                                        tocsave_htab_eq,
3997
                                        NULL);
3998
  if (htab->tocsave_htab == NULL)
3999
    return NULL;
4000
 
4001 14 khays
  /* Initializing two fields of the union is just cosmetic.  We really
4002
     only care about glist, but when compiled on a 32-bit host the
4003
     bfd_vma fields are larger.  Setting the bfd_vma to zero makes
4004
     debugger inspection of these fields look nicer.  */
4005
  htab->elf.init_got_refcount.refcount = 0;
4006
  htab->elf.init_got_refcount.glist = NULL;
4007
  htab->elf.init_plt_refcount.refcount = 0;
4008
  htab->elf.init_plt_refcount.glist = NULL;
4009
  htab->elf.init_got_offset.offset = 0;
4010
  htab->elf.init_got_offset.glist = NULL;
4011
  htab->elf.init_plt_offset.offset = 0;
4012
  htab->elf.init_plt_offset.glist = NULL;
4013
 
4014
  return &htab->elf.root;
4015
}
4016
 
4017
/* Free the derived linker hash table.  */
4018
 
4019
static void
4020
ppc64_elf_link_hash_table_free (struct bfd_link_hash_table *hash)
4021
{
4022 163 khays
  struct ppc_link_hash_table *htab = (struct ppc_link_hash_table *) hash;
4023 14 khays
 
4024 163 khays
  bfd_hash_table_free (&htab->stub_hash_table);
4025
  bfd_hash_table_free (&htab->branch_hash_table);
4026
  if (htab->tocsave_htab)
4027
    htab_delete (htab->tocsave_htab);
4028 14 khays
  _bfd_generic_link_hash_table_free (hash);
4029
}
4030
 
4031
/* Satisfy the ELF linker by filling in some fields in our fake bfd.  */
4032
 
4033
void
4034
ppc64_elf_init_stub_bfd (bfd *abfd, struct bfd_link_info *info)
4035
{
4036
  struct ppc_link_hash_table *htab;
4037
 
4038
  elf_elfheader (abfd)->e_ident[EI_CLASS] = ELFCLASS64;
4039
 
4040
/* Always hook our dynamic sections into the first bfd, which is the
4041
   linker created stub bfd.  This ensures that the GOT header is at
4042
   the start of the output TOC section.  */
4043
  htab = ppc_hash_table (info);
4044
  if (htab == NULL)
4045
    return;
4046
  htab->stub_bfd = abfd;
4047
  htab->elf.dynobj = abfd;
4048
}
4049
 
4050
/* Build a name for an entry in the stub hash table.  */
4051
 
4052
static char *
4053
ppc_stub_name (const asection *input_section,
4054
               const asection *sym_sec,
4055
               const struct ppc_link_hash_entry *h,
4056
               const Elf_Internal_Rela *rel)
4057
{
4058
  char *stub_name;
4059
  bfd_size_type len;
4060
 
4061
  /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
4062
     offsets from a sym as a branch target?  In fact, we could
4063
     probably assume the addend is always zero.  */
4064
  BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
4065
 
4066
  if (h)
4067
    {
4068
      len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
4069
      stub_name = bfd_malloc (len);
4070
      if (stub_name == NULL)
4071
        return stub_name;
4072
 
4073
      sprintf (stub_name, "%08x.%s+%x",
4074
               input_section->id & 0xffffffff,
4075
               h->elf.root.root.string,
4076
               (int) rel->r_addend & 0xffffffff);
4077
    }
4078
  else
4079
    {
4080
      len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
4081
      stub_name = bfd_malloc (len);
4082
      if (stub_name == NULL)
4083
        return stub_name;
4084
 
4085
      sprintf (stub_name, "%08x.%x:%x+%x",
4086
               input_section->id & 0xffffffff,
4087
               sym_sec->id & 0xffffffff,
4088
               (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
4089
               (int) rel->r_addend & 0xffffffff);
4090
    }
4091
  if (stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
4092
    stub_name[len - 2] = 0;
4093
  return stub_name;
4094
}
4095
 
4096
/* Look up an entry in the stub hash.  Stub entries are cached because
4097
   creating the stub name takes a bit of time.  */
4098
 
4099
static struct ppc_stub_hash_entry *
4100
ppc_get_stub_entry (const asection *input_section,
4101
                    const asection *sym_sec,
4102
                    struct ppc_link_hash_entry *h,
4103
                    const Elf_Internal_Rela *rel,
4104
                    struct ppc_link_hash_table *htab)
4105
{
4106
  struct ppc_stub_hash_entry *stub_entry;
4107
  const asection *id_sec;
4108
 
4109
  /* If this input section is part of a group of sections sharing one
4110
     stub section, then use the id of the first section in the group.
4111
     Stub names need to include a section id, as there may well be
4112
     more than one stub used to reach say, printf, and we need to
4113
     distinguish between them.  */
4114
  id_sec = htab->stub_group[input_section->id].link_sec;
4115
 
4116
  if (h != NULL && h->u.stub_cache != NULL
4117
      && h->u.stub_cache->h == h
4118
      && h->u.stub_cache->id_sec == id_sec)
4119
    {
4120
      stub_entry = h->u.stub_cache;
4121
    }
4122
  else
4123
    {
4124
      char *stub_name;
4125
 
4126
      stub_name = ppc_stub_name (id_sec, sym_sec, h, rel);
4127
      if (stub_name == NULL)
4128
        return NULL;
4129
 
4130
      stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
4131
                                         stub_name, FALSE, FALSE);
4132
      if (h != NULL)
4133
        h->u.stub_cache = stub_entry;
4134
 
4135
      free (stub_name);
4136
    }
4137
 
4138
  return stub_entry;
4139
}
4140
 
4141
/* Add a new stub entry to the stub hash.  Not all fields of the new
4142
   stub entry are initialised.  */
4143
 
4144
static struct ppc_stub_hash_entry *
4145
ppc_add_stub (const char *stub_name,
4146
              asection *section,
4147
              struct bfd_link_info *info)
4148
{
4149
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
4150
  asection *link_sec;
4151
  asection *stub_sec;
4152
  struct ppc_stub_hash_entry *stub_entry;
4153
 
4154
  link_sec = htab->stub_group[section->id].link_sec;
4155
  stub_sec = htab->stub_group[section->id].stub_sec;
4156
  if (stub_sec == NULL)
4157
    {
4158
      stub_sec = htab->stub_group[link_sec->id].stub_sec;
4159
      if (stub_sec == NULL)
4160
        {
4161
          size_t namelen;
4162
          bfd_size_type len;
4163
          char *s_name;
4164
 
4165
          namelen = strlen (link_sec->name);
4166
          len = namelen + sizeof (STUB_SUFFIX);
4167
          s_name = bfd_alloc (htab->stub_bfd, len);
4168
          if (s_name == NULL)
4169
            return NULL;
4170
 
4171
          memcpy (s_name, link_sec->name, namelen);
4172
          memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
4173
          stub_sec = (*htab->add_stub_section) (s_name, link_sec);
4174
          if (stub_sec == NULL)
4175
            return NULL;
4176
          htab->stub_group[link_sec->id].stub_sec = stub_sec;
4177
        }
4178
      htab->stub_group[section->id].stub_sec = stub_sec;
4179
    }
4180
 
4181
  /* Enter this entry into the linker stub hash table.  */
4182
  stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
4183
                                     TRUE, FALSE);
4184
  if (stub_entry == NULL)
4185
    {
4186 161 khays
      info->callbacks->einfo (_("%P: %B: cannot create stub entry %s\n"),
4187 14 khays
                              section->owner, stub_name);
4188
      return NULL;
4189
    }
4190
 
4191
  stub_entry->stub_sec = stub_sec;
4192
  stub_entry->stub_offset = 0;
4193
  stub_entry->id_sec = link_sec;
4194
  return stub_entry;
4195
}
4196
 
4197
/* Create sections for linker generated code.  */
4198
 
4199
static bfd_boolean
4200
create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
4201
{
4202
  struct ppc_link_hash_table *htab;
4203
  flagword flags;
4204
 
4205
  htab = ppc_hash_table (info);
4206
  if (htab == NULL)
4207
    return FALSE;
4208
 
4209
  /* Create .sfpr for code to save and restore fp regs.  */
4210
  flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
4211
           | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4212
  htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
4213
                                                   flags);
4214
  if (htab->sfpr == NULL
4215
      || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
4216
    return FALSE;
4217
 
4218
  /* Create .glink for lazy dynamic linking support.  */
4219
  htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
4220
                                                    flags);
4221
  if (htab->glink == NULL
4222
      || ! bfd_set_section_alignment (dynobj, htab->glink, 3))
4223
    return FALSE;
4224
 
4225 161 khays
  if (!info->no_ld_generated_unwind_info)
4226
    {
4227
      flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
4228
               | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4229
      htab->glink_eh_frame = bfd_make_section_anyway_with_flags (dynobj,
4230
                                                                 ".eh_frame",
4231
                                                                 flags);
4232
      if (htab->glink_eh_frame == NULL
4233
          || !bfd_set_section_alignment (abfd, htab->glink_eh_frame, 2))
4234
        return FALSE;
4235
    }
4236
 
4237 14 khays
  flags = SEC_ALLOC | SEC_LINKER_CREATED;
4238
  htab->iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags);
4239
  if (htab->iplt == NULL
4240
      || ! bfd_set_section_alignment (dynobj, htab->iplt, 3))
4241
    return FALSE;
4242
 
4243
  flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4244
           | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4245
  htab->reliplt = bfd_make_section_anyway_with_flags (dynobj,
4246
                                                      ".rela.iplt",
4247
                                                      flags);
4248
  if (htab->reliplt == NULL
4249
      || ! bfd_set_section_alignment (dynobj, htab->reliplt, 3))
4250
    return FALSE;
4251
 
4252
  /* Create branch lookup table for plt_branch stubs.  */
4253
  flags = (SEC_ALLOC | SEC_LOAD
4254
           | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4255
  htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
4256
                                                   flags);
4257
  if (htab->brlt == NULL
4258
      || ! bfd_set_section_alignment (dynobj, htab->brlt, 3))
4259
    return FALSE;
4260
 
4261
  if (!info->shared)
4262
    return TRUE;
4263
 
4264
  flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4265
           | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4266
  htab->relbrlt = bfd_make_section_anyway_with_flags (dynobj,
4267
                                                      ".rela.branch_lt",
4268
                                                      flags);
4269
  if (htab->relbrlt == NULL
4270
      || ! bfd_set_section_alignment (dynobj, htab->relbrlt, 3))
4271
    return FALSE;
4272
 
4273
  return TRUE;
4274
}
4275
 
4276
/* Create .got and .rela.got sections in ABFD, and .got in dynobj if
4277
   not already done.  */
4278
 
4279
static bfd_boolean
4280
create_got_section (bfd *abfd, struct bfd_link_info *info)
4281
{
4282
  asection *got, *relgot;
4283
  flagword flags;
4284
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
4285
 
4286
  if (!is_ppc64_elf (abfd))
4287
    return FALSE;
4288
  if (htab == NULL)
4289
    return FALSE;
4290
 
4291
  if (!htab->got)
4292
    {
4293
      if (! _bfd_elf_create_got_section (htab->elf.dynobj, info))
4294
        return FALSE;
4295
 
4296
      htab->got = bfd_get_section_by_name (htab->elf.dynobj, ".got");
4297
      if (!htab->got)
4298
        abort ();
4299
    }
4300
 
4301
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4302
           | SEC_LINKER_CREATED);
4303
 
4304
  got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
4305
  if (!got
4306
      || !bfd_set_section_alignment (abfd, got, 3))
4307
    return FALSE;
4308
 
4309
  relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
4310
                                               flags | SEC_READONLY);
4311
  if (!relgot
4312
      || ! bfd_set_section_alignment (abfd, relgot, 3))
4313
    return FALSE;
4314
 
4315
  ppc64_elf_tdata (abfd)->got = got;
4316
  ppc64_elf_tdata (abfd)->relgot = relgot;
4317
  return TRUE;
4318
}
4319
 
4320
/* Create the dynamic sections, and set up shortcuts.  */
4321
 
4322
static bfd_boolean
4323
ppc64_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
4324
{
4325
  struct ppc_link_hash_table *htab;
4326
 
4327
  if (!_bfd_elf_create_dynamic_sections (dynobj, info))
4328
    return FALSE;
4329
 
4330
  htab = ppc_hash_table (info);
4331
  if (htab == NULL)
4332
    return FALSE;
4333
 
4334
  if (!htab->got)
4335
    htab->got = bfd_get_section_by_name (dynobj, ".got");
4336
  htab->plt = bfd_get_section_by_name (dynobj, ".plt");
4337
  htab->relplt = bfd_get_section_by_name (dynobj, ".rela.plt");
4338
  htab->dynbss = bfd_get_section_by_name (dynobj, ".dynbss");
4339
  if (!info->shared)
4340
    htab->relbss = bfd_get_section_by_name (dynobj, ".rela.bss");
4341
 
4342
  if (!htab->got || !htab->plt || !htab->relplt || !htab->dynbss
4343
      || (!info->shared && !htab->relbss))
4344
    abort ();
4345
 
4346
  return TRUE;
4347
}
4348
 
4349
/* Follow indirect and warning symbol links.  */
4350
 
4351
static inline struct bfd_link_hash_entry *
4352
follow_link (struct bfd_link_hash_entry *h)
4353
{
4354
  while (h->type == bfd_link_hash_indirect
4355
         || h->type == bfd_link_hash_warning)
4356
    h = h->u.i.link;
4357
  return h;
4358
}
4359
 
4360
static inline struct elf_link_hash_entry *
4361
elf_follow_link (struct elf_link_hash_entry *h)
4362
{
4363
  return (struct elf_link_hash_entry *) follow_link (&h->root);
4364
}
4365
 
4366
static inline struct ppc_link_hash_entry *
4367
ppc_follow_link (struct ppc_link_hash_entry *h)
4368
{
4369
  return (struct ppc_link_hash_entry *) follow_link (&h->elf.root);
4370
}
4371
 
4372
/* Merge PLT info on FROM with that on TO.  */
4373
 
4374
static void
4375
move_plt_plist (struct ppc_link_hash_entry *from,
4376
                struct ppc_link_hash_entry *to)
4377
{
4378
  if (from->elf.plt.plist != NULL)
4379
    {
4380
      if (to->elf.plt.plist != NULL)
4381
        {
4382
          struct plt_entry **entp;
4383
          struct plt_entry *ent;
4384
 
4385
          for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
4386
            {
4387
              struct plt_entry *dent;
4388
 
4389
              for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
4390
                if (dent->addend == ent->addend)
4391
                  {
4392
                    dent->plt.refcount += ent->plt.refcount;
4393
                    *entp = ent->next;
4394
                    break;
4395
                  }
4396
              if (dent == NULL)
4397
                entp = &ent->next;
4398
            }
4399
          *entp = to->elf.plt.plist;
4400
        }
4401
 
4402
      to->elf.plt.plist = from->elf.plt.plist;
4403
      from->elf.plt.plist = NULL;
4404
    }
4405
}
4406
 
4407
/* Copy the extra info we tack onto an elf_link_hash_entry.  */
4408
 
4409
static void
4410
ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
4411
                                struct elf_link_hash_entry *dir,
4412
                                struct elf_link_hash_entry *ind)
4413
{
4414
  struct ppc_link_hash_entry *edir, *eind;
4415
 
4416
  edir = (struct ppc_link_hash_entry *) dir;
4417
  eind = (struct ppc_link_hash_entry *) ind;
4418
 
4419 161 khays
  edir->is_func |= eind->is_func;
4420
  edir->is_func_descriptor |= eind->is_func_descriptor;
4421
  edir->tls_mask |= eind->tls_mask;
4422
  if (eind->oh != NULL)
4423
    edir->oh = ppc_follow_link (eind->oh);
4424
 
4425
  /* If called to transfer flags for a weakdef during processing
4426
     of elf_adjust_dynamic_symbol, don't copy NON_GOT_REF.
4427
     We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
4428
  if (!(ELIMINATE_COPY_RELOCS
4429
        && eind->elf.root.type != bfd_link_hash_indirect
4430
        && edir->elf.dynamic_adjusted))
4431
    edir->elf.non_got_ref |= eind->elf.non_got_ref;
4432
 
4433
  edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
4434
  edir->elf.ref_regular |= eind->elf.ref_regular;
4435
  edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4436
  edir->elf.needs_plt |= eind->elf.needs_plt;
4437
 
4438
  /* If we were called to copy over info for a weak sym, that's all.  */
4439
  if (eind->elf.root.type != bfd_link_hash_indirect)
4440
    return;
4441
 
4442 14 khays
  /* Copy over any dynamic relocs we may have on the indirect sym.  */
4443
  if (eind->dyn_relocs != NULL)
4444
    {
4445
      if (edir->dyn_relocs != NULL)
4446
        {
4447
          struct elf_dyn_relocs **pp;
4448
          struct elf_dyn_relocs *p;
4449
 
4450
          /* Add reloc counts against the indirect sym to the direct sym
4451
             list.  Merge any entries against the same section.  */
4452
          for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
4453
            {
4454
              struct elf_dyn_relocs *q;
4455
 
4456
              for (q = edir->dyn_relocs; q != NULL; q = q->next)
4457
                if (q->sec == p->sec)
4458
                  {
4459
                    q->pc_count += p->pc_count;
4460
                    q->count += p->count;
4461
                    *pp = p->next;
4462
                    break;
4463
                  }
4464
              if (q == NULL)
4465
                pp = &p->next;
4466
            }
4467
          *pp = edir->dyn_relocs;
4468
        }
4469
 
4470
      edir->dyn_relocs = eind->dyn_relocs;
4471
      eind->dyn_relocs = NULL;
4472
    }
4473
 
4474
  /* Copy over got entries that we may have already seen to the
4475
     symbol which just became indirect.  */
4476
  if (eind->elf.got.glist != NULL)
4477
    {
4478
      if (edir->elf.got.glist != NULL)
4479
        {
4480
          struct got_entry **entp;
4481
          struct got_entry *ent;
4482
 
4483
          for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
4484
            {
4485
              struct got_entry *dent;
4486
 
4487
              for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
4488
                if (dent->addend == ent->addend
4489
                    && dent->owner == ent->owner
4490
                    && dent->tls_type == ent->tls_type)
4491
                  {
4492
                    dent->got.refcount += ent->got.refcount;
4493
                    *entp = ent->next;
4494
                    break;
4495
                  }
4496
              if (dent == NULL)
4497
                entp = &ent->next;
4498
            }
4499
          *entp = edir->elf.got.glist;
4500
        }
4501
 
4502
      edir->elf.got.glist = eind->elf.got.glist;
4503
      eind->elf.got.glist = NULL;
4504
    }
4505
 
4506
  /* And plt entries.  */
4507
  move_plt_plist (eind, edir);
4508
 
4509
  if (eind->elf.dynindx != -1)
4510
    {
4511
      if (edir->elf.dynindx != -1)
4512
        _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
4513
                                edir->elf.dynstr_index);
4514
      edir->elf.dynindx = eind->elf.dynindx;
4515
      edir->elf.dynstr_index = eind->elf.dynstr_index;
4516
      eind->elf.dynindx = -1;
4517
      eind->elf.dynstr_index = 0;
4518
    }
4519
}
4520
 
4521
/* Find the function descriptor hash entry from the given function code
4522
   hash entry FH.  Link the entries via their OH fields.  */
4523
 
4524
static struct ppc_link_hash_entry *
4525
lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
4526
{
4527
  struct ppc_link_hash_entry *fdh = fh->oh;
4528
 
4529
  if (fdh == NULL)
4530
    {
4531
      const char *fd_name = fh->elf.root.root.string + 1;
4532
 
4533
      fdh = (struct ppc_link_hash_entry *)
4534
        elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
4535
      if (fdh == NULL)
4536
        return fdh;
4537
 
4538
      fdh->is_func_descriptor = 1;
4539
      fdh->oh = fh;
4540
      fh->is_func = 1;
4541
      fh->oh = fdh;
4542
    }
4543
 
4544
  return ppc_follow_link (fdh);
4545
}
4546
 
4547
/* Make a fake function descriptor sym for the code sym FH.  */
4548
 
4549
static struct ppc_link_hash_entry *
4550
make_fdh (struct bfd_link_info *info,
4551
          struct ppc_link_hash_entry *fh)
4552
{
4553
  bfd *abfd;
4554
  asymbol *newsym;
4555
  struct bfd_link_hash_entry *bh;
4556
  struct ppc_link_hash_entry *fdh;
4557
 
4558
  abfd = fh->elf.root.u.undef.abfd;
4559
  newsym = bfd_make_empty_symbol (abfd);
4560
  newsym->name = fh->elf.root.root.string + 1;
4561
  newsym->section = bfd_und_section_ptr;
4562
  newsym->value = 0;
4563
  newsym->flags = BSF_WEAK;
4564
 
4565
  bh = NULL;
4566
  if (!_bfd_generic_link_add_one_symbol (info, abfd, newsym->name,
4567
                                         newsym->flags, newsym->section,
4568
                                         newsym->value, NULL, FALSE, FALSE,
4569
                                         &bh))
4570
    return NULL;
4571
 
4572
  fdh = (struct ppc_link_hash_entry *) bh;
4573
  fdh->elf.non_elf = 0;
4574
  fdh->fake = 1;
4575
  fdh->is_func_descriptor = 1;
4576
  fdh->oh = fh;
4577
  fh->is_func = 1;
4578
  fh->oh = fdh;
4579
  return fdh;
4580
}
4581
 
4582
/* Fix function descriptor symbols defined in .opd sections to be
4583
   function type.  */
4584
 
4585
static bfd_boolean
4586
ppc64_elf_add_symbol_hook (bfd *ibfd,
4587
                           struct bfd_link_info *info,
4588
                           Elf_Internal_Sym *isym,
4589
                           const char **name ATTRIBUTE_UNUSED,
4590
                           flagword *flags ATTRIBUTE_UNUSED,
4591
                           asection **sec,
4592
                           bfd_vma *value ATTRIBUTE_UNUSED)
4593
{
4594
  if ((ibfd->flags & DYNAMIC) == 0
4595
      && ELF_ST_BIND (isym->st_info) == STB_GNU_UNIQUE)
4596
    elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
4597
 
4598
  if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
4599
    {
4600
      if ((ibfd->flags & DYNAMIC) == 0)
4601
        elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
4602
    }
4603
  else if (ELF_ST_TYPE (isym->st_info) == STT_FUNC)
4604
    ;
4605
  else if (*sec != NULL
4606
           && strcmp ((*sec)->name, ".opd") == 0)
4607
    isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
4608
 
4609
  return TRUE;
4610
}
4611
 
4612
/* This function makes an old ABI object reference to ".bar" cause the
4613
   inclusion of a new ABI object archive that defines "bar".
4614
   NAME is a symbol defined in an archive.  Return a symbol in the hash
4615
   table that might be satisfied by the archive symbols.  */
4616
 
4617
static struct elf_link_hash_entry *
4618
ppc64_elf_archive_symbol_lookup (bfd *abfd,
4619
                                 struct bfd_link_info *info,
4620
                                 const char *name)
4621
{
4622
  struct elf_link_hash_entry *h;
4623
  char *dot_name;
4624
  size_t len;
4625
 
4626
  h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
4627
  if (h != NULL
4628
      /* Don't return this sym if it is a fake function descriptor
4629
         created by add_symbol_adjust.  */
4630
      && !(h->root.type == bfd_link_hash_undefweak
4631
           && ((struct ppc_link_hash_entry *) h)->fake))
4632
    return h;
4633
 
4634
  if (name[0] == '.')
4635
    return h;
4636
 
4637
  len = strlen (name);
4638
  dot_name = bfd_alloc (abfd, len + 2);
4639
  if (dot_name == NULL)
4640
    return (struct elf_link_hash_entry *) 0 - 1;
4641
  dot_name[0] = '.';
4642
  memcpy (dot_name + 1, name, len + 1);
4643
  h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
4644
  bfd_release (abfd, dot_name);
4645
  return h;
4646
}
4647
 
4648
/* This function satisfies all old ABI object references to ".bar" if a
4649
   new ABI object defines "bar".  Well, at least, undefined dot symbols
4650
   are made weak.  This stops later archive searches from including an
4651
   object if we already have a function descriptor definition.  It also
4652
   prevents the linker complaining about undefined symbols.
4653
   We also check and correct mismatched symbol visibility here.  The
4654
   most restrictive visibility of the function descriptor and the
4655
   function entry symbol is used.  */
4656
 
4657
static bfd_boolean
4658
add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
4659
{
4660
  struct ppc_link_hash_table *htab;
4661
  struct ppc_link_hash_entry *fdh;
4662
 
4663
  if (eh->elf.root.type == bfd_link_hash_indirect)
4664
    return TRUE;
4665
 
4666
  if (eh->elf.root.type == bfd_link_hash_warning)
4667
    eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
4668
 
4669
  if (eh->elf.root.root.string[0] != '.')
4670
    abort ();
4671
 
4672
  htab = ppc_hash_table (info);
4673
  if (htab == NULL)
4674
    return FALSE;
4675
 
4676
  fdh = lookup_fdh (eh, htab);
4677
  if (fdh == NULL)
4678
    {
4679
      if (!info->relocatable
4680
          && (eh->elf.root.type == bfd_link_hash_undefined
4681
              || eh->elf.root.type == bfd_link_hash_undefweak)
4682
          && eh->elf.ref_regular)
4683
        {
4684
          /* Make an undefweak function descriptor sym, which is enough to
4685
             pull in an --as-needed shared lib, but won't cause link
4686
             errors.  Archives are handled elsewhere.  */
4687
          fdh = make_fdh (info, eh);
4688
          if (fdh == NULL)
4689
            return FALSE;
4690
          fdh->elf.ref_regular = 1;
4691
        }
4692
    }
4693
  else
4694
    {
4695
      unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
4696
      unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
4697
      if (entry_vis < descr_vis)
4698
        fdh->elf.other += entry_vis - descr_vis;
4699
      else if (entry_vis > descr_vis)
4700
        eh->elf.other += descr_vis - entry_vis;
4701
 
4702
      if ((fdh->elf.root.type == bfd_link_hash_defined
4703
           || fdh->elf.root.type == bfd_link_hash_defweak)
4704
          && eh->elf.root.type == bfd_link_hash_undefined)
4705
        {
4706
          eh->elf.root.type = bfd_link_hash_undefweak;
4707
          eh->was_undefined = 1;
4708
          htab->twiddled_syms = 1;
4709
        }
4710
    }
4711
 
4712
  return TRUE;
4713
}
4714
 
4715
/* Process list of dot-symbols we made in link_hash_newfunc.  */
4716
 
4717
static bfd_boolean
4718
ppc64_elf_process_dot_syms (bfd *ibfd, struct bfd_link_info *info)
4719
{
4720
  struct ppc_link_hash_table *htab;
4721
  struct ppc_link_hash_entry **p, *eh;
4722
 
4723
  if (!is_ppc64_elf (info->output_bfd))
4724
    return TRUE;
4725
  htab = ppc_hash_table (info);
4726
  if (htab == NULL)
4727
    return FALSE;
4728
 
4729
  if (is_ppc64_elf (ibfd))
4730
    {
4731
      p = &htab->dot_syms;
4732
      while ((eh = *p) != NULL)
4733
        {
4734
          *p = NULL;
4735
          if (!add_symbol_adjust (eh, info))
4736
            return FALSE;
4737
          p = &eh->u.next_dot_sym;
4738
        }
4739
    }
4740
 
4741
  /* Clear the list for non-ppc64 input files.  */
4742
  p = &htab->dot_syms;
4743
  while ((eh = *p) != NULL)
4744
    {
4745
      *p = NULL;
4746
      p = &eh->u.next_dot_sym;
4747
    }
4748
 
4749
  /* We need to fix the undefs list for any syms we have twiddled to
4750
     undef_weak.  */
4751
  if (htab->twiddled_syms)
4752
    {
4753
      bfd_link_repair_undef_list (&htab->elf.root);
4754
      htab->twiddled_syms = 0;
4755
    }
4756
  return TRUE;
4757
}
4758
 
4759
/* Undo hash table changes when an --as-needed input file is determined
4760
   not to be needed.  */
4761
 
4762
static bfd_boolean
4763
ppc64_elf_as_needed_cleanup (bfd *ibfd ATTRIBUTE_UNUSED,
4764
                             struct bfd_link_info *info)
4765
{
4766
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
4767
 
4768
  if (htab == NULL)
4769
    return FALSE;
4770
 
4771
  htab->dot_syms = NULL;
4772
  return TRUE;
4773
}
4774
 
4775
/* If --just-symbols against a final linked binary, then assume we need
4776
   toc adjusting stubs when calling functions defined there.  */
4777
 
4778
static void
4779
ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
4780
{
4781
  if ((sec->flags & SEC_CODE) != 0
4782
      && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0
4783
      && is_ppc64_elf (sec->owner))
4784
    {
4785
      asection *got = bfd_get_section_by_name (sec->owner, ".got");
4786
      if (got != NULL
4787
          && got->size >= elf_backend_got_header_size
4788
          && bfd_get_section_by_name (sec->owner, ".opd") != NULL)
4789
        sec->has_toc_reloc = 1;
4790
    }
4791
  _bfd_elf_link_just_syms (sec, info);
4792
}
4793
 
4794
static struct plt_entry **
4795
update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
4796
                       unsigned long r_symndx, bfd_vma r_addend, int tls_type)
4797
{
4798
  struct got_entry **local_got_ents = elf_local_got_ents (abfd);
4799
  struct plt_entry **local_plt;
4800
  unsigned char *local_got_tls_masks;
4801
 
4802
  if (local_got_ents == NULL)
4803
    {
4804
      bfd_size_type size = symtab_hdr->sh_info;
4805
 
4806
      size *= (sizeof (*local_got_ents)
4807
               + sizeof (*local_plt)
4808
               + sizeof (*local_got_tls_masks));
4809
      local_got_ents = bfd_zalloc (abfd, size);
4810
      if (local_got_ents == NULL)
4811
        return NULL;
4812
      elf_local_got_ents (abfd) = local_got_ents;
4813
    }
4814
 
4815
  if ((tls_type & (PLT_IFUNC | TLS_EXPLICIT)) == 0)
4816
    {
4817
      struct got_entry *ent;
4818
 
4819
      for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
4820
        if (ent->addend == r_addend
4821
            && ent->owner == abfd
4822
            && ent->tls_type == tls_type)
4823
          break;
4824
      if (ent == NULL)
4825
        {
4826
          bfd_size_type amt = sizeof (*ent);
4827
          ent = bfd_alloc (abfd, amt);
4828
          if (ent == NULL)
4829
            return FALSE;
4830
          ent->next = local_got_ents[r_symndx];
4831
          ent->addend = r_addend;
4832
          ent->owner = abfd;
4833
          ent->tls_type = tls_type;
4834
          ent->is_indirect = FALSE;
4835
          ent->got.refcount = 0;
4836
          local_got_ents[r_symndx] = ent;
4837
        }
4838
      ent->got.refcount += 1;
4839
    }
4840
 
4841
  local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info);
4842
  local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
4843
  local_got_tls_masks[r_symndx] |= tls_type;
4844
 
4845
  return local_plt + r_symndx;
4846
}
4847
 
4848
static bfd_boolean
4849
update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend)
4850
{
4851
  struct plt_entry *ent;
4852
 
4853
  for (ent = *plist; ent != NULL; ent = ent->next)
4854
    if (ent->addend == addend)
4855
      break;
4856
  if (ent == NULL)
4857
    {
4858
      bfd_size_type amt = sizeof (*ent);
4859
      ent = bfd_alloc (abfd, amt);
4860
      if (ent == NULL)
4861
        return FALSE;
4862
      ent->next = *plist;
4863
      ent->addend = addend;
4864
      ent->plt.refcount = 0;
4865
      *plist = ent;
4866
    }
4867
  ent->plt.refcount += 1;
4868
  return TRUE;
4869
}
4870
 
4871
static bfd_boolean
4872
is_branch_reloc (enum elf_ppc64_reloc_type r_type)
4873
{
4874
  return (r_type == R_PPC64_REL24
4875
          || r_type == R_PPC64_REL14
4876
          || r_type == R_PPC64_REL14_BRTAKEN
4877
          || r_type == R_PPC64_REL14_BRNTAKEN
4878
          || r_type == R_PPC64_ADDR24
4879
          || r_type == R_PPC64_ADDR14
4880
          || r_type == R_PPC64_ADDR14_BRTAKEN
4881
          || r_type == R_PPC64_ADDR14_BRNTAKEN);
4882
}
4883
 
4884
/* Look through the relocs for a section during the first phase, and
4885
   calculate needed space in the global offset table, procedure
4886
   linkage table, and dynamic reloc sections.  */
4887
 
4888
static bfd_boolean
4889
ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
4890
                        asection *sec, const Elf_Internal_Rela *relocs)
4891
{
4892
  struct ppc_link_hash_table *htab;
4893
  Elf_Internal_Shdr *symtab_hdr;
4894
  struct elf_link_hash_entry **sym_hashes;
4895
  const Elf_Internal_Rela *rel;
4896
  const Elf_Internal_Rela *rel_end;
4897
  asection *sreloc;
4898
  asection **opd_sym_map;
4899
  struct elf_link_hash_entry *tga, *dottga;
4900
 
4901
  if (info->relocatable)
4902
    return TRUE;
4903
 
4904
  /* Don't do anything special with non-loaded, non-alloced sections.
4905
     In particular, any relocs in such sections should not affect GOT
4906
     and PLT reference counting (ie. we don't allow them to create GOT
4907
     or PLT entries), there's no possibility or desire to optimize TLS
4908
     relocs, and there's not much point in propagating relocs to shared
4909
     libs that the dynamic linker won't relocate.  */
4910
  if ((sec->flags & SEC_ALLOC) == 0)
4911
    return TRUE;
4912
 
4913
  BFD_ASSERT (is_ppc64_elf (abfd));
4914
 
4915
  htab = ppc_hash_table (info);
4916
  if (htab == NULL)
4917
    return FALSE;
4918
 
4919
  tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
4920
                              FALSE, FALSE, TRUE);
4921
  dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
4922
                                 FALSE, FALSE, TRUE);
4923
  symtab_hdr = &elf_symtab_hdr (abfd);
4924
  sym_hashes = elf_sym_hashes (abfd);
4925
  sreloc = NULL;
4926
  opd_sym_map = NULL;
4927
  if (strcmp (sec->name, ".opd") == 0)
4928
    {
4929
      /* Garbage collection needs some extra help with .opd sections.
4930
         We don't want to necessarily keep everything referenced by
4931
         relocs in .opd, as that would keep all functions.  Instead,
4932
         if we reference an .opd symbol (a function descriptor), we
4933
         want to keep the function code symbol's section.  This is
4934
         easy for global symbols, but for local syms we need to keep
4935
         information about the associated function section.  */
4936
      bfd_size_type amt;
4937
 
4938
      amt = sec->size * sizeof (*opd_sym_map) / 8;
4939
      opd_sym_map = bfd_zalloc (abfd, amt);
4940
      if (opd_sym_map == NULL)
4941
        return FALSE;
4942
      ppc64_elf_section_data (sec)->u.opd.func_sec = opd_sym_map;
4943
      BFD_ASSERT (ppc64_elf_section_data (sec)->sec_type == sec_normal);
4944
      ppc64_elf_section_data (sec)->sec_type = sec_opd;
4945
    }
4946
 
4947
  if (htab->sfpr == NULL
4948
      && !create_linkage_sections (htab->elf.dynobj, info))
4949
    return FALSE;
4950
 
4951
  rel_end = relocs + sec->reloc_count;
4952
  for (rel = relocs; rel < rel_end; rel++)
4953
    {
4954
      unsigned long r_symndx;
4955
      struct elf_link_hash_entry *h;
4956
      enum elf_ppc64_reloc_type r_type;
4957
      int tls_type;
4958
      struct _ppc64_elf_section_data *ppc64_sec;
4959
      struct plt_entry **ifunc;
4960
 
4961
      r_symndx = ELF64_R_SYM (rel->r_info);
4962
      if (r_symndx < symtab_hdr->sh_info)
4963
        h = NULL;
4964
      else
4965
        {
4966
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4967
          h = elf_follow_link (h);
4968
        }
4969
 
4970
      tls_type = 0;
4971
      ifunc = NULL;
4972
      if (h != NULL)
4973
        {
4974
          if (h->type == STT_GNU_IFUNC)
4975
            {
4976
              h->needs_plt = 1;
4977
              ifunc = &h->plt.plist;
4978
            }
4979
        }
4980
      else
4981
        {
4982
          Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
4983
                                                          abfd, r_symndx);
4984
          if (isym == NULL)
4985
            return FALSE;
4986
 
4987
          if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
4988
            {
4989
              ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
4990
                                             rel->r_addend, PLT_IFUNC);
4991
              if (ifunc == NULL)
4992
                return FALSE;
4993
            }
4994
        }
4995
      r_type = ELF64_R_TYPE (rel->r_info);
4996
      if (is_branch_reloc (r_type))
4997
        {
4998
          if (h != NULL && (h == tga || h == dottga))
4999
            {
5000
              if (rel != relocs
5001
                  && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD
5002
                      || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD))
5003
                /* We have a new-style __tls_get_addr call with a marker
5004
                   reloc.  */
5005
                ;
5006
              else
5007
                /* Mark this section as having an old-style call.  */
5008
                sec->has_tls_get_addr_call = 1;
5009
            }
5010
 
5011
          /* STT_GNU_IFUNC symbols must have a PLT entry.  */
5012
          if (ifunc != NULL
5013
              && !update_plt_info (abfd, ifunc, rel->r_addend))
5014
            return FALSE;
5015
        }
5016
 
5017
      switch (r_type)
5018
        {
5019
        case R_PPC64_TLSGD:
5020
        case R_PPC64_TLSLD:
5021
          /* These special tls relocs tie a call to __tls_get_addr with
5022
             its parameter symbol.  */
5023
          break;
5024
 
5025
        case R_PPC64_GOT_TLSLD16:
5026
        case R_PPC64_GOT_TLSLD16_LO:
5027
        case R_PPC64_GOT_TLSLD16_HI:
5028
        case R_PPC64_GOT_TLSLD16_HA:
5029
          tls_type = TLS_TLS | TLS_LD;
5030
          goto dogottls;
5031
 
5032
        case R_PPC64_GOT_TLSGD16:
5033
        case R_PPC64_GOT_TLSGD16_LO:
5034
        case R_PPC64_GOT_TLSGD16_HI:
5035
        case R_PPC64_GOT_TLSGD16_HA:
5036
          tls_type = TLS_TLS | TLS_GD;
5037
          goto dogottls;
5038
 
5039
        case R_PPC64_GOT_TPREL16_DS:
5040
        case R_PPC64_GOT_TPREL16_LO_DS:
5041
        case R_PPC64_GOT_TPREL16_HI:
5042
        case R_PPC64_GOT_TPREL16_HA:
5043
          if (!info->executable)
5044
            info->flags |= DF_STATIC_TLS;
5045
          tls_type = TLS_TLS | TLS_TPREL;
5046
          goto dogottls;
5047
 
5048
        case R_PPC64_GOT_DTPREL16_DS:
5049
        case R_PPC64_GOT_DTPREL16_LO_DS:
5050
        case R_PPC64_GOT_DTPREL16_HI:
5051
        case R_PPC64_GOT_DTPREL16_HA:
5052
          tls_type = TLS_TLS | TLS_DTPREL;
5053
        dogottls:
5054
          sec->has_tls_reloc = 1;
5055
          /* Fall thru */
5056
 
5057
        case R_PPC64_GOT16:
5058
        case R_PPC64_GOT16_DS:
5059
        case R_PPC64_GOT16_HA:
5060
        case R_PPC64_GOT16_HI:
5061
        case R_PPC64_GOT16_LO:
5062
        case R_PPC64_GOT16_LO_DS:
5063
          /* This symbol requires a global offset table entry.  */
5064
          sec->has_toc_reloc = 1;
5065
          if (r_type == R_PPC64_GOT_TLSLD16
5066
              || r_type == R_PPC64_GOT_TLSGD16
5067
              || r_type == R_PPC64_GOT_TPREL16_DS
5068
              || r_type == R_PPC64_GOT_DTPREL16_DS
5069
              || r_type == R_PPC64_GOT16
5070
              || r_type == R_PPC64_GOT16_DS)
5071
            {
5072
              htab->do_multi_toc = 1;
5073
              ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
5074
            }
5075
 
5076
          if (ppc64_elf_tdata (abfd)->got == NULL
5077
              && !create_got_section (abfd, info))
5078
            return FALSE;
5079
 
5080
          if (h != NULL)
5081
            {
5082
              struct ppc_link_hash_entry *eh;
5083
              struct got_entry *ent;
5084
 
5085
              eh = (struct ppc_link_hash_entry *) h;
5086
              for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
5087
                if (ent->addend == rel->r_addend
5088
                    && ent->owner == abfd
5089
                    && ent->tls_type == tls_type)
5090
                  break;
5091
              if (ent == NULL)
5092
                {
5093
                  bfd_size_type amt = sizeof (*ent);
5094
                  ent = bfd_alloc (abfd, amt);
5095
                  if (ent == NULL)
5096
                    return FALSE;
5097
                  ent->next = eh->elf.got.glist;
5098
                  ent->addend = rel->r_addend;
5099
                  ent->owner = abfd;
5100
                  ent->tls_type = tls_type;
5101
                  ent->is_indirect = FALSE;
5102
                  ent->got.refcount = 0;
5103
                  eh->elf.got.glist = ent;
5104
                }
5105
              ent->got.refcount += 1;
5106
              eh->tls_mask |= tls_type;
5107
            }
5108
          else
5109
            /* This is a global offset table entry for a local symbol.  */
5110
            if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5111
                                        rel->r_addend, tls_type))
5112
              return FALSE;
5113
          break;
5114
 
5115
        case R_PPC64_PLT16_HA:
5116
        case R_PPC64_PLT16_HI:
5117
        case R_PPC64_PLT16_LO:
5118
        case R_PPC64_PLT32:
5119
        case R_PPC64_PLT64:
5120
          /* This symbol requires a procedure linkage table entry.  We
5121
             actually build the entry in adjust_dynamic_symbol,
5122
             because this might be a case of linking PIC code without
5123
             linking in any dynamic objects, in which case we don't
5124
             need to generate a procedure linkage table after all.  */
5125
          if (h == NULL)
5126
            {
5127
              /* It does not make sense to have a procedure linkage
5128
                 table entry for a local symbol.  */
5129
              bfd_set_error (bfd_error_bad_value);
5130
              return FALSE;
5131
            }
5132
          else
5133
            {
5134
              if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5135
                return FALSE;
5136
              h->needs_plt = 1;
5137
              if (h->root.root.string[0] == '.'
5138
                  && h->root.root.string[1] != '\0')
5139
                ((struct ppc_link_hash_entry *) h)->is_func = 1;
5140
            }
5141
          break;
5142
 
5143
          /* The following relocations don't need to propagate the
5144
             relocation if linking a shared object since they are
5145
             section relative.  */
5146
        case R_PPC64_SECTOFF:
5147
        case R_PPC64_SECTOFF_LO:
5148
        case R_PPC64_SECTOFF_HI:
5149
        case R_PPC64_SECTOFF_HA:
5150
        case R_PPC64_SECTOFF_DS:
5151
        case R_PPC64_SECTOFF_LO_DS:
5152
        case R_PPC64_DTPREL16:
5153
        case R_PPC64_DTPREL16_LO:
5154
        case R_PPC64_DTPREL16_HI:
5155
        case R_PPC64_DTPREL16_HA:
5156
        case R_PPC64_DTPREL16_DS:
5157
        case R_PPC64_DTPREL16_LO_DS:
5158
        case R_PPC64_DTPREL16_HIGHER:
5159
        case R_PPC64_DTPREL16_HIGHERA:
5160
        case R_PPC64_DTPREL16_HIGHEST:
5161
        case R_PPC64_DTPREL16_HIGHESTA:
5162
          break;
5163
 
5164
          /* Nor do these.  */
5165
        case R_PPC64_REL16:
5166
        case R_PPC64_REL16_LO:
5167
        case R_PPC64_REL16_HI:
5168
        case R_PPC64_REL16_HA:
5169
          break;
5170
 
5171
        case R_PPC64_TOC16:
5172
        case R_PPC64_TOC16_DS:
5173
          htab->do_multi_toc = 1;
5174
          ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
5175
        case R_PPC64_TOC16_LO:
5176
        case R_PPC64_TOC16_HI:
5177
        case R_PPC64_TOC16_HA:
5178
        case R_PPC64_TOC16_LO_DS:
5179
          sec->has_toc_reloc = 1;
5180
          break;
5181
 
5182
          /* This relocation describes the C++ object vtable hierarchy.
5183
             Reconstruct it for later use during GC.  */
5184
        case R_PPC64_GNU_VTINHERIT:
5185
          if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
5186
            return FALSE;
5187
          break;
5188
 
5189
          /* This relocation describes which C++ vtable entries are actually
5190
             used.  Record for later use during GC.  */
5191
        case R_PPC64_GNU_VTENTRY:
5192
          BFD_ASSERT (h != NULL);
5193
          if (h != NULL
5194
              && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
5195
            return FALSE;
5196
          break;
5197
 
5198
        case R_PPC64_REL14:
5199
        case R_PPC64_REL14_BRTAKEN:
5200
        case R_PPC64_REL14_BRNTAKEN:
5201
          {
5202
            asection *dest = NULL;
5203
 
5204
            /* Heuristic: If jumping outside our section, chances are
5205
               we are going to need a stub.  */
5206
            if (h != NULL)
5207
              {
5208
                /* If the sym is weak it may be overridden later, so
5209
                   don't assume we know where a weak sym lives.  */
5210
                if (h->root.type == bfd_link_hash_defined)
5211
                  dest = h->root.u.def.section;
5212
              }
5213
            else
5214
              {
5215
                Elf_Internal_Sym *isym;
5216
 
5217
                isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5218
                                              abfd, r_symndx);
5219
                if (isym == NULL)
5220
                  return FALSE;
5221
 
5222
                dest = bfd_section_from_elf_index (abfd, isym->st_shndx);
5223
              }
5224
 
5225
            if (dest != sec)
5226
              ppc64_elf_section_data (sec)->has_14bit_branch = 1;
5227
          }
5228
          /* Fall through.  */
5229
 
5230
        case R_PPC64_REL24:
5231
          if (h != NULL && ifunc == NULL)
5232
            {
5233
              /* We may need a .plt entry if the function this reloc
5234
                 refers to is in a shared lib.  */
5235
              if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5236
                return FALSE;
5237
              h->needs_plt = 1;
5238
              if (h->root.root.string[0] == '.'
5239
                  && h->root.root.string[1] != '\0')
5240
                ((struct ppc_link_hash_entry *) h)->is_func = 1;
5241
              if (h == tga || h == dottga)
5242
                sec->has_tls_reloc = 1;
5243
            }
5244
          break;
5245
 
5246
        case R_PPC64_TPREL64:
5247
          tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
5248
          if (!info->executable)
5249
            info->flags |= DF_STATIC_TLS;
5250
          goto dotlstoc;
5251
 
5252
        case R_PPC64_DTPMOD64:
5253
          if (rel + 1 < rel_end
5254
              && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
5255
              && rel[1].r_offset == rel->r_offset + 8)
5256
            tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
5257
          else
5258
            tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
5259
          goto dotlstoc;
5260
 
5261
        case R_PPC64_DTPREL64:
5262
          tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
5263
          if (rel != relocs
5264
              && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
5265
              && rel[-1].r_offset == rel->r_offset - 8)
5266
            /* This is the second reloc of a dtpmod, dtprel pair.
5267
               Don't mark with TLS_DTPREL.  */
5268
            goto dodyn;
5269
 
5270
        dotlstoc:
5271
          sec->has_tls_reloc = 1;
5272
          if (h != NULL)
5273
            {
5274
              struct ppc_link_hash_entry *eh;
5275
              eh = (struct ppc_link_hash_entry *) h;
5276
              eh->tls_mask |= tls_type;
5277
            }
5278
          else
5279
            if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5280
                                        rel->r_addend, tls_type))
5281
              return FALSE;
5282
 
5283
          ppc64_sec = ppc64_elf_section_data (sec);
5284
          if (ppc64_sec->sec_type != sec_toc)
5285
            {
5286
              bfd_size_type amt;
5287
 
5288
              /* One extra to simplify get_tls_mask.  */
5289
              amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
5290
              ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
5291
              if (ppc64_sec->u.toc.symndx == NULL)
5292
                return FALSE;
5293
              amt = sec->size * sizeof (bfd_vma) / 8;
5294
              ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
5295
              if (ppc64_sec->u.toc.add == NULL)
5296
                return FALSE;
5297
              BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
5298
              ppc64_sec->sec_type = sec_toc;
5299
            }
5300
          BFD_ASSERT (rel->r_offset % 8 == 0);
5301
          ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
5302
          ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
5303
 
5304
          /* Mark the second slot of a GD or LD entry.
5305
             -1 to indicate GD and -2 to indicate LD.  */
5306
          if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
5307
            ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
5308
          else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
5309
            ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
5310
          goto dodyn;
5311
 
5312
        case R_PPC64_TPREL16:
5313
        case R_PPC64_TPREL16_LO:
5314
        case R_PPC64_TPREL16_HI:
5315
        case R_PPC64_TPREL16_HA:
5316
        case R_PPC64_TPREL16_DS:
5317
        case R_PPC64_TPREL16_LO_DS:
5318
        case R_PPC64_TPREL16_HIGHER:
5319
        case R_PPC64_TPREL16_HIGHERA:
5320
        case R_PPC64_TPREL16_HIGHEST:
5321
        case R_PPC64_TPREL16_HIGHESTA:
5322
          if (info->shared)
5323
            {
5324
              if (!info->executable)
5325
                info->flags |= DF_STATIC_TLS;
5326
              goto dodyn;
5327
            }
5328
          break;
5329
 
5330
        case R_PPC64_ADDR64:
5331
          if (opd_sym_map != NULL
5332
              && rel + 1 < rel_end
5333
              && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
5334
            {
5335
              if (h != NULL)
5336
                {
5337
                  if (h->root.root.string[0] == '.'
5338
                      && h->root.root.string[1] != 0
5339
                      && lookup_fdh ((struct ppc_link_hash_entry *) h, htab))
5340
                    ;
5341
                  else
5342
                    ((struct ppc_link_hash_entry *) h)->is_func = 1;
5343
                }
5344
              else
5345
                {
5346
                  asection *s;
5347
                  Elf_Internal_Sym *isym;
5348
 
5349
                  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5350
                                                abfd, r_symndx);
5351
                  if (isym == NULL)
5352
                    return FALSE;
5353
 
5354
                  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5355
                  if (s != NULL && s != sec)
5356
                    opd_sym_map[rel->r_offset / 8] = s;
5357
                }
5358
            }
5359
          /* Fall through.  */
5360
 
5361
        case R_PPC64_REL30:
5362
        case R_PPC64_REL32:
5363
        case R_PPC64_REL64:
5364
        case R_PPC64_ADDR14:
5365
        case R_PPC64_ADDR14_BRNTAKEN:
5366
        case R_PPC64_ADDR14_BRTAKEN:
5367
        case R_PPC64_ADDR16:
5368
        case R_PPC64_ADDR16_DS:
5369
        case R_PPC64_ADDR16_HA:
5370
        case R_PPC64_ADDR16_HI:
5371
        case R_PPC64_ADDR16_HIGHER:
5372
        case R_PPC64_ADDR16_HIGHERA:
5373
        case R_PPC64_ADDR16_HIGHEST:
5374
        case R_PPC64_ADDR16_HIGHESTA:
5375
        case R_PPC64_ADDR16_LO:
5376
        case R_PPC64_ADDR16_LO_DS:
5377
        case R_PPC64_ADDR24:
5378
        case R_PPC64_ADDR32:
5379
        case R_PPC64_UADDR16:
5380
        case R_PPC64_UADDR32:
5381
        case R_PPC64_UADDR64:
5382
        case R_PPC64_TOC:
5383
          if (h != NULL && !info->shared)
5384
            /* We may need a copy reloc.  */
5385
            h->non_got_ref = 1;
5386
 
5387
          /* Don't propagate .opd relocs.  */
5388
          if (NO_OPD_RELOCS && opd_sym_map != NULL)
5389
            break;
5390
 
5391
          /* If we are creating a shared library, and this is a reloc
5392
             against a global symbol, or a non PC relative reloc
5393
             against a local symbol, then we need to copy the reloc
5394
             into the shared library.  However, if we are linking with
5395
             -Bsymbolic, we do not need to copy a reloc against a
5396
             global symbol which is defined in an object we are
5397
             including in the link (i.e., DEF_REGULAR is set).  At
5398
             this point we have not seen all the input files, so it is
5399
             possible that DEF_REGULAR is not set now but will be set
5400
             later (it is never cleared).  In case of a weak definition,
5401
             DEF_REGULAR may be cleared later by a strong definition in
5402
             a shared library.  We account for that possibility below by
5403
             storing information in the dyn_relocs field of the hash
5404
             table entry.  A similar situation occurs when creating
5405
             shared libraries and symbol visibility changes render the
5406
             symbol local.
5407
 
5408
             If on the other hand, we are creating an executable, we
5409
             may need to keep relocations for symbols satisfied by a
5410
             dynamic library if we manage to avoid copy relocs for the
5411
             symbol.  */
5412
        dodyn:
5413
          if ((info->shared
5414
               && (must_be_dyn_reloc (info, r_type)
5415
                   || (h != NULL
5416
                       && (! info->symbolic
5417
                           || h->root.type == bfd_link_hash_defweak
5418
                           || !h->def_regular))))
5419
              || (ELIMINATE_COPY_RELOCS
5420
                  && !info->shared
5421
                  && h != NULL
5422
                  && (h->root.type == bfd_link_hash_defweak
5423
                      || !h->def_regular))
5424
              || (!info->shared
5425
                  && ifunc != NULL))
5426
            {
5427
              struct elf_dyn_relocs *p;
5428
              struct elf_dyn_relocs **head;
5429
 
5430
              /* We must copy these reloc types into the output file.
5431
                 Create a reloc section in dynobj and make room for
5432
                 this reloc.  */
5433
              if (sreloc == NULL)
5434
                {
5435
                  sreloc = _bfd_elf_make_dynamic_reloc_section
5436
                    (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
5437
 
5438
                  if (sreloc == NULL)
5439
                    return FALSE;
5440
                }
5441
 
5442
              /* If this is a global symbol, we count the number of
5443
                 relocations we need for this symbol.  */
5444
              if (h != NULL)
5445
                {
5446
                  head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
5447
                }
5448
              else
5449
                {
5450
                  /* Track dynamic relocs needed for local syms too.
5451
                     We really need local syms available to do this
5452
                     easily.  Oh well.  */
5453
                  asection *s;
5454
                  void *vpp;
5455
                  Elf_Internal_Sym *isym;
5456
 
5457
                  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5458
                                                abfd, r_symndx);
5459
                  if (isym == NULL)
5460
                    return FALSE;
5461
 
5462
                  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5463
                  if (s == NULL)
5464
                    s = sec;
5465
 
5466
                  vpp = &elf_section_data (s)->local_dynrel;
5467
                  head = (struct elf_dyn_relocs **) vpp;
5468
                }
5469
 
5470
              p = *head;
5471
              if (p == NULL || p->sec != sec)
5472
                {
5473
                  p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5474
                  if (p == NULL)
5475
                    return FALSE;
5476
                  p->next = *head;
5477
                  *head = p;
5478
                  p->sec = sec;
5479
                  p->count = 0;
5480
                  p->pc_count = 0;
5481
                }
5482
 
5483
              p->count += 1;
5484
              if (!must_be_dyn_reloc (info, r_type))
5485
                p->pc_count += 1;
5486
            }
5487
          break;
5488
 
5489
        default:
5490
          break;
5491
        }
5492
    }
5493
 
5494
  return TRUE;
5495
}
5496
 
5497
/* OFFSET in OPD_SEC specifies a function descriptor.  Return the address
5498
   of the code entry point, and its section.  */
5499
 
5500
static bfd_vma
5501
opd_entry_value (asection *opd_sec,
5502
                 bfd_vma offset,
5503
                 asection **code_sec,
5504
                 bfd_vma *code_off)
5505
{
5506
  bfd *opd_bfd = opd_sec->owner;
5507
  Elf_Internal_Rela *relocs;
5508
  Elf_Internal_Rela *lo, *hi, *look;
5509
  bfd_vma val;
5510
 
5511
  /* No relocs implies we are linking a --just-symbols object.  */
5512
  if (opd_sec->reloc_count == 0)
5513
    {
5514
      char buf[8];
5515
 
5516
      if (!bfd_get_section_contents (opd_bfd, opd_sec, buf, offset, 8))
5517
        return (bfd_vma) -1;
5518
 
5519
      val = bfd_get_64 (opd_bfd, buf);
5520
      if (code_sec != NULL)
5521
        {
5522
          asection *sec, *likely = NULL;
5523
          for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
5524
            if (sec->vma <= val
5525
                && (sec->flags & SEC_LOAD) != 0
5526
                && (sec->flags & SEC_ALLOC) != 0)
5527
              likely = sec;
5528
          if (likely != NULL)
5529
            {
5530
              *code_sec = likely;
5531
              if (code_off != NULL)
5532
                *code_off = val - likely->vma;
5533
            }
5534
        }
5535
      return val;
5536
    }
5537
 
5538
  BFD_ASSERT (is_ppc64_elf (opd_bfd));
5539
 
5540
  relocs = ppc64_elf_tdata (opd_bfd)->opd_relocs;
5541
  if (relocs == NULL)
5542
    relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
5543
 
5544
  /* Go find the opd reloc at the sym address.  */
5545
  lo = relocs;
5546
  BFD_ASSERT (lo != NULL);
5547
  hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
5548
  val = (bfd_vma) -1;
5549
  while (lo < hi)
5550
    {
5551
      look = lo + (hi - lo) / 2;
5552
      if (look->r_offset < offset)
5553
        lo = look + 1;
5554
      else if (look->r_offset > offset)
5555
        hi = look;
5556
      else
5557
        {
5558
          Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd);
5559
 
5560
          if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
5561
              && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
5562
            {
5563
              unsigned long symndx = ELF64_R_SYM (look->r_info);
5564
              asection *sec;
5565
 
5566
              if (symndx < symtab_hdr->sh_info)
5567
                {
5568
                  Elf_Internal_Sym *sym;
5569
 
5570
                  sym = (Elf_Internal_Sym *) symtab_hdr->contents;
5571
                  if (sym == NULL)
5572
                    {
5573
                      sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
5574
                                                  symtab_hdr->sh_info,
5575
                                                  0, NULL, NULL, NULL);
5576
                      if (sym == NULL)
5577
                        break;
5578
                      symtab_hdr->contents = (bfd_byte *) sym;
5579
                    }
5580
 
5581
                  sym += symndx;
5582
                  val = sym->st_value;
5583
                  sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
5584
                  BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
5585
                }
5586
              else
5587
                {
5588
                  struct elf_link_hash_entry **sym_hashes;
5589
                  struct elf_link_hash_entry *rh;
5590
 
5591
                  sym_hashes = elf_sym_hashes (opd_bfd);
5592
                  rh = sym_hashes[symndx - symtab_hdr->sh_info];
5593
                  rh = elf_follow_link (rh);
5594
                  BFD_ASSERT (rh->root.type == bfd_link_hash_defined
5595
                              || rh->root.type == bfd_link_hash_defweak);
5596
                  val = rh->root.u.def.value;
5597
                  sec = rh->root.u.def.section;
5598
                }
5599
              val += look->r_addend;
5600
              if (code_off != NULL)
5601
                *code_off = val;
5602
              if (code_sec != NULL)
5603
                *code_sec = sec;
5604
              if (sec != NULL && sec->output_section != NULL)
5605
                val += sec->output_section->vma + sec->output_offset;
5606
            }
5607
          break;
5608
        }
5609
    }
5610
 
5611
  return val;
5612
}
5613
 
5614
/* Return true if symbol is defined in a regular object file.  */
5615
 
5616
static bfd_boolean
5617
is_static_defined (struct elf_link_hash_entry *h)
5618
{
5619
  return ((h->root.type == bfd_link_hash_defined
5620
           || h->root.type == bfd_link_hash_defweak)
5621
          && h->root.u.def.section != NULL
5622
          && h->root.u.def.section->output_section != NULL);
5623
}
5624
 
5625
/* If FDH is a function descriptor symbol, return the associated code
5626
   entry symbol if it is defined.  Return NULL otherwise.  */
5627
 
5628
static struct ppc_link_hash_entry *
5629
defined_code_entry (struct ppc_link_hash_entry *fdh)
5630
{
5631
  if (fdh->is_func_descriptor)
5632
    {
5633
      struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
5634
      if (fh->elf.root.type == bfd_link_hash_defined
5635
          || fh->elf.root.type == bfd_link_hash_defweak)
5636
        return fh;
5637
    }
5638
  return NULL;
5639
}
5640
 
5641
/* If FH is a function code entry symbol, return the associated
5642
   function descriptor symbol if it is defined.  Return NULL otherwise.  */
5643
 
5644
static struct ppc_link_hash_entry *
5645
defined_func_desc (struct ppc_link_hash_entry *fh)
5646
{
5647
  if (fh->oh != NULL
5648
      && fh->oh->is_func_descriptor)
5649
    {
5650
      struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
5651
      if (fdh->elf.root.type == bfd_link_hash_defined
5652
          || fdh->elf.root.type == bfd_link_hash_defweak)
5653
        return fdh;
5654
    }
5655
  return NULL;
5656
}
5657
 
5658
/* Mark all our entry sym sections, both opd and code section.  */
5659
 
5660
static void
5661
ppc64_elf_gc_keep (struct bfd_link_info *info)
5662
{
5663
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
5664
  struct bfd_sym_chain *sym;
5665
 
5666
  if (htab == NULL)
5667
    return;
5668
 
5669
  for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
5670
    {
5671
      struct ppc_link_hash_entry *eh, *fh;
5672
      asection *sec;
5673
 
5674
      eh = (struct ppc_link_hash_entry *)
5675
        elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, TRUE);
5676
      if (eh == NULL)
5677
        continue;
5678
      if (eh->elf.root.type != bfd_link_hash_defined
5679
          && eh->elf.root.type != bfd_link_hash_defweak)
5680
        continue;
5681
 
5682
      fh = defined_code_entry (eh);
5683
      if (fh != NULL)
5684
        {
5685
          sec = fh->elf.root.u.def.section;
5686
          sec->flags |= SEC_KEEP;
5687
        }
5688
      else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5689
               && opd_entry_value (eh->elf.root.u.def.section,
5690
                                   eh->elf.root.u.def.value,
5691
                                   &sec, NULL) != (bfd_vma) -1)
5692
        sec->flags |= SEC_KEEP;
5693
 
5694
      sec = eh->elf.root.u.def.section;
5695
      sec->flags |= SEC_KEEP;
5696
    }
5697
}
5698
 
5699
/* Mark sections containing dynamically referenced symbols.  When
5700
   building shared libraries, we must assume that any visible symbol is
5701
   referenced.  */
5702
 
5703
static bfd_boolean
5704
ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
5705
{
5706
  struct bfd_link_info *info = (struct bfd_link_info *) inf;
5707
  struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
5708
  struct ppc_link_hash_entry *fdh;
5709
 
5710
  /* Dynamic linking info is on the func descriptor sym.  */
5711
  fdh = defined_func_desc (eh);
5712
  if (fdh != NULL)
5713
    eh = fdh;
5714
 
5715
  if ((eh->elf.root.type == bfd_link_hash_defined
5716
       || eh->elf.root.type == bfd_link_hash_defweak)
5717
      && (eh->elf.ref_dynamic
5718
          || (!info->executable
5719
              && eh->elf.def_regular
5720
              && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
5721 163 khays
              && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN
5722
              && (strchr (eh->elf.root.root.string, ELF_VER_CHR) != NULL
5723
                  || !bfd_hide_sym_by_version (info->version_info,
5724
                                               eh->elf.root.root.string)))))
5725 14 khays
    {
5726
      asection *code_sec;
5727
      struct ppc_link_hash_entry *fh;
5728
 
5729
      eh->elf.root.u.def.section->flags |= SEC_KEEP;
5730
 
5731
      /* Function descriptor syms cause the associated
5732
         function code sym section to be marked.  */
5733
      fh = defined_code_entry (eh);
5734
      if (fh != NULL)
5735
        {
5736
          code_sec = fh->elf.root.u.def.section;
5737
          code_sec->flags |= SEC_KEEP;
5738
        }
5739
      else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5740
               && opd_entry_value (eh->elf.root.u.def.section,
5741
                                   eh->elf.root.u.def.value,
5742
                                   &code_sec, NULL) != (bfd_vma) -1)
5743
        code_sec->flags |= SEC_KEEP;
5744
    }
5745
 
5746
  return TRUE;
5747
}
5748
 
5749
/* Return the section that should be marked against GC for a given
5750
   relocation.  */
5751
 
5752
static asection *
5753
ppc64_elf_gc_mark_hook (asection *sec,
5754
                        struct bfd_link_info *info,
5755
                        Elf_Internal_Rela *rel,
5756
                        struct elf_link_hash_entry *h,
5757
                        Elf_Internal_Sym *sym)
5758
{
5759
  asection *rsec;
5760
 
5761
  /* Syms return NULL if we're marking .opd, so we avoid marking all
5762
     function sections, as all functions are referenced in .opd.  */
5763
  rsec = NULL;
5764
  if (get_opd_info (sec) != NULL)
5765
    return rsec;
5766
 
5767
  if (h != NULL)
5768
    {
5769
      enum elf_ppc64_reloc_type r_type;
5770
      struct ppc_link_hash_entry *eh, *fh, *fdh;
5771
 
5772
      r_type = ELF64_R_TYPE (rel->r_info);
5773
      switch (r_type)
5774
        {
5775
        case R_PPC64_GNU_VTINHERIT:
5776
        case R_PPC64_GNU_VTENTRY:
5777
          break;
5778
 
5779
        default:
5780
          switch (h->root.type)
5781
            {
5782
            case bfd_link_hash_defined:
5783
            case bfd_link_hash_defweak:
5784
              eh = (struct ppc_link_hash_entry *) h;
5785
              fdh = defined_func_desc (eh);
5786
              if (fdh != NULL)
5787
                eh = fdh;
5788
 
5789
              /* Function descriptor syms cause the associated
5790
                 function code sym section to be marked.  */
5791
              fh = defined_code_entry (eh);
5792
              if (fh != NULL)
5793
                {
5794
                  /* They also mark their opd section.  */
5795
                  eh->elf.root.u.def.section->gc_mark = 1;
5796
 
5797
                  rsec = fh->elf.root.u.def.section;
5798
                }
5799
              else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5800
                       && opd_entry_value (eh->elf.root.u.def.section,
5801
                                           eh->elf.root.u.def.value,
5802
                                           &rsec, NULL) != (bfd_vma) -1)
5803
                eh->elf.root.u.def.section->gc_mark = 1;
5804
              else
5805
                rsec = h->root.u.def.section;
5806
              break;
5807
 
5808
            case bfd_link_hash_common:
5809
              rsec = h->root.u.c.p->section;
5810
              break;
5811
 
5812
            default:
5813
              return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
5814
            }
5815
        }
5816
    }
5817
  else
5818
    {
5819
      struct _opd_sec_data *opd;
5820
 
5821
      rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
5822
      opd = get_opd_info (rsec);
5823
      if (opd != NULL && opd->func_sec != NULL)
5824
        {
5825
          rsec->gc_mark = 1;
5826
 
5827
          rsec = opd->func_sec[(sym->st_value + rel->r_addend) / 8];
5828
        }
5829
    }
5830
 
5831
  return rsec;
5832
}
5833
 
5834
/* Update the .got, .plt. and dynamic reloc reference counts for the
5835
   section being removed.  */
5836
 
5837
static bfd_boolean
5838
ppc64_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
5839
                         asection *sec, const Elf_Internal_Rela *relocs)
5840
{
5841
  struct ppc_link_hash_table *htab;
5842
  Elf_Internal_Shdr *symtab_hdr;
5843
  struct elf_link_hash_entry **sym_hashes;
5844
  struct got_entry **local_got_ents;
5845
  const Elf_Internal_Rela *rel, *relend;
5846
 
5847
  if (info->relocatable)
5848
    return TRUE;
5849
 
5850
  if ((sec->flags & SEC_ALLOC) == 0)
5851
    return TRUE;
5852
 
5853
  elf_section_data (sec)->local_dynrel = NULL;
5854
 
5855
  htab = ppc_hash_table (info);
5856
  if (htab == NULL)
5857
    return FALSE;
5858
 
5859
  symtab_hdr = &elf_symtab_hdr (abfd);
5860
  sym_hashes = elf_sym_hashes (abfd);
5861
  local_got_ents = elf_local_got_ents (abfd);
5862
 
5863
  relend = relocs + sec->reloc_count;
5864
  for (rel = relocs; rel < relend; rel++)
5865
    {
5866
      unsigned long r_symndx;
5867
      enum elf_ppc64_reloc_type r_type;
5868
      struct elf_link_hash_entry *h = NULL;
5869
      unsigned char tls_type = 0;
5870
 
5871
      r_symndx = ELF64_R_SYM (rel->r_info);
5872
      r_type = ELF64_R_TYPE (rel->r_info);
5873
      if (r_symndx >= symtab_hdr->sh_info)
5874
        {
5875
          struct ppc_link_hash_entry *eh;
5876
          struct elf_dyn_relocs **pp;
5877
          struct elf_dyn_relocs *p;
5878
 
5879
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5880
          h = elf_follow_link (h);
5881
          eh = (struct ppc_link_hash_entry *) h;
5882
 
5883
          for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
5884
            if (p->sec == sec)
5885
              {
5886
                /* Everything must go for SEC.  */
5887
                *pp = p->next;
5888
                break;
5889
              }
5890
        }
5891
 
5892
      if (is_branch_reloc (r_type))
5893
        {
5894
          struct plt_entry **ifunc = NULL;
5895
          if (h != NULL)
5896
            {
5897
              if (h->type == STT_GNU_IFUNC)
5898
                ifunc = &h->plt.plist;
5899
            }
5900
          else if (local_got_ents != NULL)
5901
            {
5902
              struct plt_entry **local_plt = (struct plt_entry **)
5903
                (local_got_ents + symtab_hdr->sh_info);
5904
              unsigned char *local_got_tls_masks = (unsigned char *)
5905
                (local_plt + symtab_hdr->sh_info);
5906
              if ((local_got_tls_masks[r_symndx] & PLT_IFUNC) != 0)
5907
                ifunc = local_plt + r_symndx;
5908
            }
5909
          if (ifunc != NULL)
5910
            {
5911
              struct plt_entry *ent;
5912
 
5913
              for (ent = *ifunc; ent != NULL; ent = ent->next)
5914
                if (ent->addend == rel->r_addend)
5915
                  break;
5916
              if (ent == NULL)
5917
                abort ();
5918
              if (ent->plt.refcount > 0)
5919
                ent->plt.refcount -= 1;
5920
              continue;
5921
            }
5922
        }
5923
 
5924
      switch (r_type)
5925
        {
5926
        case R_PPC64_GOT_TLSLD16:
5927
        case R_PPC64_GOT_TLSLD16_LO:
5928
        case R_PPC64_GOT_TLSLD16_HI:
5929
        case R_PPC64_GOT_TLSLD16_HA:
5930
          tls_type = TLS_TLS | TLS_LD;
5931
          goto dogot;
5932
 
5933
        case R_PPC64_GOT_TLSGD16:
5934
        case R_PPC64_GOT_TLSGD16_LO:
5935
        case R_PPC64_GOT_TLSGD16_HI:
5936
        case R_PPC64_GOT_TLSGD16_HA:
5937
          tls_type = TLS_TLS | TLS_GD;
5938
          goto dogot;
5939
 
5940
        case R_PPC64_GOT_TPREL16_DS:
5941
        case R_PPC64_GOT_TPREL16_LO_DS:
5942
        case R_PPC64_GOT_TPREL16_HI:
5943
        case R_PPC64_GOT_TPREL16_HA:
5944
          tls_type = TLS_TLS | TLS_TPREL;
5945
          goto dogot;
5946
 
5947
        case R_PPC64_GOT_DTPREL16_DS:
5948
        case R_PPC64_GOT_DTPREL16_LO_DS:
5949
        case R_PPC64_GOT_DTPREL16_HI:
5950
        case R_PPC64_GOT_DTPREL16_HA:
5951
          tls_type = TLS_TLS | TLS_DTPREL;
5952
          goto dogot;
5953
 
5954
        case R_PPC64_GOT16:
5955
        case R_PPC64_GOT16_DS:
5956
        case R_PPC64_GOT16_HA:
5957
        case R_PPC64_GOT16_HI:
5958
        case R_PPC64_GOT16_LO:
5959
        case R_PPC64_GOT16_LO_DS:
5960
        dogot:
5961
          {
5962
            struct got_entry *ent;
5963
 
5964
            if (h != NULL)
5965
              ent = h->got.glist;
5966
            else
5967
              ent = local_got_ents[r_symndx];
5968
 
5969
            for (; ent != NULL; ent = ent->next)
5970
              if (ent->addend == rel->r_addend
5971
                  && ent->owner == abfd
5972
                  && ent->tls_type == tls_type)
5973
                break;
5974
            if (ent == NULL)
5975
              abort ();
5976
            if (ent->got.refcount > 0)
5977
              ent->got.refcount -= 1;
5978
          }
5979
          break;
5980
 
5981
        case R_PPC64_PLT16_HA:
5982
        case R_PPC64_PLT16_HI:
5983
        case R_PPC64_PLT16_LO:
5984
        case R_PPC64_PLT32:
5985
        case R_PPC64_PLT64:
5986
        case R_PPC64_REL14:
5987
        case R_PPC64_REL14_BRNTAKEN:
5988
        case R_PPC64_REL14_BRTAKEN:
5989
        case R_PPC64_REL24:
5990
          if (h != NULL)
5991
            {
5992
              struct plt_entry *ent;
5993
 
5994
              for (ent = h->plt.plist; ent != NULL; ent = ent->next)
5995
                if (ent->addend == rel->r_addend)
5996
                  break;
5997
              if (ent != NULL && ent->plt.refcount > 0)
5998
                ent->plt.refcount -= 1;
5999
            }
6000
          break;
6001
 
6002
        default:
6003
          break;
6004
        }
6005
    }
6006
  return TRUE;
6007
}
6008
 
6009
/* The maximum size of .sfpr.  */
6010
#define SFPR_MAX (218*4)
6011
 
6012
struct sfpr_def_parms
6013
{
6014
  const char name[12];
6015
  unsigned char lo, hi;
6016
  bfd_byte * (*write_ent) (bfd *, bfd_byte *, int);
6017
  bfd_byte * (*write_tail) (bfd *, bfd_byte *, int);
6018
};
6019
 
6020
/* Auto-generate _save*, _rest* functions in .sfpr.  */
6021
 
6022
static bfd_boolean
6023
sfpr_define (struct bfd_link_info *info, const struct sfpr_def_parms *parm)
6024
{
6025
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
6026
  unsigned int i;
6027
  size_t len = strlen (parm->name);
6028
  bfd_boolean writing = FALSE;
6029
  char sym[16];
6030
 
6031
  if (htab == NULL)
6032
    return FALSE;
6033
 
6034
  memcpy (sym, parm->name, len);
6035
  sym[len + 2] = 0;
6036
 
6037
  for (i = parm->lo; i <= parm->hi; i++)
6038
    {
6039
      struct elf_link_hash_entry *h;
6040
 
6041
      sym[len + 0] = i / 10 + '0';
6042
      sym[len + 1] = i % 10 + '0';
6043
      h = elf_link_hash_lookup (&htab->elf, sym, FALSE, FALSE, TRUE);
6044
      if (h != NULL
6045
          && !h->def_regular)
6046
        {
6047
          h->root.type = bfd_link_hash_defined;
6048
          h->root.u.def.section = htab->sfpr;
6049
          h->root.u.def.value = htab->sfpr->size;
6050
          h->type = STT_FUNC;
6051
          h->def_regular = 1;
6052
          _bfd_elf_link_hash_hide_symbol (info, h, TRUE);
6053
          writing = TRUE;
6054
          if (htab->sfpr->contents == NULL)
6055
            {
6056
              htab->sfpr->contents = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
6057
              if (htab->sfpr->contents == NULL)
6058
                return FALSE;
6059
            }
6060
        }
6061
      if (writing)
6062
        {
6063
          bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
6064
          if (i != parm->hi)
6065
            p = (*parm->write_ent) (htab->elf.dynobj, p, i);
6066
          else
6067
            p = (*parm->write_tail) (htab->elf.dynobj, p, i);
6068
          htab->sfpr->size = p - htab->sfpr->contents;
6069
        }
6070
    }
6071
 
6072
  return TRUE;
6073
}
6074
 
6075
static bfd_byte *
6076
savegpr0 (bfd *abfd, bfd_byte *p, int r)
6077
{
6078
  bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6079
  return p + 4;
6080
}
6081
 
6082
static bfd_byte *
6083
savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
6084
{
6085
  p = savegpr0 (abfd, p, r);
6086
  bfd_put_32 (abfd, STD_R0_0R1 + 16, p);
6087
  p = p + 4;
6088
  bfd_put_32 (abfd, BLR, p);
6089
  return p + 4;
6090
}
6091
 
6092
static bfd_byte *
6093
restgpr0 (bfd *abfd, bfd_byte *p, int r)
6094
{
6095
  bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6096
  return p + 4;
6097
}
6098
 
6099
static bfd_byte *
6100
restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
6101
{
6102
  bfd_put_32 (abfd, LD_R0_0R1 + 16, p);
6103
  p = p + 4;
6104
  p = restgpr0 (abfd, p, r);
6105
  bfd_put_32 (abfd, MTLR_R0, p);
6106
  p = p + 4;
6107
  if (r == 29)
6108
    {
6109
      p = restgpr0 (abfd, p, 30);
6110
      p = restgpr0 (abfd, p, 31);
6111
    }
6112
  bfd_put_32 (abfd, BLR, p);
6113
  return p + 4;
6114
}
6115
 
6116
static bfd_byte *
6117
savegpr1 (bfd *abfd, bfd_byte *p, int r)
6118
{
6119
  bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6120
  return p + 4;
6121
}
6122
 
6123
static bfd_byte *
6124
savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
6125
{
6126
  p = savegpr1 (abfd, p, r);
6127
  bfd_put_32 (abfd, BLR, p);
6128
  return p + 4;
6129
}
6130
 
6131
static bfd_byte *
6132
restgpr1 (bfd *abfd, bfd_byte *p, int r)
6133
{
6134
  bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6135
  return p + 4;
6136
}
6137
 
6138
static bfd_byte *
6139
restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
6140
{
6141
  p = restgpr1 (abfd, p, r);
6142
  bfd_put_32 (abfd, BLR, p);
6143
  return p + 4;
6144
}
6145
 
6146
static bfd_byte *
6147
savefpr (bfd *abfd, bfd_byte *p, int r)
6148
{
6149
  bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6150
  return p + 4;
6151
}
6152
 
6153
static bfd_byte *
6154
savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
6155
{
6156
  p = savefpr (abfd, p, r);
6157
  bfd_put_32 (abfd, STD_R0_0R1 + 16, p);
6158
  p = p + 4;
6159
  bfd_put_32 (abfd, BLR, p);
6160
  return p + 4;
6161
}
6162
 
6163
static bfd_byte *
6164
restfpr (bfd *abfd, bfd_byte *p, int r)
6165
{
6166
  bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6167
  return p + 4;
6168
}
6169
 
6170
static bfd_byte *
6171
restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
6172
{
6173
  bfd_put_32 (abfd, LD_R0_0R1 + 16, p);
6174
  p = p + 4;
6175
  p = restfpr (abfd, p, r);
6176
  bfd_put_32 (abfd, MTLR_R0, p);
6177
  p = p + 4;
6178
  if (r == 29)
6179
    {
6180
      p = restfpr (abfd, p, 30);
6181
      p = restfpr (abfd, p, 31);
6182
    }
6183
  bfd_put_32 (abfd, BLR, p);
6184
  return p + 4;
6185
}
6186
 
6187
static bfd_byte *
6188
savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
6189
{
6190
  p = savefpr (abfd, p, r);
6191
  bfd_put_32 (abfd, BLR, p);
6192
  return p + 4;
6193
}
6194
 
6195
static bfd_byte *
6196
restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
6197
{
6198
  p = restfpr (abfd, p, r);
6199
  bfd_put_32 (abfd, BLR, p);
6200
  return p + 4;
6201
}
6202
 
6203
static bfd_byte *
6204
savevr (bfd *abfd, bfd_byte *p, int r)
6205
{
6206
  bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6207
  p = p + 4;
6208
  bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
6209
  return p + 4;
6210
}
6211
 
6212
static bfd_byte *
6213
savevr_tail (bfd *abfd, bfd_byte *p, int r)
6214
{
6215
  p = savevr (abfd, p, r);
6216
  bfd_put_32 (abfd, BLR, p);
6217
  return p + 4;
6218
}
6219
 
6220
static bfd_byte *
6221
restvr (bfd *abfd, bfd_byte *p, int r)
6222
{
6223
  bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6224
  p = p + 4;
6225
  bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
6226
  return p + 4;
6227
}
6228
 
6229
static bfd_byte *
6230
restvr_tail (bfd *abfd, bfd_byte *p, int r)
6231
{
6232
  p = restvr (abfd, p, r);
6233
  bfd_put_32 (abfd, BLR, p);
6234
  return p + 4;
6235
}
6236
 
6237
/* Called via elf_link_hash_traverse to transfer dynamic linking
6238
   information on function code symbol entries to their corresponding
6239
   function descriptor symbol entries.  */
6240
 
6241
static bfd_boolean
6242
func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
6243
{
6244
  struct bfd_link_info *info;
6245
  struct ppc_link_hash_table *htab;
6246
  struct plt_entry *ent;
6247
  struct ppc_link_hash_entry *fh;
6248
  struct ppc_link_hash_entry *fdh;
6249
  bfd_boolean force_local;
6250
 
6251
  fh = (struct ppc_link_hash_entry *) h;
6252
  if (fh->elf.root.type == bfd_link_hash_indirect)
6253
    return TRUE;
6254
 
6255
  info = inf;
6256
  htab = ppc_hash_table (info);
6257
  if (htab == NULL)
6258
    return FALSE;
6259
 
6260
  /* Resolve undefined references to dot-symbols as the value
6261
     in the function descriptor, if we have one in a regular object.
6262
     This is to satisfy cases like ".quad .foo".  Calls to functions
6263
     in dynamic objects are handled elsewhere.  */
6264
  if (fh->elf.root.type == bfd_link_hash_undefweak
6265
      && fh->was_undefined
6266
      && (fdh = defined_func_desc (fh)) != NULL
6267
      && get_opd_info (fdh->elf.root.u.def.section) != NULL
6268
      && opd_entry_value (fdh->elf.root.u.def.section,
6269
                          fdh->elf.root.u.def.value,
6270
                          &fh->elf.root.u.def.section,
6271
                          &fh->elf.root.u.def.value) != (bfd_vma) -1)
6272
    {
6273
      fh->elf.root.type = fdh->elf.root.type;
6274
      fh->elf.forced_local = 1;
6275
      fh->elf.def_regular = fdh->elf.def_regular;
6276
      fh->elf.def_dynamic = fdh->elf.def_dynamic;
6277
    }
6278
 
6279
  /* If this is a function code symbol, transfer dynamic linking
6280
     information to the function descriptor symbol.  */
6281
  if (!fh->is_func)
6282
    return TRUE;
6283
 
6284
  for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
6285
    if (ent->plt.refcount > 0)
6286
      break;
6287
  if (ent == NULL
6288
      || fh->elf.root.root.string[0] != '.'
6289
      || fh->elf.root.root.string[1] == '\0')
6290
    return TRUE;
6291
 
6292
  /* Find the corresponding function descriptor symbol.  Create it
6293
     as undefined if necessary.  */
6294
 
6295
  fdh = lookup_fdh (fh, htab);
6296
  if (fdh == NULL
6297
      && !info->executable
6298
      && (fh->elf.root.type == bfd_link_hash_undefined
6299
          || fh->elf.root.type == bfd_link_hash_undefweak))
6300
    {
6301
      fdh = make_fdh (info, fh);
6302
      if (fdh == NULL)
6303
        return FALSE;
6304
    }
6305
 
6306
  /* Fake function descriptors are made undefweak.  If the function
6307
     code symbol is strong undefined, make the fake sym the same.
6308
     If the function code symbol is defined, then force the fake
6309
     descriptor local;  We can't support overriding of symbols in a
6310
     shared library on a fake descriptor.  */
6311
 
6312
  if (fdh != NULL
6313
      && fdh->fake
6314
      && fdh->elf.root.type == bfd_link_hash_undefweak)
6315
    {
6316
      if (fh->elf.root.type == bfd_link_hash_undefined)
6317
        {
6318
          fdh->elf.root.type = bfd_link_hash_undefined;
6319
          bfd_link_add_undef (&htab->elf.root, &fdh->elf.root);
6320
        }
6321
      else if (fh->elf.root.type == bfd_link_hash_defined
6322
               || fh->elf.root.type == bfd_link_hash_defweak)
6323
        {
6324
          _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
6325
        }
6326
    }
6327
 
6328
  if (fdh != NULL
6329
      && !fdh->elf.forced_local
6330
      && (!info->executable
6331
          || fdh->elf.def_dynamic
6332
          || fdh->elf.ref_dynamic
6333
          || (fdh->elf.root.type == bfd_link_hash_undefweak
6334
              && ELF_ST_VISIBILITY (fdh->elf.other) == STV_DEFAULT)))
6335
    {
6336
      if (fdh->elf.dynindx == -1)
6337
        if (! bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
6338
          return FALSE;
6339
      fdh->elf.ref_regular |= fh->elf.ref_regular;
6340
      fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
6341
      fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
6342
      fdh->elf.non_got_ref |= fh->elf.non_got_ref;
6343
      if (ELF_ST_VISIBILITY (fh->elf.other) == STV_DEFAULT)
6344
        {
6345
          move_plt_plist (fh, fdh);
6346
          fdh->elf.needs_plt = 1;
6347
        }
6348
      fdh->is_func_descriptor = 1;
6349
      fdh->oh = fh;
6350
      fh->oh = fdh;
6351
    }
6352
 
6353
  /* Now that the info is on the function descriptor, clear the
6354
     function code sym info.  Any function code syms for which we
6355
     don't have a definition in a regular file, we force local.
6356
     This prevents a shared library from exporting syms that have
6357
     been imported from another library.  Function code syms that
6358
     are really in the library we must leave global to prevent the
6359
     linker dragging in a definition from a static library.  */
6360
  force_local = (!fh->elf.def_regular
6361
                 || fdh == NULL
6362
                 || !fdh->elf.def_regular
6363
                 || fdh->elf.forced_local);
6364
  _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
6365
 
6366
  return TRUE;
6367
}
6368
 
6369
/* Called near the start of bfd_elf_size_dynamic_sections.  We use
6370
   this hook to a) provide some gcc support functions, and b) transfer
6371
   dynamic linking information gathered so far on function code symbol
6372
   entries, to their corresponding function descriptor symbol entries.  */
6373
 
6374
static bfd_boolean
6375
ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
6376
                            struct bfd_link_info *info)
6377
{
6378
  struct ppc_link_hash_table *htab;
6379
  unsigned int i;
6380
  const struct sfpr_def_parms funcs[] =
6381
    {
6382
      { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
6383
      { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
6384
      { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
6385
      { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
6386
      { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
6387
      { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
6388
      { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
6389
      { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
6390
      { "._savef", 14, 31, savefpr, savefpr1_tail },
6391
      { "._restf", 14, 31, restfpr, restfpr1_tail },
6392
      { "_savevr_", 20, 31, savevr, savevr_tail },
6393
      { "_restvr_", 20, 31, restvr, restvr_tail }
6394
    };
6395
 
6396
  htab = ppc_hash_table (info);
6397
  if (htab == NULL)
6398
    return FALSE;
6399
 
6400
  if (htab->sfpr == NULL)
6401
    /* We don't have any relocs.  */
6402
    return TRUE;
6403
 
6404
  /* Provide any missing _save* and _rest* functions.  */
6405
  htab->sfpr->size = 0;
6406
  for (i = 0; i < sizeof (funcs) / sizeof (funcs[0]); i++)
6407
    if (!sfpr_define (info, &funcs[i]))
6408
      return FALSE;
6409
 
6410
  elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
6411
 
6412
  if (htab->sfpr->size == 0)
6413
    htab->sfpr->flags |= SEC_EXCLUDE;
6414
 
6415
  return TRUE;
6416
}
6417
 
6418
/* Adjust a symbol defined by a dynamic object and referenced by a
6419
   regular object.  The current definition is in some section of the
6420
   dynamic object, but we're not including those sections.  We have to
6421
   change the definition to something the rest of the link can
6422
   understand.  */
6423
 
6424
static bfd_boolean
6425
ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
6426
                                 struct elf_link_hash_entry *h)
6427
{
6428
  struct ppc_link_hash_table *htab;
6429
  asection *s;
6430
 
6431
  htab = ppc_hash_table (info);
6432
  if (htab == NULL)
6433
    return FALSE;
6434
 
6435
  /* Deal with function syms.  */
6436
  if (h->type == STT_FUNC
6437
      || h->type == STT_GNU_IFUNC
6438
      || h->needs_plt)
6439
    {
6440
      /* Clear procedure linkage table information for any symbol that
6441
         won't need a .plt entry.  */
6442
      struct plt_entry *ent;
6443
      for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6444
        if (ent->plt.refcount > 0)
6445
          break;
6446
      if (ent == NULL
6447
          || (h->type != STT_GNU_IFUNC
6448
              && (SYMBOL_CALLS_LOCAL (info, h)
6449
                  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
6450
                      && h->root.type == bfd_link_hash_undefweak))))
6451
        {
6452
          h->plt.plist = NULL;
6453
          h->needs_plt = 0;
6454
        }
6455
    }
6456
  else
6457
    h->plt.plist = NULL;
6458
 
6459
  /* If this is a weak symbol, and there is a real definition, the
6460
     processor independent code will have arranged for us to see the
6461
     real definition first, and we can just use the same value.  */
6462
  if (h->u.weakdef != NULL)
6463
    {
6464
      BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
6465
                  || h->u.weakdef->root.type == bfd_link_hash_defweak);
6466
      h->root.u.def.section = h->u.weakdef->root.u.def.section;
6467
      h->root.u.def.value = h->u.weakdef->root.u.def.value;
6468
      if (ELIMINATE_COPY_RELOCS)
6469
        h->non_got_ref = h->u.weakdef->non_got_ref;
6470
      return TRUE;
6471
    }
6472
 
6473
  /* If we are creating a shared library, we must presume that the
6474
     only references to the symbol are via the global offset table.
6475
     For such cases we need not do anything here; the relocations will
6476
     be handled correctly by relocate_section.  */
6477
  if (info->shared)
6478
    return TRUE;
6479
 
6480
  /* If there are no references to this symbol that do not use the
6481
     GOT, we don't need to generate a copy reloc.  */
6482
  if (!h->non_got_ref)
6483
    return TRUE;
6484
 
6485
  /* Don't generate a copy reloc for symbols defined in the executable.  */
6486
  if (!h->def_dynamic || !h->ref_regular || h->def_regular)
6487
    return TRUE;
6488
 
6489
  if (ELIMINATE_COPY_RELOCS)
6490
    {
6491
      struct ppc_link_hash_entry * eh;
6492
      struct elf_dyn_relocs *p;
6493
 
6494
      eh = (struct ppc_link_hash_entry *) h;
6495
      for (p = eh->dyn_relocs; p != NULL; p = p->next)
6496
        {
6497
          s = p->sec->output_section;
6498
          if (s != NULL && (s->flags & SEC_READONLY) != 0)
6499
            break;
6500
        }
6501
 
6502
      /* If we didn't find any dynamic relocs in read-only sections, then
6503
         we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
6504
      if (p == NULL)
6505
        {
6506
          h->non_got_ref = 0;
6507
          return TRUE;
6508
        }
6509
    }
6510
 
6511
  if (h->plt.plist != NULL)
6512
    {
6513
      /* We should never get here, but unfortunately there are versions
6514
         of gcc out there that improperly (for this ABI) put initialized
6515
         function pointers, vtable refs and suchlike in read-only
6516
         sections.  Allow them to proceed, but warn that this might
6517
         break at runtime.  */
6518
      info->callbacks->einfo
6519 161 khays
        (_("%P: copy reloc against `%s' requires lazy plt linking; "
6520 14 khays
           "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
6521
         h->root.root.string);
6522
    }
6523
 
6524
  /* This is a reference to a symbol defined by a dynamic object which
6525
     is not a function.  */
6526
 
6527
  if (h->size == 0)
6528
    {
6529 161 khays
      info->callbacks->einfo (_("%P: dynamic variable `%s' is zero size\n"),
6530 14 khays
                              h->root.root.string);
6531
      return TRUE;
6532
    }
6533
 
6534
  /* We must allocate the symbol in our .dynbss section, which will
6535
     become part of the .bss section of the executable.  There will be
6536
     an entry for this symbol in the .dynsym section.  The dynamic
6537
     object will contain position independent code, so all references
6538
     from the dynamic object to this symbol will go through the global
6539
     offset table.  The dynamic linker will use the .dynsym entry to
6540
     determine the address it must put in the global offset table, so
6541
     both the dynamic object and the regular object will refer to the
6542
     same memory location for the variable.  */
6543
 
6544
  /* We must generate a R_PPC64_COPY reloc to tell the dynamic linker
6545
     to copy the initial value out of the dynamic object and into the
6546
     runtime process image.  We need to remember the offset into the
6547
     .rela.bss section we are going to use.  */
6548
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
6549
    {
6550
      htab->relbss->size += sizeof (Elf64_External_Rela);
6551
      h->needs_copy = 1;
6552
    }
6553
 
6554
  s = htab->dynbss;
6555
 
6556
  return _bfd_elf_adjust_dynamic_copy (h, s);
6557
}
6558
 
6559
/* If given a function descriptor symbol, hide both the function code
6560
   sym and the descriptor.  */
6561
static void
6562
ppc64_elf_hide_symbol (struct bfd_link_info *info,
6563
                       struct elf_link_hash_entry *h,
6564
                       bfd_boolean force_local)
6565
{
6566
  struct ppc_link_hash_entry *eh;
6567
  _bfd_elf_link_hash_hide_symbol (info, h, force_local);
6568
 
6569
  eh = (struct ppc_link_hash_entry *) h;
6570
  if (eh->is_func_descriptor)
6571
    {
6572
      struct ppc_link_hash_entry *fh = eh->oh;
6573
 
6574
      if (fh == NULL)
6575
        {
6576
          const char *p, *q;
6577
          struct ppc_link_hash_table *htab;
6578
          char save;
6579
 
6580
          /* We aren't supposed to use alloca in BFD because on
6581
             systems which do not have alloca the version in libiberty
6582
             calls xmalloc, which might cause the program to crash
6583
             when it runs out of memory.  This function doesn't have a
6584
             return status, so there's no way to gracefully return an
6585
             error.  So cheat.  We know that string[-1] can be safely
6586
             accessed;  It's either a string in an ELF string table,
6587
             or allocated in an objalloc structure.  */
6588
 
6589
          p = eh->elf.root.root.string - 1;
6590
          save = *p;
6591
          *(char *) p = '.';
6592
          htab = ppc_hash_table (info);
6593
          if (htab == NULL)
6594
            return;
6595
 
6596
          fh = (struct ppc_link_hash_entry *)
6597
            elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
6598
          *(char *) p = save;
6599
 
6600
          /* Unfortunately, if it so happens that the string we were
6601
             looking for was allocated immediately before this string,
6602
             then we overwrote the string terminator.  That's the only
6603
             reason the lookup should fail.  */
6604
          if (fh == NULL)
6605
            {
6606
              q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
6607
              while (q >= eh->elf.root.root.string && *q == *p)
6608
                --q, --p;
6609
              if (q < eh->elf.root.root.string && *p == '.')
6610
                fh = (struct ppc_link_hash_entry *)
6611
                  elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
6612
            }
6613
          if (fh != NULL)
6614
            {
6615
              eh->oh = fh;
6616
              fh->oh = eh;
6617
            }
6618
        }
6619
      if (fh != NULL)
6620
        _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
6621
    }
6622
}
6623
 
6624
static bfd_boolean
6625
get_sym_h (struct elf_link_hash_entry **hp,
6626
           Elf_Internal_Sym **symp,
6627
           asection **symsecp,
6628
           unsigned char **tls_maskp,
6629
           Elf_Internal_Sym **locsymsp,
6630
           unsigned long r_symndx,
6631
           bfd *ibfd)
6632
{
6633
  Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
6634
 
6635
  if (r_symndx >= symtab_hdr->sh_info)
6636
    {
6637
      struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
6638
      struct elf_link_hash_entry *h;
6639
 
6640
      h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6641
      h = elf_follow_link (h);
6642
 
6643
      if (hp != NULL)
6644
        *hp = h;
6645
 
6646
      if (symp != NULL)
6647
        *symp = NULL;
6648
 
6649
      if (symsecp != NULL)
6650
        {
6651
          asection *symsec = NULL;
6652
          if (h->root.type == bfd_link_hash_defined
6653
              || h->root.type == bfd_link_hash_defweak)
6654
            symsec = h->root.u.def.section;
6655
          *symsecp = symsec;
6656
        }
6657
 
6658
      if (tls_maskp != NULL)
6659
        {
6660
          struct ppc_link_hash_entry *eh;
6661
 
6662
          eh = (struct ppc_link_hash_entry *) h;
6663
          *tls_maskp = &eh->tls_mask;
6664
        }
6665
    }
6666
  else
6667
    {
6668
      Elf_Internal_Sym *sym;
6669
      Elf_Internal_Sym *locsyms = *locsymsp;
6670
 
6671
      if (locsyms == NULL)
6672
        {
6673
          locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
6674
          if (locsyms == NULL)
6675
            locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
6676
                                            symtab_hdr->sh_info,
6677
                                            0, NULL, NULL, NULL);
6678
          if (locsyms == NULL)
6679
            return FALSE;
6680
          *locsymsp = locsyms;
6681
        }
6682
      sym = locsyms + r_symndx;
6683
 
6684
      if (hp != NULL)
6685
        *hp = NULL;
6686
 
6687
      if (symp != NULL)
6688
        *symp = sym;
6689
 
6690
      if (symsecp != NULL)
6691
        *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
6692
 
6693
      if (tls_maskp != NULL)
6694
        {
6695
          struct got_entry **lgot_ents;
6696
          unsigned char *tls_mask;
6697
 
6698
          tls_mask = NULL;
6699
          lgot_ents = elf_local_got_ents (ibfd);
6700
          if (lgot_ents != NULL)
6701
            {
6702
              struct plt_entry **local_plt = (struct plt_entry **)
6703
                (lgot_ents + symtab_hdr->sh_info);
6704
              unsigned char *lgot_masks = (unsigned char *)
6705
                (local_plt + symtab_hdr->sh_info);
6706
              tls_mask = &lgot_masks[r_symndx];
6707
            }
6708
          *tls_maskp = tls_mask;
6709
        }
6710
    }
6711
  return TRUE;
6712
}
6713
 
6714
/* Returns TLS_MASKP for the given REL symbol.  Function return is 0 on
6715
   error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
6716
   type suitable for optimization, and 1 otherwise.  */
6717
 
6718
static int
6719
get_tls_mask (unsigned char **tls_maskp,
6720
              unsigned long *toc_symndx,
6721
              bfd_vma *toc_addend,
6722
              Elf_Internal_Sym **locsymsp,
6723
              const Elf_Internal_Rela *rel,
6724
              bfd *ibfd)
6725
{
6726
  unsigned long r_symndx;
6727
  int next_r;
6728
  struct elf_link_hash_entry *h;
6729
  Elf_Internal_Sym *sym;
6730
  asection *sec;
6731
  bfd_vma off;
6732
 
6733
  r_symndx = ELF64_R_SYM (rel->r_info);
6734
  if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
6735
    return 0;
6736
 
6737
  if ((*tls_maskp != NULL && **tls_maskp != 0)
6738
      || sec == NULL
6739
      || ppc64_elf_section_data (sec) == NULL
6740
      || ppc64_elf_section_data (sec)->sec_type != sec_toc)
6741
    return 1;
6742
 
6743
  /* Look inside a TOC section too.  */
6744
  if (h != NULL)
6745
    {
6746
      BFD_ASSERT (h->root.type == bfd_link_hash_defined);
6747
      off = h->root.u.def.value;
6748
    }
6749
  else
6750
    off = sym->st_value;
6751
  off += rel->r_addend;
6752
  BFD_ASSERT (off % 8 == 0);
6753
  r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
6754
  next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
6755
  if (toc_symndx != NULL)
6756
    *toc_symndx = r_symndx;
6757
  if (toc_addend != NULL)
6758
    *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
6759
  if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
6760
    return 0;
6761
  if ((h == NULL || is_static_defined (h))
6762
      && (next_r == -1 || next_r == -2))
6763
    return 1 - next_r;
6764
  return 1;
6765
}
6766
 
6767 163 khays
/* Find (or create) an entry in the tocsave hash table.  */
6768
 
6769
static struct tocsave_entry *
6770
tocsave_find (struct ppc_link_hash_table *htab,
6771
              enum insert_option insert,
6772
              Elf_Internal_Sym **local_syms,
6773
              const Elf_Internal_Rela *irela,
6774
              bfd *ibfd)
6775
{
6776
  unsigned long r_indx;
6777
  struct elf_link_hash_entry *h;
6778
  Elf_Internal_Sym *sym;
6779
  struct tocsave_entry ent, *p;
6780
  hashval_t hash;
6781
  struct tocsave_entry **slot;
6782
 
6783
  r_indx = ELF64_R_SYM (irela->r_info);
6784
  if (!get_sym_h (&h, &sym, &ent.sec, NULL, local_syms, r_indx, ibfd))
6785
    return NULL;
6786
  if (ent.sec == NULL || ent.sec->output_section == NULL)
6787
    {
6788
      (*_bfd_error_handler)
6789
        (_("%B: undefined symbol on R_PPC64_TOCSAVE relocation"));
6790
      return NULL;
6791
    }
6792
 
6793
  if (h != NULL)
6794
    ent.offset = h->root.u.def.value;
6795
  else
6796
    ent.offset = sym->st_value;
6797
  ent.offset += irela->r_addend;
6798
 
6799
  hash = tocsave_htab_hash (&ent);
6800
  slot = ((struct tocsave_entry **)
6801
          htab_find_slot_with_hash (htab->tocsave_htab, &ent, hash, insert));
6802
  if (slot == NULL)
6803
    return NULL;
6804
 
6805
  if (*slot == NULL)
6806
    {
6807
      p = (struct tocsave_entry *) bfd_alloc (ibfd, sizeof (*p));
6808
      if (p == NULL)
6809
        return NULL;
6810
      *p = ent;
6811
      *slot = p;
6812
    }
6813
  return *slot;
6814
}
6815
 
6816 14 khays
/* Adjust all global syms defined in opd sections.  In gcc generated
6817
   code for the old ABI, these will already have been done.  */
6818
 
6819
static bfd_boolean
6820
adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
6821
{
6822
  struct ppc_link_hash_entry *eh;
6823
  asection *sym_sec;
6824
  struct _opd_sec_data *opd;
6825
 
6826
  if (h->root.type == bfd_link_hash_indirect)
6827
    return TRUE;
6828
 
6829
  if (h->root.type != bfd_link_hash_defined
6830
      && h->root.type != bfd_link_hash_defweak)
6831
    return TRUE;
6832
 
6833
  eh = (struct ppc_link_hash_entry *) h;
6834
  if (eh->adjust_done)
6835
    return TRUE;
6836
 
6837
  sym_sec = eh->elf.root.u.def.section;
6838
  opd = get_opd_info (sym_sec);
6839
  if (opd != NULL && opd->adjust != NULL)
6840
    {
6841
      long adjust = opd->adjust[eh->elf.root.u.def.value / 8];
6842
      if (adjust == -1)
6843
        {
6844
          /* This entry has been deleted.  */
6845
          asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
6846
          if (dsec == NULL)
6847
            {
6848
              for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
6849
                if (elf_discarded_section (dsec))
6850
                  {
6851
                    ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
6852
                    break;
6853
                  }
6854
            }
6855
          eh->elf.root.u.def.value = 0;
6856
          eh->elf.root.u.def.section = dsec;
6857
        }
6858
      else
6859
        eh->elf.root.u.def.value += adjust;
6860
      eh->adjust_done = 1;
6861
    }
6862
  return TRUE;
6863
}
6864
 
6865
/* Handles decrementing dynamic reloc counts for the reloc specified by
6866
   R_INFO in section SEC.  If LOCAL_SYMS is NULL, then H and SYM_SEC
6867
   have already been determined.  */
6868
 
6869
static bfd_boolean
6870
dec_dynrel_count (bfd_vma r_info,
6871
                  asection *sec,
6872
                  struct bfd_link_info *info,
6873
                  Elf_Internal_Sym **local_syms,
6874
                  struct elf_link_hash_entry *h,
6875
                  asection *sym_sec)
6876
{
6877
  enum elf_ppc64_reloc_type r_type;
6878
  struct elf_dyn_relocs *p;
6879
  struct elf_dyn_relocs **pp;
6880
 
6881
  /* Can this reloc be dynamic?  This switch, and later tests here
6882
     should be kept in sync with the code in check_relocs.  */
6883
  r_type = ELF64_R_TYPE (r_info);
6884
  switch (r_type)
6885
    {
6886
    default:
6887
      return TRUE;
6888
 
6889
    case R_PPC64_TPREL16:
6890
    case R_PPC64_TPREL16_LO:
6891
    case R_PPC64_TPREL16_HI:
6892
    case R_PPC64_TPREL16_HA:
6893
    case R_PPC64_TPREL16_DS:
6894
    case R_PPC64_TPREL16_LO_DS:
6895
    case R_PPC64_TPREL16_HIGHER:
6896
    case R_PPC64_TPREL16_HIGHERA:
6897
    case R_PPC64_TPREL16_HIGHEST:
6898
    case R_PPC64_TPREL16_HIGHESTA:
6899
      if (!info->shared)
6900
        return TRUE;
6901
 
6902
    case R_PPC64_TPREL64:
6903
    case R_PPC64_DTPMOD64:
6904
    case R_PPC64_DTPREL64:
6905
    case R_PPC64_ADDR64:
6906
    case R_PPC64_REL30:
6907
    case R_PPC64_REL32:
6908
    case R_PPC64_REL64:
6909
    case R_PPC64_ADDR14:
6910
    case R_PPC64_ADDR14_BRNTAKEN:
6911
    case R_PPC64_ADDR14_BRTAKEN:
6912
    case R_PPC64_ADDR16:
6913
    case R_PPC64_ADDR16_DS:
6914
    case R_PPC64_ADDR16_HA:
6915
    case R_PPC64_ADDR16_HI:
6916
    case R_PPC64_ADDR16_HIGHER:
6917
    case R_PPC64_ADDR16_HIGHERA:
6918
    case R_PPC64_ADDR16_HIGHEST:
6919
    case R_PPC64_ADDR16_HIGHESTA:
6920
    case R_PPC64_ADDR16_LO:
6921
    case R_PPC64_ADDR16_LO_DS:
6922
    case R_PPC64_ADDR24:
6923
    case R_PPC64_ADDR32:
6924
    case R_PPC64_UADDR16:
6925
    case R_PPC64_UADDR32:
6926
    case R_PPC64_UADDR64:
6927
    case R_PPC64_TOC:
6928
      break;
6929
    }
6930
 
6931
  if (local_syms != NULL)
6932
    {
6933
      unsigned long r_symndx;
6934
      Elf_Internal_Sym *sym;
6935
      bfd *ibfd = sec->owner;
6936
 
6937
      r_symndx = ELF64_R_SYM (r_info);
6938
      if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
6939
        return FALSE;
6940
    }
6941
 
6942
  if ((info->shared
6943
       && (must_be_dyn_reloc (info, r_type)
6944
           || (h != NULL
6945
               && (!info->symbolic
6946
                   || h->root.type == bfd_link_hash_defweak
6947
                   || !h->def_regular))))
6948
      || (ELIMINATE_COPY_RELOCS
6949
          && !info->shared
6950
          && h != NULL
6951
          && (h->root.type == bfd_link_hash_defweak
6952
              || !h->def_regular)))
6953
    ;
6954
  else
6955
    return TRUE;
6956
 
6957
  if (h != NULL)
6958
    pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
6959
  else
6960
    {
6961
      if (sym_sec != NULL)
6962
        {
6963
          void *vpp = &elf_section_data (sym_sec)->local_dynrel;
6964
          pp = (struct elf_dyn_relocs **) vpp;
6965
        }
6966
      else
6967
        {
6968
          void *vpp = &elf_section_data (sec)->local_dynrel;
6969
          pp = (struct elf_dyn_relocs **) vpp;
6970
        }
6971
 
6972
      /* elf_gc_sweep may have already removed all dyn relocs associated
6973
         with local syms for a given section.  Don't report a dynreloc
6974
         miscount.  */
6975
      if (*pp == NULL)
6976
        return TRUE;
6977
    }
6978
 
6979
  while ((p = *pp) != NULL)
6980
    {
6981
      if (p->sec == sec)
6982
        {
6983
          if (!must_be_dyn_reloc (info, r_type))
6984
            p->pc_count -= 1;
6985
          p->count -= 1;
6986
          if (p->count == 0)
6987
            *pp = p->next;
6988
          return TRUE;
6989
        }
6990
      pp = &p->next;
6991
    }
6992
 
6993 161 khays
  info->callbacks->einfo (_("%P: dynreloc miscount for %B, section %A\n"),
6994 14 khays
                          sec->owner, sec);
6995
  bfd_set_error (bfd_error_bad_value);
6996
  return FALSE;
6997
}
6998
 
6999
/* Remove unused Official Procedure Descriptor entries.  Currently we
7000
   only remove those associated with functions in discarded link-once
7001
   sections, or weakly defined functions that have been overridden.  It
7002
   would be possible to remove many more entries for statically linked
7003
   applications.  */
7004
 
7005
bfd_boolean
7006
ppc64_elf_edit_opd (struct bfd_link_info *info, bfd_boolean non_overlapping)
7007
{
7008
  bfd *ibfd;
7009
  bfd_boolean some_edited = FALSE;
7010
  asection *need_pad = NULL;
7011
 
7012
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
7013
    {
7014
      asection *sec;
7015
      Elf_Internal_Rela *relstart, *rel, *relend;
7016
      Elf_Internal_Shdr *symtab_hdr;
7017
      Elf_Internal_Sym *local_syms;
7018
      bfd_vma offset;
7019
      struct _opd_sec_data *opd;
7020
      bfd_boolean need_edit, add_aux_fields;
7021
      bfd_size_type cnt_16b = 0;
7022
 
7023
      if (!is_ppc64_elf (ibfd))
7024
        continue;
7025
 
7026
      sec = bfd_get_section_by_name (ibfd, ".opd");
7027
      if (sec == NULL || sec->size == 0)
7028
        continue;
7029
 
7030
      if (sec->sec_info_type == ELF_INFO_TYPE_JUST_SYMS)
7031
        continue;
7032
 
7033
      if (sec->output_section == bfd_abs_section_ptr)
7034
        continue;
7035
 
7036
      /* Look through the section relocs.  */
7037
      if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
7038
        continue;
7039
 
7040
      local_syms = NULL;
7041
      symtab_hdr = &elf_symtab_hdr (ibfd);
7042
 
7043
      /* Read the relocations.  */
7044
      relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7045
                                            info->keep_memory);
7046
      if (relstart == NULL)
7047
        return FALSE;
7048
 
7049
      /* First run through the relocs to check they are sane, and to
7050
         determine whether we need to edit this opd section.  */
7051
      need_edit = FALSE;
7052
      need_pad = sec;
7053
      offset = 0;
7054
      relend = relstart + sec->reloc_count;
7055
      for (rel = relstart; rel < relend; )
7056
        {
7057
          enum elf_ppc64_reloc_type r_type;
7058
          unsigned long r_symndx;
7059
          asection *sym_sec;
7060
          struct elf_link_hash_entry *h;
7061
          Elf_Internal_Sym *sym;
7062
 
7063
          /* .opd contains a regular array of 16 or 24 byte entries.  We're
7064
             only interested in the reloc pointing to a function entry
7065
             point.  */
7066
          if (rel->r_offset != offset
7067
              || rel + 1 >= relend
7068
              || (rel + 1)->r_offset != offset + 8)
7069
            {
7070
              /* If someone messes with .opd alignment then after a
7071
                 "ld -r" we might have padding in the middle of .opd.
7072
                 Also, there's nothing to prevent someone putting
7073
                 something silly in .opd with the assembler.  No .opd
7074
                 optimization for them!  */
7075
            broken_opd:
7076
              (*_bfd_error_handler)
7077
                (_("%B: .opd is not a regular array of opd entries"), ibfd);
7078
              need_edit = FALSE;
7079
              break;
7080
            }
7081
 
7082
          if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
7083
              || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
7084
            {
7085
              (*_bfd_error_handler)
7086
                (_("%B: unexpected reloc type %u in .opd section"),
7087
                 ibfd, r_type);
7088
              need_edit = FALSE;
7089
              break;
7090
            }
7091
 
7092
          r_symndx = ELF64_R_SYM (rel->r_info);
7093
          if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7094
                          r_symndx, ibfd))
7095
            goto error_ret;
7096
 
7097
          if (sym_sec == NULL || sym_sec->owner == NULL)
7098
            {
7099
              const char *sym_name;
7100
              if (h != NULL)
7101
                sym_name = h->root.root.string;
7102
              else
7103
                sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7104
                                             sym_sec);
7105
 
7106
              (*_bfd_error_handler)
7107
                (_("%B: undefined sym `%s' in .opd section"),
7108
                 ibfd, sym_name);
7109
              need_edit = FALSE;
7110
              break;
7111
            }
7112
 
7113
          /* opd entries are always for functions defined in the
7114
             current input bfd.  If the symbol isn't defined in the
7115
             input bfd, then we won't be using the function in this
7116
             bfd;  It must be defined in a linkonce section in another
7117
             bfd, or is weak.  It's also possible that we are
7118
             discarding the function due to a linker script /DISCARD/,
7119
             which we test for via the output_section.  */
7120
          if (sym_sec->owner != ibfd
7121
              || sym_sec->output_section == bfd_abs_section_ptr)
7122
            need_edit = TRUE;
7123
 
7124
          rel += 2;
7125
          if (rel == relend
7126
              || (rel + 1 == relend && rel->r_offset == offset + 16))
7127
            {
7128
              if (sec->size == offset + 24)
7129
                {
7130
                  need_pad = NULL;
7131
                  break;
7132
                }
7133
              if (rel == relend && sec->size == offset + 16)
7134
                {
7135
                  cnt_16b++;
7136
                  break;
7137
                }
7138
              goto broken_opd;
7139
            }
7140
 
7141
          if (rel->r_offset == offset + 24)
7142
            offset += 24;
7143
          else if (rel->r_offset != offset + 16)
7144
            goto broken_opd;
7145
          else if (rel + 1 < relend
7146
                   && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
7147
                   && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
7148
            {
7149
              offset += 16;
7150
              cnt_16b++;
7151
            }
7152
          else if (rel + 2 < relend
7153
                   && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_ADDR64
7154
                   && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC)
7155
            {
7156
              offset += 24;
7157
              rel += 1;
7158
            }
7159
          else
7160
            goto broken_opd;
7161
        }
7162
 
7163
      add_aux_fields = non_overlapping && cnt_16b > 0;
7164
 
7165
      if (need_edit || add_aux_fields)
7166
        {
7167
          Elf_Internal_Rela *write_rel;
7168
          Elf_Internal_Shdr *rel_hdr;
7169
          bfd_byte *rptr, *wptr;
7170
          bfd_byte *new_contents;
7171
          bfd_boolean skip;
7172
          long opd_ent_size;
7173
          bfd_size_type amt;
7174
 
7175
          new_contents = NULL;
7176
          amt = sec->size * sizeof (long) / 8;
7177
          opd = &ppc64_elf_section_data (sec)->u.opd;
7178
          opd->adjust = bfd_zalloc (sec->owner, amt);
7179
          if (opd->adjust == NULL)
7180
            return FALSE;
7181
          ppc64_elf_section_data (sec)->sec_type = sec_opd;
7182
 
7183
          /* This seems a waste of time as input .opd sections are all
7184
             zeros as generated by gcc, but I suppose there's no reason
7185
             this will always be so.  We might start putting something in
7186
             the third word of .opd entries.  */
7187
          if ((sec->flags & SEC_IN_MEMORY) == 0)
7188
            {
7189
              bfd_byte *loc;
7190
              if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
7191
                {
7192
                  if (loc != NULL)
7193
                    free (loc);
7194
                error_ret:
7195
                  if (local_syms != NULL
7196
                      && symtab_hdr->contents != (unsigned char *) local_syms)
7197
                    free (local_syms);
7198
                  if (elf_section_data (sec)->relocs != relstart)
7199
                    free (relstart);
7200
                  return FALSE;
7201
                }
7202
              sec->contents = loc;
7203
              sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7204
            }
7205
 
7206
          elf_section_data (sec)->relocs = relstart;
7207
 
7208
          new_contents = sec->contents;
7209
          if (add_aux_fields)
7210
            {
7211
              new_contents = bfd_malloc (sec->size + cnt_16b * 8);
7212
              if (new_contents == NULL)
7213
                return FALSE;
7214
              need_pad = FALSE;
7215
            }
7216
          wptr = new_contents;
7217
          rptr = sec->contents;
7218
 
7219
          write_rel = relstart;
7220
          skip = FALSE;
7221
          offset = 0;
7222
          opd_ent_size = 0;
7223
          for (rel = relstart; rel < relend; rel++)
7224
            {
7225
              unsigned long r_symndx;
7226
              asection *sym_sec;
7227
              struct elf_link_hash_entry *h;
7228
              Elf_Internal_Sym *sym;
7229
 
7230
              r_symndx = ELF64_R_SYM (rel->r_info);
7231
              if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7232
                              r_symndx, ibfd))
7233
                goto error_ret;
7234
 
7235
              if (rel->r_offset == offset)
7236
                {
7237
                  struct ppc_link_hash_entry *fdh = NULL;
7238
 
7239
                  /* See if the .opd entry is full 24 byte or
7240
                     16 byte (with fd_aux entry overlapped with next
7241
                     fd_func).  */
7242
                  opd_ent_size = 24;
7243
                  if ((rel + 2 == relend && sec->size == offset + 16)
7244
                      || (rel + 3 < relend
7245
                          && rel[2].r_offset == offset + 16
7246
                          && rel[3].r_offset == offset + 24
7247
                          && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_ADDR64
7248
                          && ELF64_R_TYPE (rel[3].r_info) == R_PPC64_TOC))
7249
                    opd_ent_size = 16;
7250
 
7251
                  if (h != NULL
7252
                      && h->root.root.string[0] == '.')
7253
                    {
7254
                      struct ppc_link_hash_table *htab;
7255
 
7256
                      htab = ppc_hash_table (info);
7257
                      if (htab != NULL)
7258
                        fdh = lookup_fdh ((struct ppc_link_hash_entry *) h,
7259
                                          htab);
7260
                      if (fdh != NULL
7261
                          && fdh->elf.root.type != bfd_link_hash_defined
7262
                          && fdh->elf.root.type != bfd_link_hash_defweak)
7263
                        fdh = NULL;
7264
                    }
7265
 
7266
                  skip = (sym_sec->owner != ibfd
7267
                          || sym_sec->output_section == bfd_abs_section_ptr);
7268
                  if (skip)
7269
                    {
7270
                      if (fdh != NULL && sym_sec->owner == ibfd)
7271
                        {
7272
                          /* Arrange for the function descriptor sym
7273
                             to be dropped.  */
7274
                          fdh->elf.root.u.def.value = 0;
7275
                          fdh->elf.root.u.def.section = sym_sec;
7276
                        }
7277
                      opd->adjust[rel->r_offset / 8] = -1;
7278
                    }
7279
                  else
7280
                    {
7281
                      /* We'll be keeping this opd entry.  */
7282
 
7283
                      if (fdh != NULL)
7284
                        {
7285
                          /* Redefine the function descriptor symbol to
7286
                             this location in the opd section.  It is
7287
                             necessary to update the value here rather
7288
                             than using an array of adjustments as we do
7289
                             for local symbols, because various places
7290
                             in the generic ELF code use the value
7291
                             stored in u.def.value.  */
7292
                          fdh->elf.root.u.def.value = wptr - new_contents;
7293
                          fdh->adjust_done = 1;
7294
                        }
7295
 
7296
                      /* Local syms are a bit tricky.  We could
7297
                         tweak them as they can be cached, but
7298
                         we'd need to look through the local syms
7299
                         for the function descriptor sym which we
7300
                         don't have at the moment.  So keep an
7301
                         array of adjustments.  */
7302
                      opd->adjust[rel->r_offset / 8]
7303
                        = (wptr - new_contents) - (rptr - sec->contents);
7304
 
7305
                      if (wptr != rptr)
7306
                        memcpy (wptr, rptr, opd_ent_size);
7307
                      wptr += opd_ent_size;
7308
                      if (add_aux_fields && opd_ent_size == 16)
7309
                        {
7310
                          memset (wptr, '\0', 8);
7311
                          wptr += 8;
7312
                        }
7313
                    }
7314
                  rptr += opd_ent_size;
7315
                  offset += opd_ent_size;
7316
                }
7317
 
7318
              if (skip)
7319
                {
7320
                  if (!NO_OPD_RELOCS
7321
                      && !info->relocatable
7322
                      && !dec_dynrel_count (rel->r_info, sec, info,
7323
                                            NULL, h, sym_sec))
7324
                    goto error_ret;
7325
                }
7326
              else
7327
                {
7328
                  /* We need to adjust any reloc offsets to point to the
7329
                     new opd entries.  While we're at it, we may as well
7330
                     remove redundant relocs.  */
7331
                  rel->r_offset += opd->adjust[(offset - opd_ent_size) / 8];
7332
                  if (write_rel != rel)
7333
                    memcpy (write_rel, rel, sizeof (*rel));
7334
                  ++write_rel;
7335
                }
7336
            }
7337
 
7338
          sec->size = wptr - new_contents;
7339
          sec->reloc_count = write_rel - relstart;
7340
          if (add_aux_fields)
7341
            {
7342
              free (sec->contents);
7343
              sec->contents = new_contents;
7344
            }
7345
 
7346
          /* Fudge the header size too, as this is used later in
7347
             elf_bfd_final_link if we are emitting relocs.  */
7348
          rel_hdr = _bfd_elf_single_rel_hdr (sec);
7349
          rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize;
7350
          some_edited = TRUE;
7351
        }
7352
      else if (elf_section_data (sec)->relocs != relstart)
7353
        free (relstart);
7354
 
7355
      if (local_syms != NULL
7356
          && symtab_hdr->contents != (unsigned char *) local_syms)
7357
        {
7358
          if (!info->keep_memory)
7359
            free (local_syms);
7360
          else
7361
            symtab_hdr->contents = (unsigned char *) local_syms;
7362
        }
7363
    }
7364
 
7365
  if (some_edited)
7366
    elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
7367
 
7368
  /* If we are doing a final link and the last .opd entry is just 16 byte
7369
     long, add a 8 byte padding after it.  */
7370
  if (need_pad != NULL && !info->relocatable)
7371
    {
7372
      bfd_byte *p;
7373
 
7374
      if ((need_pad->flags & SEC_IN_MEMORY) == 0)
7375
        {
7376
          BFD_ASSERT (need_pad->size > 0);
7377
 
7378
          p = bfd_malloc (need_pad->size + 8);
7379
          if (p == NULL)
7380
            return FALSE;
7381
 
7382
          if (! bfd_get_section_contents (need_pad->owner, need_pad,
7383
                                          p, 0, need_pad->size))
7384
            return FALSE;
7385
 
7386
          need_pad->contents = p;
7387
          need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7388
        }
7389
      else
7390
        {
7391
          p = bfd_realloc (need_pad->contents, need_pad->size + 8);
7392
          if (p == NULL)
7393
            return FALSE;
7394
 
7395
          need_pad->contents = p;
7396
        }
7397
 
7398
      memset (need_pad->contents + need_pad->size, 0, 8);
7399
      need_pad->size += 8;
7400
    }
7401
 
7402
  return TRUE;
7403
}
7404
 
7405
/* Set htab->tls_get_addr and call the generic ELF tls_setup function.  */
7406
 
7407
asection *
7408
ppc64_elf_tls_setup (struct bfd_link_info *info,
7409
                     int no_tls_get_addr_opt,
7410
                     int *no_multi_toc)
7411
{
7412
  struct ppc_link_hash_table *htab;
7413
 
7414
  htab = ppc_hash_table (info);
7415
  if (htab == NULL)
7416
    return NULL;
7417
 
7418
  if (*no_multi_toc)
7419
    htab->do_multi_toc = 0;
7420
  else if (!htab->do_multi_toc)
7421
    *no_multi_toc = 1;
7422
 
7423
  htab->tls_get_addr = ((struct ppc_link_hash_entry *)
7424
                        elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
7425
                                              FALSE, FALSE, TRUE));
7426
  /* Move dynamic linking info to the function descriptor sym.  */
7427
  if (htab->tls_get_addr != NULL)
7428
    func_desc_adjust (&htab->tls_get_addr->elf, info);
7429
  htab->tls_get_addr_fd = ((struct ppc_link_hash_entry *)
7430
                           elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
7431
                                                 FALSE, FALSE, TRUE));
7432
  if (!no_tls_get_addr_opt)
7433
    {
7434
      struct elf_link_hash_entry *opt, *opt_fd, *tga, *tga_fd;
7435
 
7436
      opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt",
7437
                                  FALSE, FALSE, TRUE);
7438
      if (opt != NULL)
7439
        func_desc_adjust (opt, info);
7440
      opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
7441
                                     FALSE, FALSE, TRUE);
7442
      if (opt_fd != NULL
7443
          && (opt_fd->root.type == bfd_link_hash_defined
7444
              || opt_fd->root.type == bfd_link_hash_defweak))
7445
        {
7446
          /* If glibc supports an optimized __tls_get_addr call stub,
7447
             signalled by the presence of __tls_get_addr_opt, and we'll
7448
             be calling __tls_get_addr via a plt call stub, then
7449
             make __tls_get_addr point to __tls_get_addr_opt.  */
7450
          tga_fd = &htab->tls_get_addr_fd->elf;
7451
          if (htab->elf.dynamic_sections_created
7452
              && tga_fd != NULL
7453
              && (tga_fd->type == STT_FUNC
7454
                  || tga_fd->needs_plt)
7455
              && !(SYMBOL_CALLS_LOCAL (info, tga_fd)
7456
                   || (ELF_ST_VISIBILITY (tga_fd->other) != STV_DEFAULT
7457
                       && tga_fd->root.type == bfd_link_hash_undefweak)))
7458
            {
7459
              struct plt_entry *ent;
7460
 
7461
              for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next)
7462
                if (ent->plt.refcount > 0)
7463
                  break;
7464
              if (ent != NULL)
7465
                {
7466
                  tga_fd->root.type = bfd_link_hash_indirect;
7467
                  tga_fd->root.u.i.link = &opt_fd->root;
7468
                  ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd);
7469
                  if (opt_fd->dynindx != -1)
7470
                    {
7471
                      /* Use __tls_get_addr_opt in dynamic relocations.  */
7472
                      opt_fd->dynindx = -1;
7473
                      _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
7474
                                              opt_fd->dynstr_index);
7475
                      if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd))
7476
                        return NULL;
7477
                    }
7478
                  htab->tls_get_addr_fd = (struct ppc_link_hash_entry *) opt_fd;
7479
                  tga = &htab->tls_get_addr->elf;
7480
                  if (opt != NULL && tga != NULL)
7481
                    {
7482
                      tga->root.type = bfd_link_hash_indirect;
7483
                      tga->root.u.i.link = &opt->root;
7484
                      ppc64_elf_copy_indirect_symbol (info, opt, tga);
7485
                      _bfd_elf_link_hash_hide_symbol (info, opt,
7486
                                                      tga->forced_local);
7487
                      htab->tls_get_addr = (struct ppc_link_hash_entry *) opt;
7488
                    }
7489
                  htab->tls_get_addr_fd->oh = htab->tls_get_addr;
7490
                  htab->tls_get_addr_fd->is_func_descriptor = 1;
7491
                  if (htab->tls_get_addr != NULL)
7492
                    {
7493
                      htab->tls_get_addr->oh = htab->tls_get_addr_fd;
7494
                      htab->tls_get_addr->is_func = 1;
7495
                    }
7496
                }
7497
            }
7498
        }
7499
      else
7500
        no_tls_get_addr_opt = TRUE;
7501
    }
7502
  htab->no_tls_get_addr_opt = no_tls_get_addr_opt;
7503
  return _bfd_elf_tls_setup (info->output_bfd, info);
7504
}
7505
 
7506
/* Return TRUE iff REL is a branch reloc with a global symbol matching
7507
   HASH1 or HASH2.  */
7508
 
7509
static bfd_boolean
7510
branch_reloc_hash_match (const bfd *ibfd,
7511
                         const Elf_Internal_Rela *rel,
7512
                         const struct ppc_link_hash_entry *hash1,
7513
                         const struct ppc_link_hash_entry *hash2)
7514
{
7515
  Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
7516
  enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
7517
  unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
7518
 
7519
  if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
7520
    {
7521
      struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7522
      struct elf_link_hash_entry *h;
7523
 
7524
      h = sym_hashes[r_symndx - symtab_hdr->sh_info];
7525
      h = elf_follow_link (h);
7526
      if (h == &hash1->elf || h == &hash2->elf)
7527
        return TRUE;
7528
    }
7529
  return FALSE;
7530
}
7531
 
7532
/* Run through all the TLS relocs looking for optimization
7533
   opportunities.  The linker has been hacked (see ppc64elf.em) to do
7534
   a preliminary section layout so that we know the TLS segment
7535
   offsets.  We can't optimize earlier because some optimizations need
7536
   to know the tp offset, and we need to optimize before allocating
7537
   dynamic relocations.  */
7538
 
7539
bfd_boolean
7540
ppc64_elf_tls_optimize (struct bfd_link_info *info)
7541
{
7542
  bfd *ibfd;
7543
  asection *sec;
7544
  struct ppc_link_hash_table *htab;
7545
  unsigned char *toc_ref;
7546
  int pass;
7547
 
7548
  if (info->relocatable || !info->executable)
7549
    return TRUE;
7550
 
7551
  htab = ppc_hash_table (info);
7552
  if (htab == NULL)
7553
    return FALSE;
7554
 
7555
  /* Make two passes over the relocs.  On the first pass, mark toc
7556
     entries involved with tls relocs, and check that tls relocs
7557
     involved in setting up a tls_get_addr call are indeed followed by
7558
     such a call.  If they are not, we can't do any tls optimization.
7559
     On the second pass twiddle tls_mask flags to notify
7560
     relocate_section that optimization can be done, and adjust got
7561
     and plt refcounts.  */
7562
  toc_ref = NULL;
7563
  for (pass = 0; pass < 2; ++pass)
7564
    for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
7565
      {
7566
        Elf_Internal_Sym *locsyms = NULL;
7567
        asection *toc = bfd_get_section_by_name (ibfd, ".toc");
7568
 
7569
        for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7570
          if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
7571
            {
7572
              Elf_Internal_Rela *relstart, *rel, *relend;
7573
              bfd_boolean found_tls_get_addr_arg = 0;
7574
 
7575
              /* Read the relocations.  */
7576
              relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7577
                                                    info->keep_memory);
7578
              if (relstart == NULL)
7579
                return FALSE;
7580
 
7581
              relend = relstart + sec->reloc_count;
7582
              for (rel = relstart; rel < relend; rel++)
7583
                {
7584
                  enum elf_ppc64_reloc_type r_type;
7585
                  unsigned long r_symndx;
7586
                  struct elf_link_hash_entry *h;
7587
                  Elf_Internal_Sym *sym;
7588
                  asection *sym_sec;
7589
                  unsigned char *tls_mask;
7590
                  unsigned char tls_set, tls_clear, tls_type = 0;
7591
                  bfd_vma value;
7592
                  bfd_boolean ok_tprel, is_local;
7593
                  long toc_ref_index = 0;
7594
                  int expecting_tls_get_addr = 0;
7595
                  bfd_boolean ret = FALSE;
7596
 
7597
                  r_symndx = ELF64_R_SYM (rel->r_info);
7598
                  if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
7599
                                  r_symndx, ibfd))
7600
                    {
7601
                    err_free_rel:
7602
                      if (elf_section_data (sec)->relocs != relstart)
7603
                        free (relstart);
7604
                      if (toc_ref != NULL)
7605
                        free (toc_ref);
7606
                      if (locsyms != NULL
7607
                          && (elf_symtab_hdr (ibfd).contents
7608
                              != (unsigned char *) locsyms))
7609
                        free (locsyms);
7610
                      return ret;
7611
                    }
7612
 
7613
                  if (h != NULL)
7614
                    {
7615
                      if (h->root.type == bfd_link_hash_defined
7616
                          || h->root.type == bfd_link_hash_defweak)
7617
                        value = h->root.u.def.value;
7618
                      else if (h->root.type == bfd_link_hash_undefweak)
7619
                        value = 0;
7620
                      else
7621
                        {
7622
                          found_tls_get_addr_arg = 0;
7623
                          continue;
7624
                        }
7625
                    }
7626
                  else
7627
                    /* Symbols referenced by TLS relocs must be of type
7628
                       STT_TLS.  So no need for .opd local sym adjust.  */
7629
                    value = sym->st_value;
7630
 
7631
                  ok_tprel = FALSE;
7632
                  is_local = FALSE;
7633
                  if (h == NULL
7634
                      || !h->def_dynamic)
7635
                    {
7636
                      is_local = TRUE;
7637
                      if (h != NULL
7638
                          && h->root.type == bfd_link_hash_undefweak)
7639
                        ok_tprel = TRUE;
7640
                      else
7641
                        {
7642
                          value += sym_sec->output_offset;
7643
                          value += sym_sec->output_section->vma;
7644
                          value -= htab->elf.tls_sec->vma;
7645
                          ok_tprel = (value + TP_OFFSET + ((bfd_vma) 1 << 31)
7646
                                      < (bfd_vma) 1 << 32);
7647
                        }
7648
                    }
7649
 
7650
                  r_type = ELF64_R_TYPE (rel->r_info);
7651
                  /* If this section has old-style __tls_get_addr calls
7652
                     without marker relocs, then check that each
7653
                     __tls_get_addr call reloc is preceded by a reloc
7654
                     that conceivably belongs to the __tls_get_addr arg
7655
                     setup insn.  If we don't find matching arg setup
7656
                     relocs, don't do any tls optimization.  */
7657
                  if (pass == 0
7658
                      && sec->has_tls_get_addr_call
7659
                      && h != NULL
7660
                      && (h == &htab->tls_get_addr->elf
7661
                          || h == &htab->tls_get_addr_fd->elf)
7662
                      && !found_tls_get_addr_arg
7663
                      && is_branch_reloc (r_type))
7664
                    {
7665
                      info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
7666
                                                "TLS optimization disabled\n"),
7667
                                              ibfd, sec, rel->r_offset);
7668
                      ret = TRUE;
7669
                      goto err_free_rel;
7670
                    }
7671
 
7672
                  found_tls_get_addr_arg = 0;
7673
                  switch (r_type)
7674
                    {
7675
                    case R_PPC64_GOT_TLSLD16:
7676
                    case R_PPC64_GOT_TLSLD16_LO:
7677
                      expecting_tls_get_addr = 1;
7678
                      found_tls_get_addr_arg = 1;
7679
                      /* Fall thru */
7680
 
7681
                    case R_PPC64_GOT_TLSLD16_HI:
7682
                    case R_PPC64_GOT_TLSLD16_HA:
7683
                      /* These relocs should never be against a symbol
7684
                         defined in a shared lib.  Leave them alone if
7685
                         that turns out to be the case.  */
7686
                      if (!is_local)
7687
                        continue;
7688
 
7689
                      /* LD -> LE */
7690
                      tls_set = 0;
7691
                      tls_clear = TLS_LD;
7692
                      tls_type = TLS_TLS | TLS_LD;
7693
                      break;
7694
 
7695
                    case R_PPC64_GOT_TLSGD16:
7696
                    case R_PPC64_GOT_TLSGD16_LO:
7697
                      expecting_tls_get_addr = 1;
7698
                      found_tls_get_addr_arg = 1;
7699
                      /* Fall thru */
7700
 
7701
                    case R_PPC64_GOT_TLSGD16_HI:
7702
                    case R_PPC64_GOT_TLSGD16_HA:
7703
                      if (ok_tprel)
7704
                        /* GD -> LE */
7705
                        tls_set = 0;
7706
                      else
7707
                        /* GD -> IE */
7708
                        tls_set = TLS_TLS | TLS_TPRELGD;
7709
                      tls_clear = TLS_GD;
7710
                      tls_type = TLS_TLS | TLS_GD;
7711
                      break;
7712
 
7713
                    case R_PPC64_GOT_TPREL16_DS:
7714
                    case R_PPC64_GOT_TPREL16_LO_DS:
7715
                    case R_PPC64_GOT_TPREL16_HI:
7716
                    case R_PPC64_GOT_TPREL16_HA:
7717
                      if (ok_tprel)
7718
                        {
7719
                          /* IE -> LE */
7720
                          tls_set = 0;
7721
                          tls_clear = TLS_TPREL;
7722
                          tls_type = TLS_TLS | TLS_TPREL;
7723
                          break;
7724
                        }
7725
                      continue;
7726
 
7727
                    case R_PPC64_TLSGD:
7728
                    case R_PPC64_TLSLD:
7729
                      found_tls_get_addr_arg = 1;
7730
                      /* Fall thru */
7731
 
7732
                    case R_PPC64_TLS:
7733
                    case R_PPC64_TOC16:
7734
                    case R_PPC64_TOC16_LO:
7735
                      if (sym_sec == NULL || sym_sec != toc)
7736
                        continue;
7737
 
7738
                      /* Mark this toc entry as referenced by a TLS
7739
                         code sequence.  We can do that now in the
7740
                         case of R_PPC64_TLS, and after checking for
7741
                         tls_get_addr for the TOC16 relocs.  */
7742
                      if (toc_ref == NULL)
7743
                        toc_ref = bfd_zmalloc (toc->output_section->rawsize / 8);
7744
                      if (toc_ref == NULL)
7745
                        goto err_free_rel;
7746
 
7747
                      if (h != NULL)
7748
                        value = h->root.u.def.value;
7749
                      else
7750
                        value = sym->st_value;
7751
                      value += rel->r_addend;
7752
                      BFD_ASSERT (value < toc->size && value % 8 == 0);
7753
                      toc_ref_index = (value + toc->output_offset) / 8;
7754
                      if (r_type == R_PPC64_TLS
7755
                          || r_type == R_PPC64_TLSGD
7756
                          || r_type == R_PPC64_TLSLD)
7757
                        {
7758
                          toc_ref[toc_ref_index] = 1;
7759
                          continue;
7760
                        }
7761
 
7762
                      if (pass != 0 && toc_ref[toc_ref_index] == 0)
7763
                        continue;
7764
 
7765
                      tls_set = 0;
7766
                      tls_clear = 0;
7767
                      expecting_tls_get_addr = 2;
7768
                      break;
7769
 
7770
                    case R_PPC64_TPREL64:
7771
                      if (pass == 0
7772
                          || sec != toc
7773
                          || toc_ref == NULL
7774
                          || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
7775
                        continue;
7776
                      if (ok_tprel)
7777
                        {
7778
                          /* IE -> LE */
7779
                          tls_set = TLS_EXPLICIT;
7780
                          tls_clear = TLS_TPREL;
7781
                          break;
7782
                        }
7783
                      continue;
7784
 
7785
                    case R_PPC64_DTPMOD64:
7786
                      if (pass == 0
7787
                          || sec != toc
7788
                          || toc_ref == NULL
7789
                          || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
7790
                        continue;
7791
                      if (rel + 1 < relend
7792
                          && (rel[1].r_info
7793
                              == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
7794
                          && rel[1].r_offset == rel->r_offset + 8)
7795
                        {
7796
                          if (ok_tprel)
7797
                            /* GD -> LE */
7798
                            tls_set = TLS_EXPLICIT | TLS_GD;
7799
                          else
7800
                            /* GD -> IE */
7801
                            tls_set = TLS_EXPLICIT | TLS_GD | TLS_TPRELGD;
7802
                          tls_clear = TLS_GD;
7803
                        }
7804
                      else
7805
                        {
7806
                          if (!is_local)
7807
                            continue;
7808
 
7809
                          /* LD -> LE */
7810
                          tls_set = TLS_EXPLICIT;
7811
                          tls_clear = TLS_LD;
7812
                        }
7813
                      break;
7814
 
7815
                    default:
7816
                      continue;
7817
                    }
7818
 
7819
                  if (pass == 0)
7820
                    {
7821
                      if (!expecting_tls_get_addr
7822
                          || !sec->has_tls_get_addr_call)
7823
                        continue;
7824
 
7825
                      if (rel + 1 < relend
7826
                          && branch_reloc_hash_match (ibfd, rel + 1,
7827
                                                      htab->tls_get_addr,
7828
                                                      htab->tls_get_addr_fd))
7829
                        {
7830
                          if (expecting_tls_get_addr == 2)
7831
                            {
7832
                              /* Check for toc tls entries.  */
7833
                              unsigned char *toc_tls;
7834
                              int retval;
7835
 
7836
                              retval = get_tls_mask (&toc_tls, NULL, NULL,
7837
                                                     &locsyms,
7838
                                                     rel, ibfd);
7839
                              if (retval == 0)
7840
                                goto err_free_rel;
7841
                              if (toc_tls != NULL)
7842
                                {
7843
                                  if ((*toc_tls & (TLS_GD | TLS_LD)) != 0)
7844
                                    found_tls_get_addr_arg = 1;
7845
                                  if (retval > 1)
7846
                                    toc_ref[toc_ref_index] = 1;
7847
                                }
7848
                            }
7849
                          continue;
7850
                        }
7851
 
7852
                      if (expecting_tls_get_addr != 1)
7853
                        continue;
7854
 
7855
                      /* Uh oh, we didn't find the expected call.  We
7856
                         could just mark this symbol to exclude it
7857
                         from tls optimization but it's safer to skip
7858
                         the entire optimization.  */
7859
                      info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
7860
                                                "TLS optimization disabled\n"),
7861
                                              ibfd, sec, rel->r_offset);
7862
                      ret = TRUE;
7863
                      goto err_free_rel;
7864
                    }
7865
 
7866
                  if (expecting_tls_get_addr && htab->tls_get_addr != NULL)
7867
                    {
7868
                      struct plt_entry *ent;
7869
                      for (ent = htab->tls_get_addr->elf.plt.plist;
7870
                           ent != NULL;
7871
                           ent = ent->next)
7872
                        if (ent->addend == 0)
7873
                          {
7874
                            if (ent->plt.refcount > 0)
7875
                              {
7876
                                ent->plt.refcount -= 1;
7877
                                expecting_tls_get_addr = 0;
7878
                              }
7879
                            break;
7880
                          }
7881
                    }
7882
 
7883
                  if (expecting_tls_get_addr && htab->tls_get_addr_fd != NULL)
7884
                    {
7885
                      struct plt_entry *ent;
7886
                      for (ent = htab->tls_get_addr_fd->elf.plt.plist;
7887
                           ent != NULL;
7888
                           ent = ent->next)
7889
                        if (ent->addend == 0)
7890
                          {
7891
                            if (ent->plt.refcount > 0)
7892
                              ent->plt.refcount -= 1;
7893
                            break;
7894
                          }
7895
                    }
7896
 
7897
                  if (tls_clear == 0)
7898
                    continue;
7899
 
7900
                  if ((tls_set & TLS_EXPLICIT) == 0)
7901
                    {
7902
                      struct got_entry *ent;
7903
 
7904
                      /* Adjust got entry for this reloc.  */
7905
                      if (h != NULL)
7906
                        ent = h->got.glist;
7907
                      else
7908
                        ent = elf_local_got_ents (ibfd)[r_symndx];
7909
 
7910
                      for (; ent != NULL; ent = ent->next)
7911
                        if (ent->addend == rel->r_addend
7912
                            && ent->owner == ibfd
7913
                            && ent->tls_type == tls_type)
7914
                          break;
7915
                      if (ent == NULL)
7916
                        abort ();
7917
 
7918
                      if (tls_set == 0)
7919
                        {
7920
                          /* We managed to get rid of a got entry.  */
7921
                          if (ent->got.refcount > 0)
7922
                            ent->got.refcount -= 1;
7923
                        }
7924
                    }
7925
                  else
7926
                    {
7927
                      /* If we got rid of a DTPMOD/DTPREL reloc pair then
7928
                         we'll lose one or two dyn relocs.  */
7929
                      if (!dec_dynrel_count (rel->r_info, sec, info,
7930
                                             NULL, h, sym_sec))
7931
                        return FALSE;
7932
 
7933
                      if (tls_set == (TLS_EXPLICIT | TLS_GD))
7934
                        {
7935
                          if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
7936
                                                 NULL, h, sym_sec))
7937
                            return FALSE;
7938
                        }
7939
                    }
7940
 
7941
                  *tls_mask |= tls_set;
7942
                  *tls_mask &= ~tls_clear;
7943
                }
7944
 
7945
              if (elf_section_data (sec)->relocs != relstart)
7946
                free (relstart);
7947
            }
7948
 
7949
        if (locsyms != NULL
7950
            && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
7951
          {
7952
            if (!info->keep_memory)
7953
              free (locsyms);
7954
            else
7955
              elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
7956
          }
7957
      }
7958
 
7959
  if (toc_ref != NULL)
7960
    free (toc_ref);
7961
  return TRUE;
7962
}
7963
 
7964
/* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
7965
   the values of any global symbols in a toc section that has been
7966
   edited.  Globals in toc sections should be a rarity, so this function
7967
   sets a flag if any are found in toc sections other than the one just
7968
   edited, so that futher hash table traversals can be avoided.  */
7969
 
7970
struct adjust_toc_info
7971
{
7972
  asection *toc;
7973
  unsigned long *skip;
7974
  bfd_boolean global_toc_syms;
7975
};
7976
 
7977
enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 };
7978
 
7979
static bfd_boolean
7980
adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
7981
{
7982
  struct ppc_link_hash_entry *eh;
7983
  struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
7984
  unsigned long i;
7985
 
7986
  if (h->root.type != bfd_link_hash_defined
7987
      && h->root.type != bfd_link_hash_defweak)
7988
    return TRUE;
7989
 
7990
  eh = (struct ppc_link_hash_entry *) h;
7991
  if (eh->adjust_done)
7992
    return TRUE;
7993
 
7994
  if (eh->elf.root.u.def.section == toc_inf->toc)
7995
    {
7996
      if (eh->elf.root.u.def.value > toc_inf->toc->rawsize)
7997
        i = toc_inf->toc->rawsize >> 3;
7998
      else
7999
        i = eh->elf.root.u.def.value >> 3;
8000
 
8001
      if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0)
8002
        {
8003
          (*_bfd_error_handler)
8004
            (_("%s defined on removed toc entry"), eh->elf.root.root.string);
8005
          do
8006
            ++i;
8007
          while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0);
8008
          eh->elf.root.u.def.value = (bfd_vma) i << 3;
8009
        }
8010
 
8011
      eh->elf.root.u.def.value -= toc_inf->skip[i];
8012
      eh->adjust_done = 1;
8013
    }
8014
  else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
8015
    toc_inf->global_toc_syms = TRUE;
8016
 
8017
  return TRUE;
8018
}
8019
 
8020 163 khays
/* Return TRUE iff INSN is one we expect on a _LO variety toc/got reloc.  */
8021
 
8022
static bfd_boolean
8023
ok_lo_toc_insn (unsigned int insn)
8024
{
8025
  return ((insn & (0x3f << 26)) == 14u << 26 /* addi */
8026
          || (insn & (0x3f << 26)) == 32u << 26 /* lwz */
8027
          || (insn & (0x3f << 26)) == 34u << 26 /* lbz */
8028
          || (insn & (0x3f << 26)) == 36u << 26 /* stw */
8029
          || (insn & (0x3f << 26)) == 38u << 26 /* stb */
8030
          || (insn & (0x3f << 26)) == 40u << 26 /* lhz */
8031
          || (insn & (0x3f << 26)) == 42u << 26 /* lha */
8032
          || (insn & (0x3f << 26)) == 44u << 26 /* sth */
8033
          || (insn & (0x3f << 26)) == 46u << 26 /* lmw */
8034
          || (insn & (0x3f << 26)) == 47u << 26 /* stmw */
8035
          || (insn & (0x3f << 26)) == 48u << 26 /* lfs */
8036
          || (insn & (0x3f << 26)) == 50u << 26 /* lfd */
8037
          || (insn & (0x3f << 26)) == 52u << 26 /* stfs */
8038
          || (insn & (0x3f << 26)) == 54u << 26 /* stfd */
8039
          || ((insn & (0x3f << 26)) == 58u << 26 /* lwa,ld,lmd */
8040
              && (insn & 3) != 1)
8041
          || ((insn & (0x3f << 26)) == 62u << 26 /* std, stmd */
8042
              && ((insn & 3) == 0 || (insn & 3) == 3))
8043
          || (insn & (0x3f << 26)) == 12u << 26 /* addic */);
8044
}
8045
 
8046 14 khays
/* Examine all relocs referencing .toc sections in order to remove
8047
   unused .toc entries.  */
8048
 
8049
bfd_boolean
8050
ppc64_elf_edit_toc (struct bfd_link_info *info)
8051
{
8052
  bfd *ibfd;
8053
  struct adjust_toc_info toc_inf;
8054
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
8055
 
8056
  htab->do_toc_opt = 1;
8057
  toc_inf.global_toc_syms = TRUE;
8058
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
8059
    {
8060
      asection *toc, *sec;
8061
      Elf_Internal_Shdr *symtab_hdr;
8062
      Elf_Internal_Sym *local_syms;
8063
      Elf_Internal_Rela *relstart, *rel, *toc_relocs;
8064
      unsigned long *skip, *drop;
8065
      unsigned char *used;
8066
      unsigned char *keep, last, some_unused;
8067
 
8068
      if (!is_ppc64_elf (ibfd))
8069
        continue;
8070
 
8071
      toc = bfd_get_section_by_name (ibfd, ".toc");
8072
      if (toc == NULL
8073
          || toc->size == 0
8074
          || toc->sec_info_type == ELF_INFO_TYPE_JUST_SYMS
8075
          || elf_discarded_section (toc))
8076
        continue;
8077
 
8078
      toc_relocs = NULL;
8079
      local_syms = NULL;
8080
      symtab_hdr = &elf_symtab_hdr (ibfd);
8081
 
8082
      /* Look at sections dropped from the final link.  */
8083
      skip = NULL;
8084
      relstart = NULL;
8085
      for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8086
        {
8087
          if (sec->reloc_count == 0
8088
              || !elf_discarded_section (sec)
8089
              || get_opd_info (sec)
8090
              || (sec->flags & SEC_ALLOC) == 0
8091
              || (sec->flags & SEC_DEBUGGING) != 0)
8092
            continue;
8093
 
8094
          relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
8095
          if (relstart == NULL)
8096
            goto error_ret;
8097
 
8098
          /* Run through the relocs to see which toc entries might be
8099
             unused.  */
8100
          for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8101
            {
8102
              enum elf_ppc64_reloc_type r_type;
8103
              unsigned long r_symndx;
8104
              asection *sym_sec;
8105
              struct elf_link_hash_entry *h;
8106
              Elf_Internal_Sym *sym;
8107
              bfd_vma val;
8108
 
8109
              r_type = ELF64_R_TYPE (rel->r_info);
8110
              switch (r_type)
8111
                {
8112
                default:
8113
                  continue;
8114
 
8115
                case R_PPC64_TOC16:
8116
                case R_PPC64_TOC16_LO:
8117
                case R_PPC64_TOC16_HI:
8118
                case R_PPC64_TOC16_HA:
8119
                case R_PPC64_TOC16_DS:
8120
                case R_PPC64_TOC16_LO_DS:
8121
                  break;
8122
                }
8123
 
8124
              r_symndx = ELF64_R_SYM (rel->r_info);
8125
              if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8126
                              r_symndx, ibfd))
8127
                goto error_ret;
8128
 
8129
              if (sym_sec != toc)
8130
                continue;
8131
 
8132
              if (h != NULL)
8133
                val = h->root.u.def.value;
8134
              else
8135
                val = sym->st_value;
8136
              val += rel->r_addend;
8137
 
8138
              if (val >= toc->size)
8139
                continue;
8140
 
8141
              /* Anything in the toc ought to be aligned to 8 bytes.
8142
                 If not, don't mark as unused.  */
8143
              if (val & 7)
8144
                continue;
8145
 
8146
              if (skip == NULL)
8147
                {
8148
                  skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8149
                  if (skip == NULL)
8150
                    goto error_ret;
8151
                }
8152
 
8153
              skip[val >> 3] = ref_from_discarded;
8154
            }
8155
 
8156
          if (elf_section_data (sec)->relocs != relstart)
8157
            free (relstart);
8158
        }
8159
 
8160
      /* For largetoc loads of address constants, we can convert
8161
         .  addis rx,2,addr@got@ha
8162
         .  ld ry,addr@got@l(rx)
8163
         to
8164
         .  addis rx,2,addr@toc@ha
8165
         .  addi ry,rx,addr@toc@l
8166
         when addr is within 2G of the toc pointer.  This then means
8167
         that the word storing "addr" in the toc is no longer needed.  */
8168
 
8169
      if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc
8170
          && toc->output_section->rawsize < (bfd_vma) 1 << 31
8171
          && toc->reloc_count != 0)
8172
        {
8173
          /* Read toc relocs.  */
8174
          toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
8175
                                                  info->keep_memory);
8176
          if (toc_relocs == NULL)
8177
            goto error_ret;
8178
 
8179
          for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
8180
            {
8181
              enum elf_ppc64_reloc_type r_type;
8182
              unsigned long r_symndx;
8183
              asection *sym_sec;
8184
              struct elf_link_hash_entry *h;
8185
              Elf_Internal_Sym *sym;
8186
              bfd_vma val, addr;
8187
 
8188
              r_type = ELF64_R_TYPE (rel->r_info);
8189
              if (r_type != R_PPC64_ADDR64)
8190
                continue;
8191
 
8192
              r_symndx = ELF64_R_SYM (rel->r_info);
8193
              if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8194
                              r_symndx, ibfd))
8195
                goto error_ret;
8196
 
8197
              if (sym_sec == NULL
8198
                  || elf_discarded_section (sym_sec))
8199
                continue;
8200
 
8201
              if (!SYMBOL_CALLS_LOCAL (info, h))
8202
                continue;
8203
 
8204
              if (h != NULL)
8205
                {
8206
                  if (h->type == STT_GNU_IFUNC)
8207
                    continue;
8208
                  val = h->root.u.def.value;
8209
                }
8210
              else
8211
                {
8212
                  if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
8213
                    continue;
8214
                  val = sym->st_value;
8215
                }
8216
              val += rel->r_addend;
8217
              val += sym_sec->output_section->vma + sym_sec->output_offset;
8218
 
8219
              /* We don't yet know the exact toc pointer value, but we
8220
                 know it will be somewhere in the toc section.  Don't
8221
                 optimize if the difference from any possible toc
8222
                 pointer is outside [ff..f80008000, 7fff7fff].  */
8223
              addr = toc->output_section->vma + TOC_BASE_OFF;
8224
              if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8225
                continue;
8226
 
8227
              addr = toc->output_section->vma + toc->output_section->rawsize;
8228
              if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8229
                continue;
8230
 
8231
              if (skip == NULL)
8232
                {
8233
                  skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8234
                  if (skip == NULL)
8235
                    goto error_ret;
8236
                }
8237
 
8238
              skip[rel->r_offset >> 3]
8239
                |= can_optimize | ((rel - toc_relocs) << 2);
8240
            }
8241
        }
8242
 
8243
      if (skip == NULL)
8244
        continue;
8245
 
8246
      used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
8247
      if (used == NULL)
8248
        {
8249
        error_ret:
8250
          if (local_syms != NULL
8251
              && symtab_hdr->contents != (unsigned char *) local_syms)
8252
            free (local_syms);
8253
          if (sec != NULL
8254
              && relstart != NULL
8255
              && elf_section_data (sec)->relocs != relstart)
8256
            free (relstart);
8257
          if (toc_relocs != NULL
8258
              && elf_section_data (toc)->relocs != toc_relocs)
8259
            free (toc_relocs);
8260
          if (skip != NULL)
8261
            free (skip);
8262
          return FALSE;
8263
        }
8264
 
8265
      /* Now check all kept sections that might reference the toc.
8266
         Check the toc itself last.  */
8267
      for (sec = (ibfd->sections == toc && toc->next ? toc->next
8268
                  : ibfd->sections);
8269
           sec != NULL;
8270
           sec = (sec == toc ? NULL
8271
                  : sec->next == NULL ? toc
8272
                  : sec->next == toc && toc->next ? toc->next
8273
                  : sec->next))
8274
        {
8275
          int repeat;
8276
 
8277
          if (sec->reloc_count == 0
8278
              || elf_discarded_section (sec)
8279
              || get_opd_info (sec)
8280
              || (sec->flags & SEC_ALLOC) == 0
8281
              || (sec->flags & SEC_DEBUGGING) != 0)
8282
            continue;
8283
 
8284
          relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8285
                                                info->keep_memory);
8286
          if (relstart == NULL)
8287
            goto error_ret;
8288
 
8289
          /* Mark toc entries referenced as used.  */
8290
          repeat = 0;
8291
          do
8292
            for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8293
              {
8294
                enum elf_ppc64_reloc_type r_type;
8295
                unsigned long r_symndx;
8296
                asection *sym_sec;
8297
                struct elf_link_hash_entry *h;
8298
                Elf_Internal_Sym *sym;
8299
                bfd_vma val;
8300 163 khays
                enum {no_check, check_lo, check_ha} insn_check;
8301 14 khays
 
8302
                r_type = ELF64_R_TYPE (rel->r_info);
8303
                switch (r_type)
8304
                  {
8305 163 khays
                  default:
8306
                    insn_check = no_check;
8307
                    break;
8308
 
8309
                  case R_PPC64_GOT_TLSLD16_HA:
8310
                  case R_PPC64_GOT_TLSGD16_HA:
8311
                  case R_PPC64_GOT_TPREL16_HA:
8312
                  case R_PPC64_GOT_DTPREL16_HA:
8313
                  case R_PPC64_GOT16_HA:
8314
                  case R_PPC64_TOC16_HA:
8315
                    insn_check = check_ha;
8316
                    break;
8317
 
8318
                  case R_PPC64_GOT_TLSLD16_LO:
8319
                  case R_PPC64_GOT_TLSGD16_LO:
8320
                  case R_PPC64_GOT_TPREL16_LO_DS:
8321
                  case R_PPC64_GOT_DTPREL16_LO_DS:
8322
                  case R_PPC64_GOT16_LO:
8323
                  case R_PPC64_GOT16_LO_DS:
8324
                  case R_PPC64_TOC16_LO:
8325
                  case R_PPC64_TOC16_LO_DS:
8326
                    insn_check = check_lo;
8327
                    break;
8328
                  }
8329
 
8330
                if (insn_check != no_check)
8331
                  {
8332
                    bfd_vma off = rel->r_offset & ~3;
8333
                    unsigned char buf[4];
8334
                    unsigned int insn;
8335
 
8336
                    if (!bfd_get_section_contents (ibfd, sec, buf, off, 4))
8337
                      {
8338
                        free (used);
8339
                        goto error_ret;
8340
                      }
8341
                    insn = bfd_get_32 (ibfd, buf);
8342
                    if (insn_check == check_lo
8343
                        ? !ok_lo_toc_insn (insn)
8344
                        : ((insn & ((0x3f << 26) | 0x1f << 16))
8345
                           != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
8346
                      {
8347
                        char str[12];
8348
 
8349
                        ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1;
8350
                        sprintf (str, "%#08x", insn);
8351
                        info->callbacks->einfo
8352
                          (_("%P: %H: toc optimization is not supported for"
8353
                             " %s instruction.\n"),
8354
                           ibfd, sec, rel->r_offset & ~3, str);
8355
                      }
8356
                  }
8357
 
8358
                switch (r_type)
8359
                  {
8360 14 khays
                  case R_PPC64_TOC16:
8361
                  case R_PPC64_TOC16_LO:
8362
                  case R_PPC64_TOC16_HI:
8363
                  case R_PPC64_TOC16_HA:
8364
                  case R_PPC64_TOC16_DS:
8365
                  case R_PPC64_TOC16_LO_DS:
8366
                    /* In case we're taking addresses of toc entries.  */
8367
                  case R_PPC64_ADDR64:
8368
                    break;
8369
 
8370
                  default:
8371
                    continue;
8372
                  }
8373
 
8374
                r_symndx = ELF64_R_SYM (rel->r_info);
8375
                if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8376
                                r_symndx, ibfd))
8377
                  {
8378
                    free (used);
8379
                    goto error_ret;
8380
                  }
8381
 
8382
                if (sym_sec != toc)
8383
                  continue;
8384
 
8385
                if (h != NULL)
8386
                  val = h->root.u.def.value;
8387
                else
8388
                  val = sym->st_value;
8389
                val += rel->r_addend;
8390
 
8391
                if (val >= toc->size)
8392
                  continue;
8393
 
8394
                if ((skip[val >> 3] & can_optimize) != 0)
8395
                  {
8396
                    bfd_vma off;
8397
                    unsigned char opc;
8398
 
8399
                    switch (r_type)
8400
                      {
8401
                      case R_PPC64_TOC16_HA:
8402
                        break;
8403
 
8404
                      case R_PPC64_TOC16_LO_DS:
8405
                        off = rel->r_offset + (bfd_big_endian (ibfd) ? -2 : 3);
8406
                        if (!bfd_get_section_contents (ibfd, sec, &opc, off, 1))
8407 163 khays
                          {
8408
                            free (used);
8409
                            goto error_ret;
8410
                          }
8411 14 khays
                        if ((opc & (0x3f << 2)) == (58u << 2))
8412
                          break;
8413
                        /* Fall thru */
8414
 
8415
                      default:
8416
                        /* Wrong sort of reloc, or not a ld.  We may
8417
                           as well clear ref_from_discarded too.  */
8418
                        skip[val >> 3] = 0;
8419
                      }
8420
                  }
8421
 
8422
                /* For the toc section, we only mark as used if
8423
                   this entry itself isn't unused.  */
8424
                if (sec == toc
8425
                    && !used[val >> 3]
8426
                    && (used[rel->r_offset >> 3]
8427
                        || !(skip[rel->r_offset >> 3] & ref_from_discarded)))
8428
                  /* Do all the relocs again, to catch reference
8429
                     chains.  */
8430
                  repeat = 1;
8431
 
8432
                used[val >> 3] = 1;
8433
              }
8434
          while (repeat);
8435
 
8436
          if (elf_section_data (sec)->relocs != relstart)
8437
            free (relstart);
8438
        }
8439
 
8440
      /* Merge the used and skip arrays.  Assume that TOC
8441
         doublewords not appearing as either used or unused belong
8442
         to to an entry more than one doubleword in size.  */
8443
      for (drop = skip, keep = used, last = 0, some_unused = 0;
8444
           drop < skip + (toc->size + 7) / 8;
8445
           ++drop, ++keep)
8446
        {
8447
          if (*keep)
8448
            {
8449
              *drop &= ~ref_from_discarded;
8450
              if ((*drop & can_optimize) != 0)
8451
                some_unused = 1;
8452
              last = 0;
8453
            }
8454 163 khays
          else if ((*drop & ref_from_discarded) != 0)
8455 14 khays
            {
8456
              some_unused = 1;
8457
              last = ref_from_discarded;
8458
            }
8459
          else
8460
            *drop = last;
8461
        }
8462
 
8463
      free (used);
8464
 
8465
      if (some_unused)
8466
        {
8467
          bfd_byte *contents, *src;
8468
          unsigned long off;
8469
          Elf_Internal_Sym *sym;
8470
          bfd_boolean local_toc_syms = FALSE;
8471
 
8472
          /* Shuffle the toc contents, and at the same time convert the
8473
             skip array from booleans into offsets.  */
8474
          if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
8475
            goto error_ret;
8476
 
8477
          elf_section_data (toc)->this_hdr.contents = contents;
8478
 
8479
          for (src = contents, off = 0, drop = skip;
8480
               src < contents + toc->size;
8481
               src += 8, ++drop)
8482
            {
8483
              if ((*drop & (can_optimize | ref_from_discarded)) != 0)
8484
                off += 8;
8485
              else if (off != 0)
8486
                {
8487
                  *drop = off;
8488
                  memcpy (src - off, src, 8);
8489
                }
8490
            }
8491
          *drop = off;
8492
          toc->rawsize = toc->size;
8493
          toc->size = src - contents - off;
8494
 
8495
          /* Adjust addends for relocs against the toc section sym,
8496
             and optimize any accesses we can.  */
8497
          for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8498
            {
8499
              if (sec->reloc_count == 0
8500
                  || elf_discarded_section (sec))
8501
                continue;
8502
 
8503
              relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8504
                                                    info->keep_memory);
8505
              if (relstart == NULL)
8506
                goto error_ret;
8507
 
8508
              for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8509
                {
8510
                  enum elf_ppc64_reloc_type r_type;
8511
                  unsigned long r_symndx;
8512
                  asection *sym_sec;
8513
                  struct elf_link_hash_entry *h;
8514
                  bfd_vma val;
8515
 
8516
                  r_type = ELF64_R_TYPE (rel->r_info);
8517
                  switch (r_type)
8518
                    {
8519
                    default:
8520
                      continue;
8521
 
8522
                    case R_PPC64_TOC16:
8523
                    case R_PPC64_TOC16_LO:
8524
                    case R_PPC64_TOC16_HI:
8525
                    case R_PPC64_TOC16_HA:
8526
                    case R_PPC64_TOC16_DS:
8527
                    case R_PPC64_TOC16_LO_DS:
8528
                    case R_PPC64_ADDR64:
8529
                      break;
8530
                    }
8531
 
8532
                  r_symndx = ELF64_R_SYM (rel->r_info);
8533
                  if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8534
                                  r_symndx, ibfd))
8535
                    goto error_ret;
8536
 
8537
                  if (sym_sec != toc)
8538
                    continue;
8539
 
8540
                  if (h != NULL)
8541
                    val = h->root.u.def.value;
8542
                  else
8543
                    {
8544
                      val = sym->st_value;
8545
                      if (val != 0)
8546
                        local_toc_syms = TRUE;
8547
                    }
8548
 
8549
                  val += rel->r_addend;
8550
 
8551
                  if (val > toc->rawsize)
8552
                    val = toc->rawsize;
8553
                  else if ((skip[val >> 3] & ref_from_discarded) != 0)
8554
                    continue;
8555
                  else if ((skip[val >> 3] & can_optimize) != 0)
8556
                    {
8557
                      Elf_Internal_Rela *tocrel
8558
                        = toc_relocs + (skip[val >> 3] >> 2);
8559
                      unsigned long tsym = ELF64_R_SYM (tocrel->r_info);
8560
 
8561
                      switch (r_type)
8562
                        {
8563
                        case R_PPC64_TOC16_HA:
8564
                          rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA);
8565
                          break;
8566
 
8567
                        case R_PPC64_TOC16_LO_DS:
8568
                          rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT);
8569
                          break;
8570
 
8571
                        default:
8572 163 khays
                          if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
8573
                            ppc_howto_init ();
8574
                          info->callbacks->einfo
8575
                            (_("%P: %H: %s relocation references "
8576
                               "optimized away TOC entry\n"),
8577
                             ibfd, sec, rel->r_offset,
8578
                             ppc64_elf_howto_table[r_type]->name);
8579
                          bfd_set_error (bfd_error_bad_value);
8580
                          goto error_ret;
8581 14 khays
                        }
8582
                      rel->r_addend = tocrel->r_addend;
8583
                      elf_section_data (sec)->relocs = relstart;
8584
                      continue;
8585
                    }
8586
 
8587
                  if (h != NULL || sym->st_value != 0)
8588
                    continue;
8589
 
8590
                  rel->r_addend -= skip[val >> 3];
8591
                  elf_section_data (sec)->relocs = relstart;
8592
                }
8593
 
8594
              if (elf_section_data (sec)->relocs != relstart)
8595
                free (relstart);
8596
            }
8597
 
8598
          /* We shouldn't have local or global symbols defined in the TOC,
8599
             but handle them anyway.  */
8600
          if (local_syms != NULL)
8601
            for (sym = local_syms;
8602
                 sym < local_syms + symtab_hdr->sh_info;
8603
                 ++sym)
8604
              if (sym->st_value != 0
8605
                  && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
8606
                {
8607
                  unsigned long i;
8608
 
8609
                  if (sym->st_value > toc->rawsize)
8610
                    i = toc->rawsize >> 3;
8611
                  else
8612
                    i = sym->st_value >> 3;
8613
 
8614
                  if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
8615
                    {
8616
                      if (local_toc_syms)
8617
                        (*_bfd_error_handler)
8618
                          (_("%s defined on removed toc entry"),
8619
                           bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
8620
                      do
8621
                        ++i;
8622
                      while ((skip[i] & (ref_from_discarded | can_optimize)));
8623
                      sym->st_value = (bfd_vma) i << 3;
8624
                    }
8625
 
8626
                  sym->st_value -= skip[i];
8627
                  symtab_hdr->contents = (unsigned char *) local_syms;
8628
                }
8629
 
8630
          /* Adjust any global syms defined in this toc input section.  */
8631
          if (toc_inf.global_toc_syms)
8632
            {
8633
              toc_inf.toc = toc;
8634
              toc_inf.skip = skip;
8635
              toc_inf.global_toc_syms = FALSE;
8636
              elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
8637
                                      &toc_inf);
8638
            }
8639
 
8640
          if (toc->reloc_count != 0)
8641
            {
8642
              Elf_Internal_Shdr *rel_hdr;
8643
              Elf_Internal_Rela *wrel;
8644
              bfd_size_type sz;
8645
 
8646
              /* Remove unused toc relocs, and adjust those we keep.  */
8647
              if (toc_relocs == NULL)
8648
                toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
8649
                                                        info->keep_memory);
8650
              if (toc_relocs == NULL)
8651
                goto error_ret;
8652
 
8653
              wrel = toc_relocs;
8654
              for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
8655
                if ((skip[rel->r_offset >> 3]
8656
                     & (ref_from_discarded | can_optimize)) == 0)
8657
                  {
8658
                    wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
8659
                    wrel->r_info = rel->r_info;
8660
                    wrel->r_addend = rel->r_addend;
8661
                    ++wrel;
8662
                  }
8663
                else if (!dec_dynrel_count (rel->r_info, toc, info,
8664
                                            &local_syms, NULL, NULL))
8665
                  goto error_ret;
8666
 
8667
              elf_section_data (toc)->relocs = toc_relocs;
8668
              toc->reloc_count = wrel - toc_relocs;
8669
              rel_hdr = _bfd_elf_single_rel_hdr (toc);
8670
              sz = rel_hdr->sh_entsize;
8671
              rel_hdr->sh_size = toc->reloc_count * sz;
8672
            }
8673
        }
8674
      else if (toc_relocs != NULL
8675
               && elf_section_data (toc)->relocs != toc_relocs)
8676
        free (toc_relocs);
8677
 
8678
      if (local_syms != NULL
8679
          && symtab_hdr->contents != (unsigned char *) local_syms)
8680
        {
8681
          if (!info->keep_memory)
8682
            free (local_syms);
8683
          else
8684
            symtab_hdr->contents = (unsigned char *) local_syms;
8685
        }
8686
      free (skip);
8687
    }
8688
 
8689
  return TRUE;
8690
}
8691
 
8692
/* Return true iff input section I references the TOC using
8693
   instructions limited to +/-32k offsets.  */
8694
 
8695
bfd_boolean
8696
ppc64_elf_has_small_toc_reloc (asection *i)
8697
{
8698
  return (is_ppc64_elf (i->owner)
8699
          && ppc64_elf_tdata (i->owner)->has_small_toc_reloc);
8700
}
8701
 
8702
/* Allocate space for one GOT entry.  */
8703
 
8704
static void
8705
allocate_got (struct elf_link_hash_entry *h,
8706
              struct bfd_link_info *info,
8707
              struct got_entry *gent)
8708
{
8709
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
8710
  bfd_boolean dyn;
8711
  struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
8712
  int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)
8713
                 ? 16 : 8);
8714
  int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD
8715
                  ? 2 : 1) * sizeof (Elf64_External_Rela);
8716
  asection *got = ppc64_elf_tdata (gent->owner)->got;
8717
 
8718
  gent->got.offset = got->size;
8719
  got->size += entsize;
8720
 
8721
  dyn = htab->elf.dynamic_sections_created;
8722
  if ((info->shared
8723
       || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
8724
            && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
8725
                || h->root.type != bfd_link_hash_undefweak))
8726
    {
8727
      asection *relgot = ppc64_elf_tdata (gent->owner)->relgot;
8728
      relgot->size += rentsize;
8729
    }
8730
  else if (h->type == STT_GNU_IFUNC)
8731
    {
8732
      asection *relgot = htab->reliplt;
8733
      relgot->size += rentsize;
8734
      htab->got_reli_size += rentsize;
8735
    }
8736
}
8737
 
8738
/* This function merges got entries in the same toc group.  */
8739
 
8740
static void
8741
merge_got_entries (struct got_entry **pent)
8742
{
8743
  struct got_entry *ent, *ent2;
8744
 
8745
  for (ent = *pent; ent != NULL; ent = ent->next)
8746
    if (!ent->is_indirect)
8747
      for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next)
8748
        if (!ent2->is_indirect
8749
            && ent2->addend == ent->addend
8750
            && ent2->tls_type == ent->tls_type
8751
            && elf_gp (ent2->owner) == elf_gp (ent->owner))
8752
          {
8753
            ent2->is_indirect = TRUE;
8754
            ent2->got.ent = ent;
8755
          }
8756
}
8757
 
8758
/* Allocate space in .plt, .got and associated reloc sections for
8759
   dynamic relocs.  */
8760
 
8761
static bfd_boolean
8762
allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
8763
{
8764
  struct bfd_link_info *info;
8765
  struct ppc_link_hash_table *htab;
8766
  asection *s;
8767
  struct ppc_link_hash_entry *eh;
8768
  struct elf_dyn_relocs *p;
8769
  struct got_entry **pgent, *gent;
8770
 
8771
  if (h->root.type == bfd_link_hash_indirect)
8772
    return TRUE;
8773
 
8774
  info = (struct bfd_link_info *) inf;
8775
  htab = ppc_hash_table (info);
8776
  if (htab == NULL)
8777
    return FALSE;
8778
 
8779
  if ((htab->elf.dynamic_sections_created
8780
       && h->dynindx != -1
8781
       && WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
8782
      || h->type == STT_GNU_IFUNC)
8783
    {
8784
      struct plt_entry *pent;
8785
      bfd_boolean doneone = FALSE;
8786
      for (pent = h->plt.plist; pent != NULL; pent = pent->next)
8787
        if (pent->plt.refcount > 0)
8788
          {
8789
            if (!htab->elf.dynamic_sections_created
8790
                || h->dynindx == -1)
8791
              {
8792
                s = htab->iplt;
8793
                pent->plt.offset = s->size;
8794
                s->size += PLT_ENTRY_SIZE;
8795
                s = htab->reliplt;
8796
              }
8797
            else
8798
              {
8799
                /* If this is the first .plt entry, make room for the special
8800
                   first entry.  */
8801
                s = htab->plt;
8802
                if (s->size == 0)
8803
                  s->size += PLT_INITIAL_ENTRY_SIZE;
8804
 
8805
                pent->plt.offset = s->size;
8806
 
8807
                /* Make room for this entry.  */
8808
                s->size += PLT_ENTRY_SIZE;
8809
 
8810
                /* Make room for the .glink code.  */
8811
                s = htab->glink;
8812
                if (s->size == 0)
8813
                  s->size += GLINK_CALL_STUB_SIZE;
8814
                /* We need bigger stubs past index 32767.  */
8815
                if (s->size >= GLINK_CALL_STUB_SIZE + 32768*2*4)
8816
                  s->size += 4;
8817
                s->size += 2*4;
8818
 
8819
                /* We also need to make an entry in the .rela.plt section.  */
8820
                s = htab->relplt;
8821
              }
8822
            s->size += sizeof (Elf64_External_Rela);
8823
            doneone = TRUE;
8824
          }
8825
        else
8826
          pent->plt.offset = (bfd_vma) -1;
8827
      if (!doneone)
8828
        {
8829
          h->plt.plist = NULL;
8830
          h->needs_plt = 0;
8831
        }
8832
    }
8833
  else
8834
    {
8835
      h->plt.plist = NULL;
8836
      h->needs_plt = 0;
8837
    }
8838
 
8839
  eh = (struct ppc_link_hash_entry *) h;
8840
  /* Run through the TLS GD got entries first if we're changing them
8841
     to TPREL.  */
8842
  if ((eh->tls_mask & TLS_TPRELGD) != 0)
8843
    for (gent = h->got.glist; gent != NULL; gent = gent->next)
8844
      if (gent->got.refcount > 0
8845
          && (gent->tls_type & TLS_GD) != 0)
8846
        {
8847
          /* This was a GD entry that has been converted to TPREL.  If
8848
             there happens to be a TPREL entry we can use that one.  */
8849
          struct got_entry *ent;
8850
          for (ent = h->got.glist; ent != NULL; ent = ent->next)
8851
            if (ent->got.refcount > 0
8852
                && (ent->tls_type & TLS_TPREL) != 0
8853
                && ent->addend == gent->addend
8854
                && ent->owner == gent->owner)
8855
              {
8856
                gent->got.refcount = 0;
8857
                break;
8858
              }
8859
 
8860
          /* If not, then we'll be using our own TPREL entry.  */
8861
          if (gent->got.refcount != 0)
8862
            gent->tls_type = TLS_TLS | TLS_TPREL;
8863
        }
8864
 
8865
  /* Remove any list entry that won't generate a word in the GOT before
8866
     we call merge_got_entries.  Otherwise we risk merging to empty
8867
     entries.  */
8868
  pgent = &h->got.glist;
8869
  while ((gent = *pgent) != NULL)
8870
    if (gent->got.refcount > 0)
8871
      {
8872
        if ((gent->tls_type & TLS_LD) != 0
8873
            && !h->def_dynamic)
8874
          {
8875
            ppc64_tlsld_got (gent->owner)->got.refcount += 1;
8876
            *pgent = gent->next;
8877
          }
8878
        else
8879
          pgent = &gent->next;
8880
      }
8881
    else
8882
      *pgent = gent->next;
8883
 
8884
  if (!htab->do_multi_toc)
8885
    merge_got_entries (&h->got.glist);
8886
 
8887
  for (gent = h->got.glist; gent != NULL; gent = gent->next)
8888
    if (!gent->is_indirect)
8889
      {
8890
        /* Make sure this symbol is output as a dynamic symbol.
8891
           Undefined weak syms won't yet be marked as dynamic,
8892
           nor will all TLS symbols.  */
8893
        if (h->dynindx == -1
8894
            && !h->forced_local
8895
            && h->type != STT_GNU_IFUNC
8896
            && htab->elf.dynamic_sections_created)
8897
          {
8898
            if (! bfd_elf_link_record_dynamic_symbol (info, h))
8899
              return FALSE;
8900
          }
8901
 
8902
        if (!is_ppc64_elf (gent->owner))
8903
          abort ();
8904
 
8905
        allocate_got (h, info, gent);
8906
      }
8907
 
8908
  if (eh->dyn_relocs == NULL
8909
      || (!htab->elf.dynamic_sections_created
8910
          && h->type != STT_GNU_IFUNC))
8911
    return TRUE;
8912
 
8913
  /* In the shared -Bsymbolic case, discard space allocated for
8914
     dynamic pc-relative relocs against symbols which turn out to be
8915
     defined in regular objects.  For the normal shared case, discard
8916
     space for relocs that have become local due to symbol visibility
8917
     changes.  */
8918
 
8919
  if (info->shared)
8920
    {
8921
      /* Relocs that use pc_count are those that appear on a call insn,
8922
         or certain REL relocs (see must_be_dyn_reloc) that can be
8923
         generated via assembly.  We want calls to protected symbols to
8924
         resolve directly to the function rather than going via the plt.
8925
         If people want function pointer comparisons to work as expected
8926
         then they should avoid writing weird assembly.  */
8927
      if (SYMBOL_CALLS_LOCAL (info, h))
8928
        {
8929
          struct elf_dyn_relocs **pp;
8930
 
8931
          for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
8932
            {
8933
              p->count -= p->pc_count;
8934
              p->pc_count = 0;
8935
              if (p->count == 0)
8936
                *pp = p->next;
8937
              else
8938
                pp = &p->next;
8939
            }
8940
        }
8941
 
8942
      /* Also discard relocs on undefined weak syms with non-default
8943
         visibility.  */
8944
      if (eh->dyn_relocs != NULL
8945
          && h->root.type == bfd_link_hash_undefweak)
8946
        {
8947
          if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
8948
            eh->dyn_relocs = NULL;
8949
 
8950
          /* Make sure this symbol is output as a dynamic symbol.
8951
             Undefined weak syms won't yet be marked as dynamic.  */
8952
          else if (h->dynindx == -1
8953
                   && !h->forced_local)
8954
            {
8955
              if (! bfd_elf_link_record_dynamic_symbol (info, h))
8956
                return FALSE;
8957
            }
8958
        }
8959
    }
8960
  else if (h->type == STT_GNU_IFUNC)
8961
    {
8962
      if (!h->non_got_ref)
8963
        eh->dyn_relocs = NULL;
8964
    }
8965
  else if (ELIMINATE_COPY_RELOCS)
8966
    {
8967
      /* For the non-shared case, discard space for relocs against
8968
         symbols which turn out to need copy relocs or are not
8969
         dynamic.  */
8970
 
8971
      if (!h->non_got_ref
8972
          && !h->def_regular)
8973
        {
8974
          /* Make sure this symbol is output as a dynamic symbol.
8975
             Undefined weak syms won't yet be marked as dynamic.  */
8976
          if (h->dynindx == -1
8977
              && !h->forced_local)
8978
            {
8979
              if (! bfd_elf_link_record_dynamic_symbol (info, h))
8980
                return FALSE;
8981
            }
8982
 
8983
          /* If that succeeded, we know we'll be keeping all the
8984
             relocs.  */
8985
          if (h->dynindx != -1)
8986
            goto keep;
8987
        }
8988
 
8989
      eh->dyn_relocs = NULL;
8990
 
8991
    keep: ;
8992
    }
8993
 
8994
  /* Finally, allocate space.  */
8995
  for (p = eh->dyn_relocs; p != NULL; p = p->next)
8996
    {
8997
      asection *sreloc = elf_section_data (p->sec)->sreloc;
8998
      if (!htab->elf.dynamic_sections_created)
8999
        sreloc = htab->reliplt;
9000
      sreloc->size += p->count * sizeof (Elf64_External_Rela);
9001
    }
9002
 
9003
  return TRUE;
9004
}
9005
 
9006
/* Find any dynamic relocs that apply to read-only sections.  */
9007
 
9008
static bfd_boolean
9009
readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
9010
{
9011
  struct ppc_link_hash_entry *eh;
9012
  struct elf_dyn_relocs *p;
9013
 
9014
  eh = (struct ppc_link_hash_entry *) h;
9015
  for (p = eh->dyn_relocs; p != NULL; p = p->next)
9016
    {
9017
      asection *s = p->sec->output_section;
9018
 
9019
      if (s != NULL && (s->flags & SEC_READONLY) != 0)
9020
        {
9021
          struct bfd_link_info *info = inf;
9022
 
9023
          info->flags |= DF_TEXTREL;
9024
 
9025
          /* Not an error, just cut short the traversal.  */
9026
          return FALSE;
9027
        }
9028
    }
9029
  return TRUE;
9030
}
9031
 
9032
/* Set the sizes of the dynamic sections.  */
9033
 
9034
static bfd_boolean
9035
ppc64_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
9036
                                 struct bfd_link_info *info)
9037
{
9038
  struct ppc_link_hash_table *htab;
9039
  bfd *dynobj;
9040
  asection *s;
9041
  bfd_boolean relocs;
9042
  bfd *ibfd;
9043
  struct got_entry *first_tlsld;
9044
 
9045
  htab = ppc_hash_table (info);
9046
  if (htab == NULL)
9047
    return FALSE;
9048
 
9049
  dynobj = htab->elf.dynobj;
9050
  if (dynobj == NULL)
9051
    abort ();
9052
 
9053
  if (htab->elf.dynamic_sections_created)
9054
    {
9055
      /* Set the contents of the .interp section to the interpreter.  */
9056
      if (info->executable)
9057
        {
9058
          s = bfd_get_section_by_name (dynobj, ".interp");
9059
          if (s == NULL)
9060
            abort ();
9061
          s->size = sizeof ELF_DYNAMIC_INTERPRETER;
9062
          s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
9063
        }
9064
    }
9065
 
9066
  /* Set up .got offsets for local syms, and space for local dynamic
9067
     relocs.  */
9068
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
9069
    {
9070
      struct got_entry **lgot_ents;
9071
      struct got_entry **end_lgot_ents;
9072
      struct plt_entry **local_plt;
9073
      struct plt_entry **end_local_plt;
9074
      unsigned char *lgot_masks;
9075
      bfd_size_type locsymcount;
9076
      Elf_Internal_Shdr *symtab_hdr;
9077
      asection *srel;
9078
 
9079
      if (!is_ppc64_elf (ibfd))
9080
        continue;
9081
 
9082
      for (s = ibfd->sections; s != NULL; s = s->next)
9083
        {
9084
          struct elf_dyn_relocs *p;
9085
 
9086
          for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
9087
            {
9088
              if (!bfd_is_abs_section (p->sec)
9089
                  && bfd_is_abs_section (p->sec->output_section))
9090
                {
9091
                  /* Input section has been discarded, either because
9092
                     it is a copy of a linkonce section or due to
9093
                     linker script /DISCARD/, so we'll be discarding
9094
                     the relocs too.  */
9095
                }
9096
              else if (p->count != 0)
9097
                {
9098
                  srel = elf_section_data (p->sec)->sreloc;
9099
                  if (!htab->elf.dynamic_sections_created)
9100
                    srel = htab->reliplt;
9101
                  srel->size += p->count * sizeof (Elf64_External_Rela);
9102
                  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
9103
                    info->flags |= DF_TEXTREL;
9104
                }
9105
            }
9106
        }
9107
 
9108
      lgot_ents = elf_local_got_ents (ibfd);
9109
      if (!lgot_ents)
9110
        continue;
9111
 
9112
      symtab_hdr = &elf_symtab_hdr (ibfd);
9113
      locsymcount = symtab_hdr->sh_info;
9114
      end_lgot_ents = lgot_ents + locsymcount;
9115
      local_plt = (struct plt_entry **) end_lgot_ents;
9116
      end_local_plt = local_plt + locsymcount;
9117
      lgot_masks = (unsigned char *) end_local_plt;
9118
      s = ppc64_elf_tdata (ibfd)->got;
9119
      srel = ppc64_elf_tdata (ibfd)->relgot;
9120
      for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
9121
        {
9122
          struct got_entry **pent, *ent;
9123
 
9124
          pent = lgot_ents;
9125
          while ((ent = *pent) != NULL)
9126
            if (ent->got.refcount > 0)
9127
              {
9128
                if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
9129
                  {
9130
                    ppc64_tlsld_got (ibfd)->got.refcount += 1;
9131
                    *pent = ent->next;
9132
                  }
9133
                else
9134
                  {
9135
                    unsigned int num = 1;
9136
                    ent->got.offset = s->size;
9137
                    if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
9138
                      num = 2;
9139
                    s->size += num * 8;
9140
                    if (info->shared)
9141
                      srel->size += num * sizeof (Elf64_External_Rela);
9142
                    else if ((*lgot_masks & PLT_IFUNC) != 0)
9143
                      {
9144
                        htab->reliplt->size
9145
                          += num * sizeof (Elf64_External_Rela);
9146
                        htab->got_reli_size
9147
                          += num * sizeof (Elf64_External_Rela);
9148
                      }
9149
                    pent = &ent->next;
9150
                  }
9151
              }
9152
            else
9153
              *pent = ent->next;
9154
        }
9155
 
9156
      /* Allocate space for calls to local STT_GNU_IFUNC syms in .iplt.  */
9157
      for (; local_plt < end_local_plt; ++local_plt)
9158
        {
9159
          struct plt_entry *ent;
9160
 
9161
          for (ent = *local_plt; ent != NULL; ent = ent->next)
9162
            if (ent->plt.refcount > 0)
9163
              {
9164
                s = htab->iplt;
9165
                ent->plt.offset = s->size;
9166
                s->size += PLT_ENTRY_SIZE;
9167
 
9168
                htab->reliplt->size += sizeof (Elf64_External_Rela);
9169
              }
9170
            else
9171
              ent->plt.offset = (bfd_vma) -1;
9172
        }
9173
    }
9174
 
9175
  /* Allocate global sym .plt and .got entries, and space for global
9176
     sym dynamic relocs.  */
9177
  elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
9178
 
9179
  first_tlsld = NULL;
9180
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
9181
    {
9182
      struct got_entry *ent;
9183
 
9184
      if (!is_ppc64_elf (ibfd))
9185
        continue;
9186
 
9187
      ent = ppc64_tlsld_got (ibfd);
9188
      if (ent->got.refcount > 0)
9189
        {
9190
          if (!htab->do_multi_toc && first_tlsld != NULL)
9191
            {
9192
              ent->is_indirect = TRUE;
9193
              ent->got.ent = first_tlsld;
9194
            }
9195
          else
9196
            {
9197
              if (first_tlsld == NULL)
9198
                first_tlsld = ent;
9199
              s = ppc64_elf_tdata (ibfd)->got;
9200
              ent->got.offset = s->size;
9201
              ent->owner = ibfd;
9202
              s->size += 16;
9203
              if (info->shared)
9204
                {
9205
                  asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9206
                  srel->size += sizeof (Elf64_External_Rela);
9207
                }
9208
            }
9209
        }
9210
      else
9211
        ent->got.offset = (bfd_vma) -1;
9212
    }
9213
 
9214
  /* We now have determined the sizes of the various dynamic sections.
9215
     Allocate memory for them.  */
9216
  relocs = FALSE;
9217
  for (s = dynobj->sections; s != NULL; s = s->next)
9218
    {
9219
      if ((s->flags & SEC_LINKER_CREATED) == 0)
9220
        continue;
9221
 
9222
      if (s == htab->brlt || s == htab->relbrlt)
9223
        /* These haven't been allocated yet;  don't strip.  */
9224
        continue;
9225
      else if (s == htab->got
9226
               || s == htab->plt
9227
               || s == htab->iplt
9228
               || s == htab->glink
9229
               || s == htab->dynbss)
9230
        {
9231
          /* Strip this section if we don't need it; see the
9232
             comment below.  */
9233
        }
9234 161 khays
      else if (s == htab->glink_eh_frame)
9235
        {
9236
          if (!bfd_is_abs_section (s->output_section))
9237
            /* Not sized yet.  */
9238
            continue;
9239
        }
9240 14 khays
      else if (CONST_STRNEQ (s->name, ".rela"))
9241
        {
9242
          if (s->size != 0)
9243
            {
9244
              if (s != htab->relplt)
9245
                relocs = TRUE;
9246
 
9247
              /* We use the reloc_count field as a counter if we need
9248
                 to copy relocs into the output file.  */
9249
              s->reloc_count = 0;
9250
            }
9251
        }
9252
      else
9253
        {
9254
          /* It's not one of our sections, so don't allocate space.  */
9255
          continue;
9256
        }
9257
 
9258
      if (s->size == 0)
9259
        {
9260
          /* If we don't need this section, strip it from the
9261
             output file.  This is mostly to handle .rela.bss and
9262
             .rela.plt.  We must create both sections in
9263
             create_dynamic_sections, because they must be created
9264
             before the linker maps input sections to output
9265
             sections.  The linker does that before
9266
             adjust_dynamic_symbol is called, and it is that
9267
             function which decides whether anything needs to go
9268
             into these sections.  */
9269
          s->flags |= SEC_EXCLUDE;
9270
          continue;
9271
        }
9272
 
9273
      if ((s->flags & SEC_HAS_CONTENTS) == 0)
9274
        continue;
9275
 
9276
      /* Allocate memory for the section contents.  We use bfd_zalloc
9277
         here in case unused entries are not reclaimed before the
9278
         section's contents are written out.  This should not happen,
9279
         but this way if it does we get a R_PPC64_NONE reloc in .rela
9280
         sections instead of garbage.
9281
         We also rely on the section contents being zero when writing
9282
         the GOT.  */
9283
      s->contents = bfd_zalloc (dynobj, s->size);
9284
      if (s->contents == NULL)
9285
        return FALSE;
9286
    }
9287
 
9288
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
9289
    {
9290
      if (!is_ppc64_elf (ibfd))
9291
        continue;
9292
 
9293
      s = ppc64_elf_tdata (ibfd)->got;
9294
      if (s != NULL && s != htab->got)
9295
        {
9296
          if (s->size == 0)
9297
            s->flags |= SEC_EXCLUDE;
9298
          else
9299
            {
9300
              s->contents = bfd_zalloc (ibfd, s->size);
9301
              if (s->contents == NULL)
9302
                return FALSE;
9303
            }
9304
        }
9305
      s = ppc64_elf_tdata (ibfd)->relgot;
9306
      if (s != NULL)
9307
        {
9308
          if (s->size == 0)
9309
            s->flags |= SEC_EXCLUDE;
9310
          else
9311
            {
9312
              s->contents = bfd_zalloc (ibfd, s->size);
9313
              if (s->contents == NULL)
9314
                return FALSE;
9315
              relocs = TRUE;
9316
              s->reloc_count = 0;
9317
            }
9318
        }
9319
    }
9320
 
9321
  if (htab->elf.dynamic_sections_created)
9322
    {
9323
      /* Add some entries to the .dynamic section.  We fill in the
9324
         values later, in ppc64_elf_finish_dynamic_sections, but we
9325
         must add the entries now so that we get the correct size for
9326
         the .dynamic section.  The DT_DEBUG entry is filled in by the
9327
         dynamic linker and used by the debugger.  */
9328
#define add_dynamic_entry(TAG, VAL) \
9329
  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
9330
 
9331
      if (info->executable)
9332
        {
9333
          if (!add_dynamic_entry (DT_DEBUG, 0))
9334
            return FALSE;
9335
        }
9336
 
9337
      if (htab->plt != NULL && htab->plt->size != 0)
9338
        {
9339
          if (!add_dynamic_entry (DT_PLTGOT, 0)
9340
              || !add_dynamic_entry (DT_PLTRELSZ, 0)
9341
              || !add_dynamic_entry (DT_PLTREL, DT_RELA)
9342
              || !add_dynamic_entry (DT_JMPREL, 0)
9343
              || !add_dynamic_entry (DT_PPC64_GLINK, 0))
9344
            return FALSE;
9345
        }
9346
 
9347
      if (NO_OPD_RELOCS)
9348
        {
9349
          if (!add_dynamic_entry (DT_PPC64_OPD, 0)
9350
              || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
9351
            return FALSE;
9352
        }
9353
 
9354
      if (!htab->no_tls_get_addr_opt
9355
          && htab->tls_get_addr_fd != NULL
9356
          && htab->tls_get_addr_fd->elf.plt.plist != NULL
9357
          && !add_dynamic_entry (DT_PPC64_TLSOPT, 0))
9358
        return FALSE;
9359
 
9360
      if (relocs)
9361
        {
9362
          if (!add_dynamic_entry (DT_RELA, 0)
9363
              || !add_dynamic_entry (DT_RELASZ, 0)
9364
              || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
9365
            return FALSE;
9366
 
9367
          /* If any dynamic relocs apply to a read-only section,
9368
             then we need a DT_TEXTREL entry.  */
9369
          if ((info->flags & DF_TEXTREL) == 0)
9370
            elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, info);
9371
 
9372
          if ((info->flags & DF_TEXTREL) != 0)
9373
            {
9374
              if (!add_dynamic_entry (DT_TEXTREL, 0))
9375
                return FALSE;
9376
            }
9377
        }
9378
    }
9379
#undef add_dynamic_entry
9380
 
9381
  return TRUE;
9382
}
9383
 
9384
/* Determine the type of stub needed, if any, for a call.  */
9385
 
9386
static inline enum ppc_stub_type
9387
ppc_type_of_stub (asection *input_sec,
9388
                  const Elf_Internal_Rela *rel,
9389
                  struct ppc_link_hash_entry **hash,
9390
                  struct plt_entry **plt_ent,
9391
                  bfd_vma destination)
9392
{
9393
  struct ppc_link_hash_entry *h = *hash;
9394
  bfd_vma location;
9395
  bfd_vma branch_offset;
9396
  bfd_vma max_branch_offset;
9397
  enum elf_ppc64_reloc_type r_type;
9398
 
9399
  if (h != NULL)
9400
    {
9401
      struct plt_entry *ent;
9402
      struct ppc_link_hash_entry *fdh = h;
9403
      if (h->oh != NULL
9404
          && h->oh->is_func_descriptor)
9405
        {
9406
          fdh = ppc_follow_link (h->oh);
9407
          *hash = fdh;
9408
        }
9409
 
9410
      for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
9411
        if (ent->addend == rel->r_addend
9412
            && ent->plt.offset != (bfd_vma) -1)
9413
          {
9414
            *plt_ent = ent;
9415
            return ppc_stub_plt_call;
9416
          }
9417
 
9418
      /* Here, we know we don't have a plt entry.  If we don't have a
9419
         either a defined function descriptor or a defined entry symbol
9420
         in a regular object file, then it is pointless trying to make
9421
         any other type of stub.  */
9422
      if (!is_static_defined (&fdh->elf)
9423
          && !is_static_defined (&h->elf))
9424
        return ppc_stub_none;
9425
    }
9426
  else if (elf_local_got_ents (input_sec->owner) != NULL)
9427
    {
9428
      Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner);
9429
      struct plt_entry **local_plt = (struct plt_entry **)
9430
        elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info;
9431
      unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
9432
 
9433
      if (local_plt[r_symndx] != NULL)
9434
        {
9435
          struct plt_entry *ent;
9436
 
9437
          for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next)
9438
            if (ent->addend == rel->r_addend
9439
                && ent->plt.offset != (bfd_vma) -1)
9440
              {
9441
                *plt_ent = ent;
9442
                return ppc_stub_plt_call;
9443
              }
9444
        }
9445
    }
9446
 
9447
  /* Determine where the call point is.  */
9448
  location = (input_sec->output_offset
9449
              + input_sec->output_section->vma
9450
              + rel->r_offset);
9451
 
9452
  branch_offset = destination - location;
9453
  r_type = ELF64_R_TYPE (rel->r_info);
9454
 
9455
  /* Determine if a long branch stub is needed.  */
9456
  max_branch_offset = 1 << 25;
9457
  if (r_type != R_PPC64_REL24)
9458
    max_branch_offset = 1 << 15;
9459
 
9460
  if (branch_offset + max_branch_offset >= 2 * max_branch_offset)
9461
    /* We need a stub.  Figure out whether a long_branch or plt_branch
9462
       is needed later.  */
9463
    return ppc_stub_long_branch;
9464
 
9465
  return ppc_stub_none;
9466
}
9467
 
9468
/* Build a .plt call stub.  */
9469
 
9470
static inline bfd_byte *
9471 161 khays
build_plt_stub (bfd *obfd, bfd_byte *p, int offset, Elf_Internal_Rela *r,
9472
                bfd_boolean plt_static_chain)
9473 14 khays
{
9474
#define PPC_LO(v) ((v) & 0xffff)
9475
#define PPC_HI(v) (((v) >> 16) & 0xffff)
9476
#define PPC_HA(v) PPC_HI ((v) + 0x8000)
9477
 
9478
  if (PPC_HA (offset) != 0)
9479
    {
9480
      if (r != NULL)
9481
        {
9482 163 khays
          r[0].r_offset += 4;
9483 14 khays
          r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
9484 163 khays
          r[1].r_offset = r[0].r_offset + 4;
9485 14 khays
          r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
9486
          r[1].r_addend = r[0].r_addend;
9487 161 khays
          if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
9488 14 khays
            {
9489
              r[2].r_offset = r[1].r_offset + 4;
9490
              r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO);
9491
              r[2].r_addend = r[0].r_addend;
9492
            }
9493
          else
9494
            {
9495
              r[2].r_offset = r[1].r_offset + 8;
9496
              r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
9497
              r[2].r_addend = r[0].r_addend + 8;
9498 161 khays
              if (plt_static_chain)
9499
                {
9500
                  r[3].r_offset = r[2].r_offset + 4;
9501
                  r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
9502
                  r[3].r_addend = r[0].r_addend + 16;
9503
                }
9504 14 khays
            }
9505
        }
9506 163 khays
      bfd_put_32 (obfd, STD_R2_40R1, p),                        p += 4;
9507 14 khays
      bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p),     p += 4;
9508
      bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset), p),      p += 4;
9509 161 khays
      if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
9510 14 khays
        {
9511
          bfd_put_32 (obfd, ADDI_R12_R12 | PPC_LO (offset), p), p += 4;
9512
          offset = 0;
9513
        }
9514
      bfd_put_32 (obfd, MTCTR_R11, p),                          p += 4;
9515
      bfd_put_32 (obfd, LD_R2_0R12 | PPC_LO (offset + 8), p),   p += 4;
9516 161 khays
      if (plt_static_chain)
9517
        bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset + 16), p), p += 4;
9518 14 khays
      bfd_put_32 (obfd, BCTR, p),                               p += 4;
9519
    }
9520
  else
9521
    {
9522
      if (r != NULL)
9523
        {
9524
          r[0].r_offset += 4;
9525
          r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
9526 161 khays
          if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
9527 14 khays
            {
9528
              r[1].r_offset = r[0].r_offset + 4;
9529
              r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16);
9530
              r[1].r_addend = r[0].r_addend;
9531
            }
9532
          else
9533
            {
9534
              r[1].r_offset = r[0].r_offset + 8;
9535
              r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
9536 161 khays
              r[1].r_addend = r[0].r_addend + 8 + 8 * plt_static_chain;
9537
              if (plt_static_chain)
9538
                {
9539
                  r[2].r_offset = r[1].r_offset + 4;
9540
                  r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
9541
                  r[2].r_addend = r[0].r_addend + 8;
9542
                }
9543 14 khays
            }
9544
        }
9545
      bfd_put_32 (obfd, STD_R2_40R1, p),                        p += 4;
9546
      bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset), p),       p += 4;
9547 161 khays
      if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
9548 14 khays
        {
9549
          bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p),   p += 4;
9550
          offset = 0;
9551
        }
9552
      bfd_put_32 (obfd, MTCTR_R11, p),                          p += 4;
9553 161 khays
      if (plt_static_chain)
9554
        bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p), p += 4;
9555 14 khays
      bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p),    p += 4;
9556
      bfd_put_32 (obfd, BCTR, p),                               p += 4;
9557
    }
9558
  return p;
9559
}
9560
 
9561
/* Build a special .plt call stub for __tls_get_addr.  */
9562
 
9563
#define LD_R11_0R3      0xe9630000
9564
#define LD_R12_0R3      0xe9830000
9565
#define MR_R0_R3        0x7c601b78
9566
#define CMPDI_R11_0     0x2c2b0000
9567
#define ADD_R3_R12_R13  0x7c6c6a14
9568
#define BEQLR           0x4d820020
9569
#define MR_R3_R0        0x7c030378
9570
#define MFLR_R11        0x7d6802a6
9571
#define STD_R11_0R1     0xf9610000
9572
#define BCTRL           0x4e800421
9573
#define LD_R11_0R1      0xe9610000
9574
#define LD_R2_0R1       0xe8410000
9575
#define MTLR_R11        0x7d6803a6
9576
 
9577
static inline bfd_byte *
9578
build_tls_get_addr_stub (bfd *obfd, bfd_byte *p, int offset,
9579 161 khays
                         Elf_Internal_Rela *r, bfd_boolean plt_static_chain)
9580 14 khays
{
9581
  bfd_put_32 (obfd, LD_R11_0R3 + 0, p),          p += 4;
9582
  bfd_put_32 (obfd, LD_R12_0R3 + 8, p),         p += 4;
9583
  bfd_put_32 (obfd, MR_R0_R3, p),               p += 4;
9584
  bfd_put_32 (obfd, CMPDI_R11_0, p),            p += 4;
9585
  bfd_put_32 (obfd, ADD_R3_R12_R13, p),         p += 4;
9586
  bfd_put_32 (obfd, BEQLR, p),                  p += 4;
9587
  bfd_put_32 (obfd, MR_R3_R0, p),               p += 4;
9588
  bfd_put_32 (obfd, MFLR_R11, p),               p += 4;
9589
  bfd_put_32 (obfd, STD_R11_0R1 + 32, p),       p += 4;
9590
 
9591
  if (r != NULL)
9592
    r[0].r_offset += 9 * 4;
9593 161 khays
  p = build_plt_stub (obfd, p, offset, r, plt_static_chain);
9594 14 khays
  bfd_put_32 (obfd, BCTRL, p - 4);
9595
 
9596
  bfd_put_32 (obfd, LD_R11_0R1 + 32, p),        p += 4;
9597
  bfd_put_32 (obfd, LD_R2_0R1 + 40, p),         p += 4;
9598
  bfd_put_32 (obfd, MTLR_R11, p),               p += 4;
9599
  bfd_put_32 (obfd, BLR, p),                    p += 4;
9600
 
9601
  return p;
9602
}
9603
 
9604
static Elf_Internal_Rela *
9605
get_relocs (asection *sec, int count)
9606
{
9607
  Elf_Internal_Rela *relocs;
9608
  struct bfd_elf_section_data *elfsec_data;
9609
 
9610
  elfsec_data = elf_section_data (sec);
9611
  relocs = elfsec_data->relocs;
9612
  if (relocs == NULL)
9613
    {
9614
      bfd_size_type relsize;
9615
      relsize = sec->reloc_count * sizeof (*relocs);
9616
      relocs = bfd_alloc (sec->owner, relsize);
9617
      if (relocs == NULL)
9618
        return NULL;
9619
      elfsec_data->relocs = relocs;
9620
      elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
9621
                                          sizeof (Elf_Internal_Shdr));
9622
      if (elfsec_data->rela.hdr == NULL)
9623
        return NULL;
9624
      elfsec_data->rela.hdr->sh_size = (sec->reloc_count
9625
                                        * sizeof (Elf64_External_Rela));
9626
      elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
9627
      sec->reloc_count = 0;
9628
    }
9629
  relocs += sec->reloc_count;
9630
  sec->reloc_count += count;
9631
  return relocs;
9632
}
9633
 
9634
static bfd_vma
9635
get_r2off (struct bfd_link_info *info,
9636
           struct ppc_stub_hash_entry *stub_entry)
9637
{
9638
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
9639
  bfd_vma r2off = htab->stub_group[stub_entry->target_section->id].toc_off;
9640
 
9641
  if (r2off == 0)
9642
    {
9643
      /* Support linking -R objects.  Get the toc pointer from the
9644
         opd entry.  */
9645
      char buf[8];
9646
      asection *opd = stub_entry->h->elf.root.u.def.section;
9647
      bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
9648
 
9649
      if (strcmp (opd->name, ".opd") != 0
9650
          || opd->reloc_count != 0)
9651
        {
9652 161 khays
          info->callbacks->einfo (_("%P: cannot find opd entry toc for %s\n"),
9653 14 khays
                                  stub_entry->h->elf.root.root.string);
9654
          bfd_set_error (bfd_error_bad_value);
9655
          return 0;
9656
        }
9657
      if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
9658
        return 0;
9659
      r2off = bfd_get_64 (opd->owner, buf);
9660
      r2off -= elf_gp (info->output_bfd);
9661
    }
9662
  r2off -= htab->stub_group[stub_entry->id_sec->id].toc_off;
9663
  return r2off;
9664
}
9665
 
9666
static bfd_boolean
9667
ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
9668
{
9669
  struct ppc_stub_hash_entry *stub_entry;
9670
  struct ppc_branch_hash_entry *br_entry;
9671
  struct bfd_link_info *info;
9672
  struct ppc_link_hash_table *htab;
9673
  bfd_byte *loc;
9674
  bfd_byte *p;
9675
  bfd_vma dest, off;
9676
  int size;
9677
  Elf_Internal_Rela *r;
9678
  asection *plt;
9679
 
9680
  /* Massage our args to the form they really have.  */
9681
  stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
9682
  info = in_arg;
9683
 
9684
  htab = ppc_hash_table (info);
9685
  if (htab == NULL)
9686
    return FALSE;
9687
 
9688
  /* Make a note of the offset within the stubs for this entry.  */
9689
  stub_entry->stub_offset = stub_entry->stub_sec->size;
9690
  loc = stub_entry->stub_sec->contents + stub_entry->stub_offset;
9691
 
9692
  htab->stub_count[stub_entry->stub_type - 1] += 1;
9693
  switch (stub_entry->stub_type)
9694
    {
9695
    case ppc_stub_long_branch:
9696
    case ppc_stub_long_branch_r2off:
9697
      /* Branches are relative.  This is where we are going to.  */
9698
      off = dest = (stub_entry->target_value
9699
                    + stub_entry->target_section->output_offset
9700
                    + stub_entry->target_section->output_section->vma);
9701
 
9702
      /* And this is where we are coming from.  */
9703
      off -= (stub_entry->stub_offset
9704
              + stub_entry->stub_sec->output_offset
9705
              + stub_entry->stub_sec->output_section->vma);
9706
 
9707
      size = 4;
9708
      if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
9709
        {
9710
          bfd_vma r2off = get_r2off (info, stub_entry);
9711
 
9712
          if (r2off == 0)
9713
            {
9714
              htab->stub_error = TRUE;
9715
              return FALSE;
9716
            }
9717
          bfd_put_32 (htab->stub_bfd, STD_R2_40R1, loc);
9718
          loc += 4;
9719
          size = 12;
9720
          if (PPC_HA (r2off) != 0)
9721
            {
9722
              size = 16;
9723
              bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
9724
              loc += 4;
9725
            }
9726
          bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
9727
          loc += 4;
9728
          off -= size - 4;
9729
        }
9730
      bfd_put_32 (htab->stub_bfd, B_DOT | (off & 0x3fffffc), loc);
9731
 
9732
      if (off + (1 << 25) >= (bfd_vma) (1 << 26))
9733
        {
9734 161 khays
          info->callbacks->einfo (_("%P: long branch stub `%s' offset overflow\n"),
9735 14 khays
                                  stub_entry->root.string);
9736
          htab->stub_error = TRUE;
9737
          return FALSE;
9738
        }
9739
 
9740
      if (info->emitrelocations)
9741
        {
9742
          r = get_relocs (stub_entry->stub_sec, 1);
9743
          if (r == NULL)
9744
            return FALSE;
9745
          r->r_offset = loc - stub_entry->stub_sec->contents;
9746
          r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
9747
          r->r_addend = dest;
9748
          if (stub_entry->h != NULL)
9749
            {
9750
              struct elf_link_hash_entry **hashes;
9751
              unsigned long symndx;
9752
              struct ppc_link_hash_entry *h;
9753
 
9754
              hashes = elf_sym_hashes (htab->stub_bfd);
9755
              if (hashes == NULL)
9756
                {
9757
                  bfd_size_type hsize;
9758
 
9759
                  hsize = (htab->stub_globals + 1) * sizeof (*hashes);
9760
                  hashes = bfd_zalloc (htab->stub_bfd, hsize);
9761
                  if (hashes == NULL)
9762
                    return FALSE;
9763
                  elf_sym_hashes (htab->stub_bfd) = hashes;
9764
                  htab->stub_globals = 1;
9765
                }
9766
              symndx = htab->stub_globals++;
9767
              h = stub_entry->h;
9768
              hashes[symndx] = &h->elf;
9769
              r->r_info = ELF64_R_INFO (symndx, R_PPC64_REL24);
9770
              if (h->oh != NULL && h->oh->is_func)
9771
                h = ppc_follow_link (h->oh);
9772
              if (h->elf.root.u.def.section != stub_entry->target_section)
9773
                /* H is an opd symbol.  The addend must be zero.  */
9774
                r->r_addend = 0;
9775
              else
9776
                {
9777
                  off = (h->elf.root.u.def.value
9778
                         + h->elf.root.u.def.section->output_offset
9779
                         + h->elf.root.u.def.section->output_section->vma);
9780
                  r->r_addend -= off;
9781
                }
9782
            }
9783
        }
9784
      break;
9785
 
9786
    case ppc_stub_plt_branch:
9787
    case ppc_stub_plt_branch_r2off:
9788
      br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
9789
                                         stub_entry->root.string + 9,
9790
                                         FALSE, FALSE);
9791
      if (br_entry == NULL)
9792
        {
9793 161 khays
          info->callbacks->einfo (_("%P: can't find branch stub `%s'\n"),
9794 14 khays
                                  stub_entry->root.string);
9795
          htab->stub_error = TRUE;
9796
          return FALSE;
9797
        }
9798
 
9799
      dest = (stub_entry->target_value
9800
              + stub_entry->target_section->output_offset
9801
              + stub_entry->target_section->output_section->vma);
9802
 
9803
      bfd_put_64 (htab->brlt->owner, dest,
9804
                  htab->brlt->contents + br_entry->offset);
9805
 
9806
      if (br_entry->iter == htab->stub_iteration)
9807
        {
9808
          br_entry->iter = 0;
9809
 
9810
          if (htab->relbrlt != NULL)
9811
            {
9812
              /* Create a reloc for the branch lookup table entry.  */
9813
              Elf_Internal_Rela rela;
9814
              bfd_byte *rl;
9815
 
9816
              rela.r_offset = (br_entry->offset
9817
                               + htab->brlt->output_offset
9818
                               + htab->brlt->output_section->vma);
9819
              rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
9820
              rela.r_addend = dest;
9821
 
9822
              rl = htab->relbrlt->contents;
9823
              rl += (htab->relbrlt->reloc_count++
9824
                     * sizeof (Elf64_External_Rela));
9825
              bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
9826
            }
9827
          else if (info->emitrelocations)
9828
            {
9829
              r = get_relocs (htab->brlt, 1);
9830
              if (r == NULL)
9831
                return FALSE;
9832
              /* brlt, being SEC_LINKER_CREATED does not go through the
9833
                 normal reloc processing.  Symbols and offsets are not
9834
                 translated from input file to output file form, so
9835
                 set up the offset per the output file.  */
9836
              r->r_offset = (br_entry->offset
9837
                             + htab->brlt->output_offset
9838
                             + htab->brlt->output_section->vma);
9839
              r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
9840
              r->r_addend = dest;
9841
            }
9842
        }
9843
 
9844
      dest = (br_entry->offset
9845
              + htab->brlt->output_offset
9846
              + htab->brlt->output_section->vma);
9847
 
9848
      off = (dest
9849
             - elf_gp (htab->brlt->output_section->owner)
9850
             - htab->stub_group[stub_entry->id_sec->id].toc_off);
9851
 
9852
      if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
9853
        {
9854
          info->callbacks->einfo
9855 161 khays
            (_("%P: linkage table error against `%s'\n"),
9856 14 khays
             stub_entry->root.string);
9857
          bfd_set_error (bfd_error_bad_value);
9858
          htab->stub_error = TRUE;
9859
          return FALSE;
9860
        }
9861
 
9862
      if (info->emitrelocations)
9863
        {
9864
          r = get_relocs (stub_entry->stub_sec, 1 + (PPC_HA (off) != 0));
9865
          if (r == NULL)
9866
            return FALSE;
9867
          r[0].r_offset = loc - stub_entry->stub_sec->contents;
9868
          if (bfd_big_endian (info->output_bfd))
9869
            r[0].r_offset += 2;
9870
          if (stub_entry->stub_type == ppc_stub_plt_branch_r2off)
9871
            r[0].r_offset += 4;
9872
          r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
9873
          r[0].r_addend = dest;
9874
          if (PPC_HA (off) != 0)
9875
            {
9876
              r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
9877
              r[1].r_offset = r[0].r_offset + 4;
9878
              r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
9879
              r[1].r_addend = r[0].r_addend;
9880
            }
9881
        }
9882
 
9883
      if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
9884
        {
9885
          if (PPC_HA (off) != 0)
9886
            {
9887
              size = 16;
9888
              bfd_put_32 (htab->stub_bfd, ADDIS_R12_R2 | PPC_HA (off), loc);
9889
              loc += 4;
9890
              bfd_put_32 (htab->stub_bfd, LD_R11_0R12 | PPC_LO (off), loc);
9891
            }
9892
          else
9893
            {
9894
              size = 12;
9895
              bfd_put_32 (htab->stub_bfd, LD_R11_0R2 | PPC_LO (off), loc);
9896
            }
9897
        }
9898
      else
9899
        {
9900
          bfd_vma r2off = get_r2off (info, stub_entry);
9901
 
9902
          if (r2off == 0)
9903
            {
9904
              htab->stub_error = TRUE;
9905
              return FALSE;
9906
            }
9907
 
9908
          bfd_put_32 (htab->stub_bfd, STD_R2_40R1, loc);
9909
          loc += 4;
9910
          size = 20;
9911
          if (PPC_HA (off) != 0)
9912
            {
9913
              size += 4;
9914
              bfd_put_32 (htab->stub_bfd, ADDIS_R12_R2 | PPC_HA (off), loc);
9915
              loc += 4;
9916
              bfd_put_32 (htab->stub_bfd, LD_R11_0R12 | PPC_LO (off), loc);
9917
              loc += 4;
9918
            }
9919
          else
9920
            {
9921
              bfd_put_32 (htab->stub_bfd, LD_R11_0R2 | PPC_LO (off), loc);
9922
              loc += 4;
9923
            }
9924
 
9925
          if (PPC_HA (r2off) != 0)
9926
            {
9927
              size += 4;
9928
              bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
9929
              loc += 4;
9930
            }
9931
          bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
9932
        }
9933
      loc += 4;
9934
      bfd_put_32 (htab->stub_bfd, MTCTR_R11, loc);
9935
      loc += 4;
9936
      bfd_put_32 (htab->stub_bfd, BCTR, loc);
9937
      break;
9938
 
9939
    case ppc_stub_plt_call:
9940
      if (stub_entry->h != NULL
9941
          && stub_entry->h->is_func_descriptor
9942
          && stub_entry->h->oh != NULL)
9943
        {
9944
          struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
9945
 
9946
          /* If the old-ABI "dot-symbol" is undefined make it weak so
9947
             we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL.
9948
             FIXME: We used to define the symbol on one of the call
9949
             stubs instead, which is why we test symbol section id
9950
             against htab->top_id in various places.  Likely all
9951
             these checks could now disappear.  */
9952
          if (fh->elf.root.type == bfd_link_hash_undefined)
9953
            fh->elf.root.type = bfd_link_hash_undefweak;
9954
          /* Stop undo_symbol_twiddle changing it back to undefined.  */
9955
          fh->was_undefined = 0;
9956
        }
9957
 
9958
      /* Now build the stub.  */
9959
      dest = stub_entry->plt_ent->plt.offset & ~1;
9960
      if (dest >= (bfd_vma) -2)
9961
        abort ();
9962
 
9963
      plt = htab->plt;
9964
      if (!htab->elf.dynamic_sections_created
9965
          || stub_entry->h == NULL
9966
          || stub_entry->h->elf.dynindx == -1)
9967
        plt = htab->iplt;
9968
 
9969
      dest += plt->output_offset + plt->output_section->vma;
9970
 
9971
      if (stub_entry->h == NULL
9972
          && (stub_entry->plt_ent->plt.offset & 1) == 0)
9973
        {
9974
          Elf_Internal_Rela rela;
9975
          bfd_byte *rl;
9976
 
9977
          rela.r_offset = dest;
9978
          rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
9979
          rela.r_addend = (stub_entry->target_value
9980
                           + stub_entry->target_section->output_offset
9981
                           + stub_entry->target_section->output_section->vma);
9982
 
9983
          rl = (htab->reliplt->contents
9984
                + (htab->reliplt->reloc_count++
9985
                   * sizeof (Elf64_External_Rela)));
9986
          bfd_elf64_swap_reloca_out (info->output_bfd, &rela, rl);
9987
          stub_entry->plt_ent->plt.offset |= 1;
9988
        }
9989
 
9990
      off = (dest
9991
             - elf_gp (plt->output_section->owner)
9992
             - htab->stub_group[stub_entry->id_sec->id].toc_off);
9993
 
9994
      if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
9995
        {
9996
          info->callbacks->einfo
9997 161 khays
            (_("%P: linkage table error against `%s'\n"),
9998 14 khays
             stub_entry->h != NULL
9999
             ? stub_entry->h->elf.root.root.string
10000
             : "<local sym>");
10001
          bfd_set_error (bfd_error_bad_value);
10002
          htab->stub_error = TRUE;
10003
          return FALSE;
10004
        }
10005
 
10006
      r = NULL;
10007
      if (info->emitrelocations)
10008
        {
10009
          r = get_relocs (stub_entry->stub_sec,
10010 161 khays
                          (2
10011
                           + (PPC_HA (off) != 0)
10012
                           + (htab->plt_static_chain
10013
                              && PPC_HA (off + 16) == PPC_HA (off))));
10014 14 khays
          if (r == NULL)
10015
            return FALSE;
10016
          r[0].r_offset = loc - stub_entry->stub_sec->contents;
10017
          if (bfd_big_endian (info->output_bfd))
10018
            r[0].r_offset += 2;
10019
          r[0].r_addend = dest;
10020
        }
10021
      if (stub_entry->h != NULL
10022
          && (stub_entry->h == htab->tls_get_addr_fd
10023
              || stub_entry->h == htab->tls_get_addr)
10024
          && !htab->no_tls_get_addr_opt)
10025 161 khays
        p = build_tls_get_addr_stub (htab->stub_bfd, loc, off, r,
10026
                                     htab->plt_static_chain);
10027 14 khays
      else
10028 161 khays
        p = build_plt_stub (htab->stub_bfd, loc, off, r,
10029
                            htab->plt_static_chain);
10030 14 khays
      size = p - loc;
10031
      break;
10032
 
10033
    default:
10034
      BFD_FAIL ();
10035
      return FALSE;
10036
    }
10037
 
10038
  stub_entry->stub_sec->size += size;
10039
 
10040
  if (htab->emit_stub_syms)
10041
    {
10042
      struct elf_link_hash_entry *h;
10043
      size_t len1, len2;
10044
      char *name;
10045
      const char *const stub_str[] = { "long_branch",
10046
                                       "long_branch_r2off",
10047
                                       "plt_branch",
10048
                                       "plt_branch_r2off",
10049
                                       "plt_call" };
10050
 
10051
      len1 = strlen (stub_str[stub_entry->stub_type - 1]);
10052
      len2 = strlen (stub_entry->root.string);
10053
      name = bfd_malloc (len1 + len2 + 2);
10054
      if (name == NULL)
10055
        return FALSE;
10056
      memcpy (name, stub_entry->root.string, 9);
10057
      memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
10058
      memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
10059
      h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
10060
      if (h == NULL)
10061
        return FALSE;
10062
      if (h->root.type == bfd_link_hash_new)
10063
        {
10064
          h->root.type = bfd_link_hash_defined;
10065
          h->root.u.def.section = stub_entry->stub_sec;
10066
          h->root.u.def.value = stub_entry->stub_offset;
10067
          h->ref_regular = 1;
10068
          h->def_regular = 1;
10069
          h->ref_regular_nonweak = 1;
10070
          h->forced_local = 1;
10071
          h->non_elf = 0;
10072
        }
10073
    }
10074
 
10075
  return TRUE;
10076
}
10077
 
10078
/* As above, but don't actually build the stub.  Just bump offset so
10079
   we know stub section sizes, and select plt_branch stubs where
10080
   long_branch stubs won't do.  */
10081
 
10082
static bfd_boolean
10083
ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
10084
{
10085
  struct ppc_stub_hash_entry *stub_entry;
10086
  struct bfd_link_info *info;
10087
  struct ppc_link_hash_table *htab;
10088
  bfd_vma off;
10089
  int size;
10090
 
10091
  /* Massage our args to the form they really have.  */
10092
  stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
10093
  info = in_arg;
10094
 
10095
  htab = ppc_hash_table (info);
10096
  if (htab == NULL)
10097
    return FALSE;
10098
 
10099
  if (stub_entry->stub_type == ppc_stub_plt_call)
10100
    {
10101
      asection *plt;
10102
      off = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
10103
      if (off >= (bfd_vma) -2)
10104
        abort ();
10105
      plt = htab->plt;
10106
      if (!htab->elf.dynamic_sections_created
10107
          || stub_entry->h == NULL
10108
          || stub_entry->h->elf.dynindx == -1)
10109
        plt = htab->iplt;
10110
      off += (plt->output_offset
10111
              + plt->output_section->vma
10112
              - elf_gp (plt->output_section->owner)
10113
              - htab->stub_group[stub_entry->id_sec->id].toc_off);
10114
 
10115
      size = PLT_CALL_STUB_SIZE;
10116 161 khays
      if (!htab->plt_static_chain)
10117
        size -= 4;
10118 14 khays
      if (PPC_HA (off) == 0)
10119
        size -= 4;
10120 161 khays
      if (PPC_HA (off + 8 + 8 * htab->plt_static_chain) != PPC_HA (off))
10121 14 khays
        size += 4;
10122
      if (stub_entry->h != NULL
10123
          && (stub_entry->h == htab->tls_get_addr_fd
10124
              || stub_entry->h == htab->tls_get_addr)
10125
          && !htab->no_tls_get_addr_opt)
10126
        size += 13 * 4;
10127
      if (info->emitrelocations)
10128
        {
10129
          stub_entry->stub_sec->reloc_count
10130 161 khays
            += (2
10131
                + (PPC_HA (off) != 0)
10132
                + (htab->plt_static_chain
10133
                   && PPC_HA (off + 16) == PPC_HA (off)));
10134 14 khays
          stub_entry->stub_sec->flags |= SEC_RELOC;
10135
        }
10136
    }
10137
  else
10138
    {
10139
      /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
10140
         variants.  */
10141
      bfd_vma r2off = 0;
10142
 
10143
      off = (stub_entry->target_value
10144
             + stub_entry->target_section->output_offset
10145
             + stub_entry->target_section->output_section->vma);
10146
      off -= (stub_entry->stub_sec->size
10147
              + stub_entry->stub_sec->output_offset
10148
              + stub_entry->stub_sec->output_section->vma);
10149
 
10150
      /* Reset the stub type from the plt variant in case we now
10151
         can reach with a shorter stub.  */
10152
      if (stub_entry->stub_type >= ppc_stub_plt_branch)
10153
        stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
10154
 
10155
      size = 4;
10156
      if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
10157
        {
10158
          r2off = get_r2off (info, stub_entry);
10159
          if (r2off == 0)
10160
            {
10161
              htab->stub_error = TRUE;
10162
              return FALSE;
10163
            }
10164
          size = 12;
10165
          if (PPC_HA (r2off) != 0)
10166
            size = 16;
10167
          off -= size - 4;
10168
        }
10169
 
10170
      /* If the branch offset if too big, use a ppc_stub_plt_branch.  */
10171
      if (off + (1 << 25) >= (bfd_vma) (1 << 26))
10172
        {
10173
          struct ppc_branch_hash_entry *br_entry;
10174
 
10175
          br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
10176
                                             stub_entry->root.string + 9,
10177
                                             TRUE, FALSE);
10178
          if (br_entry == NULL)
10179
            {
10180 161 khays
              info->callbacks->einfo (_("%P: can't build branch stub `%s'\n"),
10181 14 khays
                                      stub_entry->root.string);
10182
              htab->stub_error = TRUE;
10183
              return FALSE;
10184
            }
10185
 
10186
          if (br_entry->iter != htab->stub_iteration)
10187
            {
10188
              br_entry->iter = htab->stub_iteration;
10189
              br_entry->offset = htab->brlt->size;
10190
              htab->brlt->size += 8;
10191
 
10192
              if (htab->relbrlt != NULL)
10193
                htab->relbrlt->size += sizeof (Elf64_External_Rela);
10194
              else if (info->emitrelocations)
10195
                {
10196
                  htab->brlt->reloc_count += 1;
10197
                  htab->brlt->flags |= SEC_RELOC;
10198
                }
10199
            }
10200
 
10201
          stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
10202
          off = (br_entry->offset
10203
                 + htab->brlt->output_offset
10204
                 + htab->brlt->output_section->vma
10205
                 - elf_gp (htab->brlt->output_section->owner)
10206
                 - htab->stub_group[stub_entry->id_sec->id].toc_off);
10207
 
10208
          if (info->emitrelocations)
10209
            {
10210
              stub_entry->stub_sec->reloc_count += 1 + (PPC_HA (off) != 0);
10211
              stub_entry->stub_sec->flags |= SEC_RELOC;
10212
            }
10213
 
10214
          if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
10215
            {
10216
              size = 12;
10217
              if (PPC_HA (off) != 0)
10218
                size = 16;
10219
            }
10220
          else
10221
            {
10222
              size = 20;
10223
              if (PPC_HA (off) != 0)
10224
                size += 4;
10225
 
10226
              if (PPC_HA (r2off) != 0)
10227
                size += 4;
10228
            }
10229
        }
10230
      else if (info->emitrelocations)
10231
        {
10232
          stub_entry->stub_sec->reloc_count += 1;
10233
          stub_entry->stub_sec->flags |= SEC_RELOC;
10234
        }
10235
    }
10236
 
10237
  stub_entry->stub_sec->size += size;
10238
  return TRUE;
10239
}
10240
 
10241
/* Set up various things so that we can make a list of input sections
10242
   for each output section included in the link.  Returns -1 on error,
10243
 
10244
 
10245
int
10246
ppc64_elf_setup_section_lists
10247
  (struct bfd_link_info *info,
10248
   asection *(*add_stub_section) (const char *, asection *),
10249
   void (*layout_sections_again) (void))
10250
{
10251
  bfd *input_bfd;
10252
  int top_id, top_index, id;
10253
  asection *section;
10254
  asection **input_list;
10255
  bfd_size_type amt;
10256
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
10257
 
10258
  if (htab == NULL)
10259
    return -1;
10260
  /* Stash our params away.  */
10261
  htab->add_stub_section = add_stub_section;
10262
  htab->layout_sections_again = layout_sections_again;
10263
 
10264
  if (htab->brlt == NULL)
10265
    return 0;
10266
 
10267
  /* Find the top input section id.  */
10268
  for (input_bfd = info->input_bfds, top_id = 3;
10269
       input_bfd != NULL;
10270
       input_bfd = input_bfd->link_next)
10271
    {
10272
      for (section = input_bfd->sections;
10273
           section != NULL;
10274
           section = section->next)
10275
        {
10276
          if (top_id < section->id)
10277
            top_id = section->id;
10278
        }
10279
    }
10280
 
10281
  htab->top_id = top_id;
10282
  amt = sizeof (struct map_stub) * (top_id + 1);
10283
  htab->stub_group = bfd_zmalloc (amt);
10284
  if (htab->stub_group == NULL)
10285
    return -1;
10286
 
10287
  /* Set toc_off for com, und, abs and ind sections.  */
10288
  for (id = 0; id < 3; id++)
10289
    htab->stub_group[id].toc_off = TOC_BASE_OFF;
10290
 
10291
  /* We can't use output_bfd->section_count here to find the top output
10292
     section index as some sections may have been removed, and
10293
     strip_excluded_output_sections doesn't renumber the indices.  */
10294
  for (section = info->output_bfd->sections, top_index = 0;
10295
       section != NULL;
10296
       section = section->next)
10297
    {
10298
      if (top_index < section->index)
10299
        top_index = section->index;
10300
    }
10301
 
10302
  htab->top_index = top_index;
10303
  amt = sizeof (asection *) * (top_index + 1);
10304
  input_list = bfd_zmalloc (amt);
10305
  htab->input_list = input_list;
10306
  if (input_list == NULL)
10307
    return -1;
10308
 
10309
  return 1;
10310
}
10311
 
10312
/* Set up for first pass at multitoc partitioning.  */
10313
 
10314
void
10315
ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
10316
{
10317
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
10318
 
10319
  elf_gp (info->output_bfd) = ppc64_elf_toc (info->output_bfd);
10320
  htab->toc_curr = elf_gp (info->output_bfd);
10321
  htab->toc_bfd = NULL;
10322
  htab->toc_first_sec = NULL;
10323
}
10324
 
10325
/* The linker repeatedly calls this function for each TOC input section
10326
   and linker generated GOT section.  Group input bfds such that the toc
10327
   within a group is less than 64k in size.  */
10328
 
10329
bfd_boolean
10330
ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
10331
{
10332
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
10333
  bfd_vma addr, off, limit;
10334
 
10335
  if (htab == NULL)
10336
    return FALSE;
10337
 
10338
  if (!htab->second_toc_pass)
10339
    {
10340
      /* Keep track of the first .toc or .got section for this input bfd.  */
10341
      if (htab->toc_bfd != isec->owner)
10342
        {
10343
          htab->toc_bfd = isec->owner;
10344
          htab->toc_first_sec = isec;
10345
        }
10346
 
10347
      addr = isec->output_offset + isec->output_section->vma;
10348
      off = addr - htab->toc_curr;
10349
      limit = 0x80008000;
10350
      if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
10351
        limit = 0x10000;
10352
      if (off + isec->size > limit)
10353
        {
10354
          addr = (htab->toc_first_sec->output_offset
10355
                  + htab->toc_first_sec->output_section->vma);
10356
          htab->toc_curr = addr;
10357
        }
10358
 
10359
      /* toc_curr is the base address of this toc group.  Set elf_gp
10360
         for the input section to be the offset relative to the
10361
         output toc base plus 0x8000.  Making the input elf_gp an
10362
         offset allows us to move the toc as a whole without
10363
         recalculating input elf_gp.  */
10364
      off = htab->toc_curr - elf_gp (isec->output_section->owner);
10365
      off += TOC_BASE_OFF;
10366
 
10367
      /* Die if someone uses a linker script that doesn't keep input
10368
         file .toc and .got together.  */
10369
      if (elf_gp (isec->owner) != 0
10370
          && elf_gp (isec->owner) != off)
10371
        return FALSE;
10372
 
10373
      elf_gp (isec->owner) = off;
10374
      return TRUE;
10375
    }
10376
 
10377
  /* During the second pass toc_first_sec points to the start of
10378
     a toc group, and toc_curr is used to track the old elf_gp.
10379
     We use toc_bfd to ensure we only look at each bfd once.  */
10380
  if (htab->toc_bfd == isec->owner)
10381
    return TRUE;
10382
  htab->toc_bfd = isec->owner;
10383
 
10384
  if (htab->toc_first_sec == NULL
10385
      || htab->toc_curr != elf_gp (isec->owner))
10386
    {
10387
      htab->toc_curr = elf_gp (isec->owner);
10388
      htab->toc_first_sec = isec;
10389
    }
10390
  addr = (htab->toc_first_sec->output_offset
10391
          + htab->toc_first_sec->output_section->vma);
10392
  off = addr - elf_gp (isec->output_section->owner) + TOC_BASE_OFF;
10393
  elf_gp (isec->owner) = off;
10394
 
10395
  return TRUE;
10396
}
10397
 
10398
/* Called via elf_link_hash_traverse to merge GOT entries for global
10399
   symbol H.  */
10400
 
10401
static bfd_boolean
10402
merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
10403
{
10404
  if (h->root.type == bfd_link_hash_indirect)
10405
    return TRUE;
10406
 
10407
  merge_got_entries (&h->got.glist);
10408
 
10409
  return TRUE;
10410
}
10411
 
10412
/* Called via elf_link_hash_traverse to allocate GOT entries for global
10413
   symbol H.  */
10414
 
10415
static bfd_boolean
10416
reallocate_got (struct elf_link_hash_entry *h, void *inf)
10417
{
10418
  struct got_entry *gent;
10419
 
10420
  if (h->root.type == bfd_link_hash_indirect)
10421
    return TRUE;
10422
 
10423
  for (gent = h->got.glist; gent != NULL; gent = gent->next)
10424
    if (!gent->is_indirect)
10425
      allocate_got (h, (struct bfd_link_info *) inf, gent);
10426
  return TRUE;
10427
}
10428
 
10429
/* Called on the first multitoc pass after the last call to
10430
   ppc64_elf_next_toc_section.  This function removes duplicate GOT
10431
   entries.  */
10432
 
10433
bfd_boolean
10434
ppc64_elf_layout_multitoc (struct bfd_link_info *info)
10435
{
10436
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
10437
  struct bfd *ibfd, *ibfd2;
10438
  bfd_boolean done_something;
10439
 
10440
  htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
10441
 
10442
  if (!htab->do_multi_toc)
10443
    return FALSE;
10444
 
10445
  /* Merge global sym got entries within a toc group.  */
10446
  elf_link_hash_traverse (&htab->elf, merge_global_got, info);
10447
 
10448
  /* And tlsld_got.  */
10449
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10450
    {
10451
      struct got_entry *ent, *ent2;
10452
 
10453
      if (!is_ppc64_elf (ibfd))
10454
        continue;
10455
 
10456
      ent = ppc64_tlsld_got (ibfd);
10457
      if (!ent->is_indirect
10458
          && ent->got.offset != (bfd_vma) -1)
10459
        {
10460
          for (ibfd2 = ibfd->link_next; ibfd2 != NULL; ibfd2 = ibfd2->link_next)
10461
            {
10462
              if (!is_ppc64_elf (ibfd2))
10463
                continue;
10464
 
10465
              ent2 = ppc64_tlsld_got (ibfd2);
10466
              if (!ent2->is_indirect
10467
                  && ent2->got.offset != (bfd_vma) -1
10468
                  && elf_gp (ibfd2) == elf_gp (ibfd))
10469
                {
10470
                  ent2->is_indirect = TRUE;
10471
                  ent2->got.ent = ent;
10472
                }
10473
            }
10474
        }
10475
    }
10476
 
10477
  /* Zap sizes of got sections.  */
10478
  htab->reliplt->rawsize = htab->reliplt->size;
10479
  htab->reliplt->size -= htab->got_reli_size;
10480
  htab->got_reli_size = 0;
10481
 
10482
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10483
    {
10484
      asection *got, *relgot;
10485
 
10486
      if (!is_ppc64_elf (ibfd))
10487
        continue;
10488
 
10489
      got = ppc64_elf_tdata (ibfd)->got;
10490
      if (got != NULL)
10491
        {
10492
          got->rawsize = got->size;
10493
          got->size = 0;
10494
          relgot = ppc64_elf_tdata (ibfd)->relgot;
10495
          relgot->rawsize = relgot->size;
10496
          relgot->size = 0;
10497
        }
10498
    }
10499
 
10500
  /* Now reallocate the got, local syms first.  We don't need to
10501
     allocate section contents again since we never increase size.  */
10502
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10503
    {
10504
      struct got_entry **lgot_ents;
10505
      struct got_entry **end_lgot_ents;
10506
      struct plt_entry **local_plt;
10507
      struct plt_entry **end_local_plt;
10508
      unsigned char *lgot_masks;
10509
      bfd_size_type locsymcount;
10510
      Elf_Internal_Shdr *symtab_hdr;
10511
      asection *s, *srel;
10512
 
10513
      if (!is_ppc64_elf (ibfd))
10514
        continue;
10515
 
10516
      lgot_ents = elf_local_got_ents (ibfd);
10517
      if (!lgot_ents)
10518
        continue;
10519
 
10520
      symtab_hdr = &elf_symtab_hdr (ibfd);
10521
      locsymcount = symtab_hdr->sh_info;
10522
      end_lgot_ents = lgot_ents + locsymcount;
10523
      local_plt = (struct plt_entry **) end_lgot_ents;
10524
      end_local_plt = local_plt + locsymcount;
10525
      lgot_masks = (unsigned char *) end_local_plt;
10526
      s = ppc64_elf_tdata (ibfd)->got;
10527
      srel = ppc64_elf_tdata (ibfd)->relgot;
10528
      for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
10529
        {
10530
          struct got_entry *ent;
10531
 
10532
          for (ent = *lgot_ents; ent != NULL; ent = ent->next)
10533
            {
10534
              unsigned int num = 1;
10535
              ent->got.offset = s->size;
10536
              if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
10537
                num = 2;
10538
              s->size += num * 8;
10539
              if (info->shared)
10540
                srel->size += num * sizeof (Elf64_External_Rela);
10541
              else if ((*lgot_masks & PLT_IFUNC) != 0)
10542
                {
10543
                  htab->reliplt->size
10544
                    += num * sizeof (Elf64_External_Rela);
10545
                  htab->got_reli_size
10546
                    += num * sizeof (Elf64_External_Rela);
10547
                }
10548
            }
10549
        }
10550
    }
10551
 
10552
  elf_link_hash_traverse (&htab->elf, reallocate_got, info);
10553
 
10554
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10555
    {
10556
      struct got_entry *ent;
10557
 
10558
      if (!is_ppc64_elf (ibfd))
10559
        continue;
10560
 
10561
      ent = ppc64_tlsld_got (ibfd);
10562
      if (!ent->is_indirect
10563
          && ent->got.offset != (bfd_vma) -1)
10564
        {
10565
          asection *s = ppc64_elf_tdata (ibfd)->got;
10566
          ent->got.offset = s->size;
10567
          s->size += 16;
10568
          if (info->shared)
10569
            {
10570
              asection *srel = ppc64_elf_tdata (ibfd)->relgot;
10571
              srel->size += sizeof (Elf64_External_Rela);
10572
            }
10573
        }
10574
    }
10575
 
10576
  done_something = htab->reliplt->rawsize != htab->reliplt->size;
10577
  if (!done_something)
10578
    for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10579
      {
10580
        asection *got;
10581
 
10582
        if (!is_ppc64_elf (ibfd))
10583
          continue;
10584
 
10585
        got = ppc64_elf_tdata (ibfd)->got;
10586
        if (got != NULL)
10587
          {
10588
            done_something = got->rawsize != got->size;
10589
            if (done_something)
10590
              break;
10591
          }
10592
      }
10593
 
10594
  if (done_something)
10595
    (*htab->layout_sections_again) ();
10596
 
10597
  /* Set up for second pass over toc sections to recalculate elf_gp
10598
     on input sections.  */
10599
  htab->toc_bfd = NULL;
10600
  htab->toc_first_sec = NULL;
10601
  htab->second_toc_pass = TRUE;
10602
  return done_something;
10603
}
10604
 
10605
/* Called after second pass of multitoc partitioning.  */
10606
 
10607
void
10608
ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
10609
{
10610
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
10611
 
10612
  /* After the second pass, toc_curr tracks the TOC offset used
10613
     for code sections below in ppc64_elf_next_input_section.  */
10614
  htab->toc_curr = TOC_BASE_OFF;
10615
}
10616
 
10617
/* No toc references were found in ISEC.  If the code in ISEC makes no
10618
   calls, then there's no need to use toc adjusting stubs when branching
10619
   into ISEC.  Actually, indirect calls from ISEC are OK as they will
10620
   load r2.  Returns -1 on error, 0 for no stub needed, 1 for stub
10621
   needed, and 2 if a cyclical call-graph was found but no other reason
10622
   for a stub was detected.  If called from the top level, a return of
10623
   2 means the same as a return of 0.  */
10624
 
10625
static int
10626
toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
10627
{
10628
  int ret;
10629
 
10630
  /* Mark this section as checked.  */
10631
  isec->call_check_done = 1;
10632
 
10633
  /* We know none of our code bearing sections will need toc stubs.  */
10634
  if ((isec->flags & SEC_LINKER_CREATED) != 0)
10635
    return 0;
10636
 
10637
  if (isec->size == 0)
10638
    return 0;
10639
 
10640
  if (isec->output_section == NULL)
10641
    return 0;
10642
 
10643
  ret = 0;
10644
  if (isec->reloc_count != 0)
10645
    {
10646
      Elf_Internal_Rela *relstart, *rel;
10647
      Elf_Internal_Sym *local_syms;
10648
      struct ppc_link_hash_table *htab;
10649
 
10650
      relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
10651
                                            info->keep_memory);
10652
      if (relstart == NULL)
10653
        return -1;
10654
 
10655
      /* Look for branches to outside of this section.  */
10656
      local_syms = NULL;
10657
      htab = ppc_hash_table (info);
10658
      if (htab == NULL)
10659
        return -1;
10660
 
10661
      for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
10662
        {
10663
          enum elf_ppc64_reloc_type r_type;
10664
          unsigned long r_symndx;
10665
          struct elf_link_hash_entry *h;
10666
          struct ppc_link_hash_entry *eh;
10667
          Elf_Internal_Sym *sym;
10668
          asection *sym_sec;
10669
          struct _opd_sec_data *opd;
10670
          bfd_vma sym_value;
10671
          bfd_vma dest;
10672
 
10673
          r_type = ELF64_R_TYPE (rel->r_info);
10674
          if (r_type != R_PPC64_REL24
10675
              && r_type != R_PPC64_REL14
10676
              && r_type != R_PPC64_REL14_BRTAKEN
10677
              && r_type != R_PPC64_REL14_BRNTAKEN)
10678
            continue;
10679
 
10680
          r_symndx = ELF64_R_SYM (rel->r_info);
10681
          if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
10682
                          isec->owner))
10683
            {
10684
              ret = -1;
10685
              break;
10686
            }
10687
 
10688
          /* Calls to dynamic lib functions go through a plt call stub
10689
             that uses r2.  */
10690
          eh = (struct ppc_link_hash_entry *) h;
10691
          if (eh != NULL
10692
              && (eh->elf.plt.plist != NULL
10693
                  || (eh->oh != NULL
10694
                      && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
10695
            {
10696
              ret = 1;
10697
              break;
10698
            }
10699
 
10700
          if (sym_sec == NULL)
10701
            /* Ignore other undefined symbols.  */
10702
            continue;
10703
 
10704
          /* Assume branches to other sections not included in the
10705
             link need stubs too, to cover -R and absolute syms.  */
10706
          if (sym_sec->output_section == NULL)
10707
            {
10708
              ret = 1;
10709
              break;
10710
            }
10711
 
10712
          if (h == NULL)
10713
            sym_value = sym->st_value;
10714
          else
10715
            {
10716
              if (h->root.type != bfd_link_hash_defined
10717
                  && h->root.type != bfd_link_hash_defweak)
10718
                abort ();
10719
              sym_value = h->root.u.def.value;
10720
            }
10721
          sym_value += rel->r_addend;
10722
 
10723
          /* If this branch reloc uses an opd sym, find the code section.  */
10724
          opd = get_opd_info (sym_sec);
10725
          if (opd != NULL)
10726
            {
10727
              if (h == NULL && opd->adjust != NULL)
10728
                {
10729
                  long adjust;
10730
 
10731
                  adjust = opd->adjust[sym->st_value / 8];
10732
                  if (adjust == -1)
10733
                    /* Assume deleted functions won't ever be called.  */
10734
                    continue;
10735
                  sym_value += adjust;
10736
                }
10737
 
10738
              dest = opd_entry_value (sym_sec, sym_value, &sym_sec, NULL);
10739
              if (dest == (bfd_vma) -1)
10740
                continue;
10741
            }
10742
          else
10743
            dest = (sym_value
10744
                    + sym_sec->output_offset
10745
                    + sym_sec->output_section->vma);
10746
 
10747
          /* Ignore branch to self.  */
10748
          if (sym_sec == isec)
10749
            continue;
10750
 
10751
          /* If the called function uses the toc, we need a stub.  */
10752
          if (sym_sec->has_toc_reloc
10753
              || sym_sec->makes_toc_func_call)
10754
            {
10755
              ret = 1;
10756
              break;
10757
            }
10758
 
10759
          /* Assume any branch that needs a long branch stub might in fact
10760
             need a plt_branch stub.  A plt_branch stub uses r2.  */
10761
          else if (dest - (isec->output_offset
10762
                           + isec->output_section->vma
10763
                           + rel->r_offset) + (1 << 25) >= (2 << 25))
10764
            {
10765
              ret = 1;
10766
              break;
10767
            }
10768
 
10769
          /* If calling back to a section in the process of being
10770
             tested, we can't say for sure that no toc adjusting stubs
10771
             are needed, so don't return zero.  */
10772
          else if (sym_sec->call_check_in_progress)
10773
            ret = 2;
10774
 
10775
          /* Branches to another section that itself doesn't have any TOC
10776
             references are OK.  Recursively call ourselves to check.  */
10777
          else if (!sym_sec->call_check_done)
10778
            {
10779
              int recur;
10780
 
10781
              /* Mark current section as indeterminate, so that other
10782
                 sections that call back to current won't be marked as
10783
                 known.  */
10784
              isec->call_check_in_progress = 1;
10785
              recur = toc_adjusting_stub_needed (info, sym_sec);
10786
              isec->call_check_in_progress = 0;
10787
 
10788
              if (recur != 0)
10789
                {
10790
                  ret = recur;
10791
                  if (recur != 2)
10792
                    break;
10793
                }
10794
            }
10795
        }
10796
 
10797
      if (local_syms != NULL
10798
          && (elf_symtab_hdr (isec->owner).contents
10799
              != (unsigned char *) local_syms))
10800
        free (local_syms);
10801
      if (elf_section_data (isec)->relocs != relstart)
10802
        free (relstart);
10803
    }
10804
 
10805
  if ((ret & 1) == 0
10806
      && isec->map_head.s != NULL
10807
      && (strcmp (isec->output_section->name, ".init") == 0
10808
          || strcmp (isec->output_section->name, ".fini") == 0))
10809
    {
10810
      if (isec->map_head.s->has_toc_reloc
10811
          || isec->map_head.s->makes_toc_func_call)
10812
        ret = 1;
10813
      else if (!isec->map_head.s->call_check_done)
10814
        {
10815
          int recur;
10816
          isec->call_check_in_progress = 1;
10817
          recur = toc_adjusting_stub_needed (info, isec->map_head.s);
10818
          isec->call_check_in_progress = 0;
10819
          if (recur != 0)
10820
            ret = recur;
10821
        }
10822
    }
10823
 
10824
  if (ret == 1)
10825
    isec->makes_toc_func_call = 1;
10826
 
10827
  return ret;
10828
}
10829
 
10830
/* The linker repeatedly calls this function for each input section,
10831
   in the order that input sections are linked into output sections.
10832
   Build lists of input sections to determine groupings between which
10833
   we may insert linker stubs.  */
10834
 
10835
bfd_boolean
10836
ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
10837
{
10838
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
10839
 
10840
  if (htab == NULL)
10841
    return FALSE;
10842
 
10843
  if ((isec->output_section->flags & SEC_CODE) != 0
10844
      && isec->output_section->index <= htab->top_index)
10845
    {
10846
      asection **list = htab->input_list + isec->output_section->index;
10847
      /* Steal the link_sec pointer for our list.  */
10848
#define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
10849
      /* This happens to make the list in reverse order,
10850
         which is what we want.  */
10851
      PREV_SEC (isec) = *list;
10852
      *list = isec;
10853
    }
10854
 
10855
  if (htab->multi_toc_needed)
10856
    {
10857
      /* If a code section has a function that uses the TOC then we need
10858
         to use the right TOC (obviously).  Also, make sure that .opd gets
10859
         the correct TOC value for R_PPC64_TOC relocs that don't have or
10860
         can't find their function symbol (shouldn't ever happen now).
10861
         Also specially treat .fixup for the linux kernel.  .fixup
10862
         contains branches, but only back to the function that hit an
10863
         exception.  */
10864
      if (isec->has_toc_reloc
10865
          || (isec->flags & SEC_CODE) == 0
10866
          || strcmp (isec->name, ".fixup") == 0)
10867
        {
10868
          if (elf_gp (isec->owner) != 0)
10869
            htab->toc_curr = elf_gp (isec->owner);
10870
        }
10871
      else
10872
        {
10873
          if (!isec->call_check_done
10874
              && toc_adjusting_stub_needed (info, isec) < 0)
10875
            return FALSE;
10876
          /* If we make a local call from this section, ie. a branch
10877
             without a following nop, then we have no place to put a
10878
             toc restoring insn.  We must use the same toc group as
10879
             the callee.
10880
             Testing makes_toc_func_call actually tests for *any*
10881
             calls to functions that need a good toc pointer.  A more
10882
             precise test would be better, as this one will set
10883
             incorrect values for pasted .init/.fini fragments.
10884
             (Fixed later in check_pasted_section.)  */
10885
          if (isec->makes_toc_func_call
10886
              && elf_gp (isec->owner) != 0)
10887
            htab->toc_curr = elf_gp (isec->owner);
10888
        }
10889
    }
10890
 
10891
  /* Functions that don't use the TOC can belong in any TOC group.
10892
     Use the last TOC base.  */
10893
  htab->stub_group[isec->id].toc_off = htab->toc_curr;
10894
  return TRUE;
10895
}
10896
 
10897
/* Check that all .init and .fini sections use the same toc, if they
10898
   have toc relocs.  */
10899
 
10900
static bfd_boolean
10901
check_pasted_section (struct bfd_link_info *info, const char *name)
10902
{
10903
  asection *o = bfd_get_section_by_name (info->output_bfd, name);
10904
 
10905
  if (o != NULL)
10906
    {
10907
      struct ppc_link_hash_table *htab = ppc_hash_table (info);
10908
      bfd_vma toc_off = 0;
10909
      asection *i;
10910
 
10911
      for (i = o->map_head.s; i != NULL; i = i->map_head.s)
10912
        if (i->has_toc_reloc)
10913
          {
10914
            if (toc_off == 0)
10915
              toc_off = htab->stub_group[i->id].toc_off;
10916
            else if (toc_off != htab->stub_group[i->id].toc_off)
10917
              return FALSE;
10918
          }
10919
 
10920
      if (toc_off == 0)
10921
        for (i = o->map_head.s; i != NULL; i = i->map_head.s)
10922
          if (i->makes_toc_func_call)
10923
            {
10924
              toc_off = htab->stub_group[i->id].toc_off;
10925
              break;
10926
            }
10927
 
10928
      /* Make sure the whole pasted function uses the same toc offset.  */
10929
      if (toc_off != 0)
10930
        for (i = o->map_head.s; i != NULL; i = i->map_head.s)
10931
          htab->stub_group[i->id].toc_off = toc_off;
10932
    }
10933
  return TRUE;
10934
}
10935
 
10936
bfd_boolean
10937
ppc64_elf_check_init_fini (struct bfd_link_info *info)
10938
{
10939
  return (check_pasted_section (info, ".init")
10940
          & check_pasted_section (info, ".fini"));
10941
}
10942
 
10943
/* See whether we can group stub sections together.  Grouping stub
10944
   sections may result in fewer stubs.  More importantly, we need to
10945
   put all .init* and .fini* stubs at the beginning of the .init or
10946
   .fini output sections respectively, because glibc splits the
10947
   _init and _fini functions into multiple parts.  Putting a stub in
10948
   the middle of a function is not a good idea.  */
10949
 
10950
static void
10951
group_sections (struct ppc_link_hash_table *htab,
10952
                bfd_size_type stub_group_size,
10953
                bfd_boolean stubs_always_before_branch)
10954
{
10955
  asection **list;
10956
  bfd_size_type stub14_group_size;
10957
  bfd_boolean suppress_size_errors;
10958
 
10959
  suppress_size_errors = FALSE;
10960
  stub14_group_size = stub_group_size;
10961
  if (stub_group_size == 1)
10962
    {
10963
      /* Default values.  */
10964
      if (stubs_always_before_branch)
10965
        {
10966
          stub_group_size = 0x1e00000;
10967
          stub14_group_size = 0x7800;
10968
        }
10969
      else
10970
        {
10971
          stub_group_size = 0x1c00000;
10972
          stub14_group_size = 0x7000;
10973
        }
10974
      suppress_size_errors = TRUE;
10975
    }
10976
 
10977
  list = htab->input_list + htab->top_index;
10978
  do
10979
    {
10980
      asection *tail = *list;
10981
      while (tail != NULL)
10982
        {
10983
          asection *curr;
10984
          asection *prev;
10985
          bfd_size_type total;
10986
          bfd_boolean big_sec;
10987
          bfd_vma curr_toc;
10988
 
10989
          curr = tail;
10990
          total = tail->size;
10991
          big_sec = total > (ppc64_elf_section_data (tail) != NULL
10992
                             && ppc64_elf_section_data (tail)->has_14bit_branch
10993
                             ? stub14_group_size : stub_group_size);
10994
          if (big_sec && !suppress_size_errors)
10995
            (*_bfd_error_handler) (_("%B section %A exceeds stub group size"),
10996
                                     tail->owner, tail);
10997
          curr_toc = htab->stub_group[tail->id].toc_off;
10998
 
10999
          while ((prev = PREV_SEC (curr)) != NULL
11000
                 && ((total += curr->output_offset - prev->output_offset)
11001
                     < (ppc64_elf_section_data (prev) != NULL
11002
                        && ppc64_elf_section_data (prev)->has_14bit_branch
11003
                        ? stub14_group_size : stub_group_size))
11004
                 && htab->stub_group[prev->id].toc_off == curr_toc)
11005
            curr = prev;
11006
 
11007
          /* OK, the size from the start of CURR to the end is less
11008
             than stub_group_size and thus can be handled by one stub
11009
             section.  (or the tail section is itself larger than
11010
             stub_group_size, in which case we may be toast.)  We
11011
             should really be keeping track of the total size of stubs
11012
             added here, as stubs contribute to the final output
11013
             section size.  That's a little tricky, and this way will
11014
             only break if stubs added make the total size more than
11015
             2^25, ie. for the default stub_group_size, if stubs total
11016
             more than 2097152 bytes, or nearly 75000 plt call stubs.  */
11017
          do
11018
            {
11019
              prev = PREV_SEC (tail);
11020
              /* Set up this stub group.  */
11021
              htab->stub_group[tail->id].link_sec = curr;
11022
            }
11023
          while (tail != curr && (tail = prev) != NULL);
11024
 
11025
          /* But wait, there's more!  Input sections up to stub_group_size
11026
             bytes before the stub section can be handled by it too.
11027
             Don't do this if we have a really large section after the
11028
             stubs, as adding more stubs increases the chance that
11029
             branches may not reach into the stub section.  */
11030
          if (!stubs_always_before_branch && !big_sec)
11031
            {
11032
              total = 0;
11033
              while (prev != NULL
11034
                     && ((total += tail->output_offset - prev->output_offset)
11035
                         < (ppc64_elf_section_data (prev) != NULL
11036
                            && ppc64_elf_section_data (prev)->has_14bit_branch
11037
                            ? stub14_group_size : stub_group_size))
11038
                     && htab->stub_group[prev->id].toc_off == curr_toc)
11039
                {
11040
                  tail = prev;
11041
                  prev = PREV_SEC (tail);
11042
                  htab->stub_group[tail->id].link_sec = curr;
11043
                }
11044
            }
11045
          tail = prev;
11046
        }
11047
    }
11048
  while (list-- != htab->input_list);
11049
  free (htab->input_list);
11050
#undef PREV_SEC
11051
}
11052
 
11053 161 khays
static const unsigned char glink_eh_frame_cie[] =
11054
{
11055
  0, 0, 0, 16,                             /* length.  */
11056
  0, 0, 0, 0,                               /* id.  */
11057
  1,                                    /* CIE version.  */
11058
  'z', 'R', 0,                           /* Augmentation string.  */
11059
  4,                                    /* Code alignment.  */
11060
  0x78,                                 /* Data alignment.  */
11061
  65,                                   /* RA reg.  */
11062
  1,                                    /* Augmentation size.  */
11063
  DW_EH_PE_pcrel | DW_EH_PE_sdata4,     /* FDE encoding.  */
11064
  DW_CFA_def_cfa, 1, 0                   /* def_cfa: r1 offset 0.  */
11065
};
11066
 
11067
/* Stripping output sections is normally done before dynamic section
11068
   symbols have been allocated.  This function is called later, and
11069
   handles cases like htab->brlt which is mapped to its own output
11070
   section.  */
11071
 
11072
static void
11073
maybe_strip_output (struct bfd_link_info *info, asection *isec)
11074
{
11075
  if (isec->size == 0
11076
      && isec->output_section->size == 0
11077
      && !bfd_section_removed_from_list (info->output_bfd,
11078
                                         isec->output_section)
11079
      && elf_section_data (isec->output_section)->dynindx == 0)
11080
    {
11081
      isec->output_section->flags |= SEC_EXCLUDE;
11082
      bfd_section_list_remove (info->output_bfd, isec->output_section);
11083
      info->output_bfd->section_count--;
11084
    }
11085
}
11086
 
11087 14 khays
/* Determine and set the size of the stub section for a final link.
11088
 
11089
   The basic idea here is to examine all the relocations looking for
11090
   PC-relative calls to a target that is unreachable with a "bl"
11091
   instruction.  */
11092
 
11093
bfd_boolean
11094 161 khays
ppc64_elf_size_stubs (struct bfd_link_info *info, bfd_signed_vma group_size,
11095
                      bfd_boolean plt_static_chain)
11096 14 khays
{
11097
  bfd_size_type stub_group_size;
11098
  bfd_boolean stubs_always_before_branch;
11099
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
11100
 
11101
  if (htab == NULL)
11102
    return FALSE;
11103
 
11104 161 khays
  htab->plt_static_chain = plt_static_chain;
11105 14 khays
  stubs_always_before_branch = group_size < 0;
11106
  if (group_size < 0)
11107
    stub_group_size = -group_size;
11108
  else
11109
    stub_group_size = group_size;
11110
 
11111
  group_sections (htab, stub_group_size, stubs_always_before_branch);
11112
 
11113
  while (1)
11114
    {
11115
      bfd *input_bfd;
11116
      unsigned int bfd_indx;
11117
      asection *stub_sec;
11118
 
11119
      htab->stub_iteration += 1;
11120
 
11121
      for (input_bfd = info->input_bfds, bfd_indx = 0;
11122
           input_bfd != NULL;
11123
           input_bfd = input_bfd->link_next, bfd_indx++)
11124
        {
11125
          Elf_Internal_Shdr *symtab_hdr;
11126
          asection *section;
11127
          Elf_Internal_Sym *local_syms = NULL;
11128
 
11129
          if (!is_ppc64_elf (input_bfd))
11130
            continue;
11131
 
11132
          /* We'll need the symbol table in a second.  */
11133
          symtab_hdr = &elf_symtab_hdr (input_bfd);
11134
          if (symtab_hdr->sh_info == 0)
11135
            continue;
11136
 
11137
          /* Walk over each section attached to the input bfd.  */
11138
          for (section = input_bfd->sections;
11139
               section != NULL;
11140
               section = section->next)
11141
            {
11142
              Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
11143
 
11144
              /* If there aren't any relocs, then there's nothing more
11145
                 to do.  */
11146
              if ((section->flags & SEC_RELOC) == 0
11147
                  || (section->flags & SEC_ALLOC) == 0
11148
                  || (section->flags & SEC_LOAD) == 0
11149
                  || (section->flags & SEC_CODE) == 0
11150
                  || section->reloc_count == 0)
11151
                continue;
11152
 
11153
              /* If this section is a link-once section that will be
11154
                 discarded, then don't create any stubs.  */
11155
              if (section->output_section == NULL
11156
                  || section->output_section->owner != info->output_bfd)
11157
                continue;
11158
 
11159
              /* Get the relocs.  */
11160
              internal_relocs
11161
                = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
11162
                                             info->keep_memory);
11163
              if (internal_relocs == NULL)
11164
                goto error_ret_free_local;
11165
 
11166
              /* Now examine each relocation.  */
11167
              irela = internal_relocs;
11168
              irelaend = irela + section->reloc_count;
11169
              for (; irela < irelaend; irela++)
11170
                {
11171
                  enum elf_ppc64_reloc_type r_type;
11172
                  unsigned int r_indx;
11173
                  enum ppc_stub_type stub_type;
11174
                  struct ppc_stub_hash_entry *stub_entry;
11175
                  asection *sym_sec, *code_sec;
11176
                  bfd_vma sym_value, code_value;
11177
                  bfd_vma destination;
11178
                  bfd_boolean ok_dest;
11179
                  struct ppc_link_hash_entry *hash;
11180
                  struct ppc_link_hash_entry *fdh;
11181
                  struct elf_link_hash_entry *h;
11182
                  Elf_Internal_Sym *sym;
11183
                  char *stub_name;
11184
                  const asection *id_sec;
11185
                  struct _opd_sec_data *opd;
11186
                  struct plt_entry *plt_ent;
11187
 
11188
                  r_type = ELF64_R_TYPE (irela->r_info);
11189
                  r_indx = ELF64_R_SYM (irela->r_info);
11190
 
11191
                  if (r_type >= R_PPC64_max)
11192
                    {
11193
                      bfd_set_error (bfd_error_bad_value);
11194
                      goto error_ret_free_internal;
11195
                    }
11196
 
11197
                  /* Only look for stubs on branch instructions.  */
11198
                  if (r_type != R_PPC64_REL24
11199
                      && r_type != R_PPC64_REL14
11200
                      && r_type != R_PPC64_REL14_BRTAKEN
11201
                      && r_type != R_PPC64_REL14_BRNTAKEN)
11202
                    continue;
11203
 
11204
                  /* Now determine the call target, its name, value,
11205
                     section.  */
11206
                  if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
11207
                                  r_indx, input_bfd))
11208
                    goto error_ret_free_internal;
11209
                  hash = (struct ppc_link_hash_entry *) h;
11210
 
11211
                  ok_dest = FALSE;
11212
                  fdh = NULL;
11213
                  sym_value = 0;
11214
                  if (hash == NULL)
11215
                    {
11216
                      sym_value = sym->st_value;
11217
                      ok_dest = TRUE;
11218
                    }
11219
                  else if (hash->elf.root.type == bfd_link_hash_defined
11220
                           || hash->elf.root.type == bfd_link_hash_defweak)
11221
                    {
11222
                      sym_value = hash->elf.root.u.def.value;
11223
                      if (sym_sec->output_section != NULL)
11224
                        ok_dest = TRUE;
11225
                    }
11226
                  else if (hash->elf.root.type == bfd_link_hash_undefweak
11227
                           || hash->elf.root.type == bfd_link_hash_undefined)
11228
                    {
11229
                      /* Recognise an old ABI func code entry sym, and
11230
                         use the func descriptor sym instead if it is
11231
                         defined.  */
11232
                      if (hash->elf.root.root.string[0] == '.'
11233
                          && (fdh = lookup_fdh (hash, htab)) != NULL)
11234
                        {
11235
                          if (fdh->elf.root.type == bfd_link_hash_defined
11236
                              || fdh->elf.root.type == bfd_link_hash_defweak)
11237
                            {
11238
                              sym_sec = fdh->elf.root.u.def.section;
11239
                              sym_value = fdh->elf.root.u.def.value;
11240
                              if (sym_sec->output_section != NULL)
11241
                                ok_dest = TRUE;
11242
                            }
11243
                          else
11244
                            fdh = NULL;
11245
                        }
11246
                    }
11247
                  else
11248
                    {
11249
                      bfd_set_error (bfd_error_bad_value);
11250
                      goto error_ret_free_internal;
11251
                    }
11252
 
11253
                  destination = 0;
11254
                  if (ok_dest)
11255
                    {
11256
                      sym_value += irela->r_addend;
11257
                      destination = (sym_value
11258
                                     + sym_sec->output_offset
11259
                                     + sym_sec->output_section->vma);
11260
                    }
11261
 
11262
                  code_sec = sym_sec;
11263
                  code_value = sym_value;
11264
                  opd = get_opd_info (sym_sec);
11265
                  if (opd != NULL)
11266
                    {
11267
                      bfd_vma dest;
11268
 
11269
                      if (hash == NULL && opd->adjust != NULL)
11270
                        {
11271
                          long adjust = opd->adjust[sym_value / 8];
11272
                          if (adjust == -1)
11273
                            continue;
11274
                          code_value += adjust;
11275
                          sym_value += adjust;
11276
                        }
11277
                      dest = opd_entry_value (sym_sec, sym_value,
11278
                                              &code_sec, &code_value);
11279
                      if (dest != (bfd_vma) -1)
11280
                        {
11281
                          destination = dest;
11282
                          if (fdh != NULL)
11283
                            {
11284
                              /* Fixup old ABI sym to point at code
11285
                                 entry.  */
11286
                              hash->elf.root.type = bfd_link_hash_defweak;
11287
                              hash->elf.root.u.def.section = code_sec;
11288
                              hash->elf.root.u.def.value = code_value;
11289
                            }
11290
                        }
11291
                    }
11292
 
11293
                  /* Determine what (if any) linker stub is needed.  */
11294
                  plt_ent = NULL;
11295
                  stub_type = ppc_type_of_stub (section, irela, &hash,
11296
                                                &plt_ent, destination);
11297
 
11298
                  if (stub_type != ppc_stub_plt_call)
11299
                    {
11300
                      /* Check whether we need a TOC adjusting stub.
11301
                         Since the linker pastes together pieces from
11302
                         different object files when creating the
11303
                         _init and _fini functions, it may be that a
11304
                         call to what looks like a local sym is in
11305
                         fact a call needing a TOC adjustment.  */
11306
                      if (code_sec != NULL
11307
                          && code_sec->output_section != NULL
11308
                          && (htab->stub_group[code_sec->id].toc_off
11309
                              != htab->stub_group[section->id].toc_off)
11310
                          && (code_sec->has_toc_reloc
11311
                              || code_sec->makes_toc_func_call))
11312
                        stub_type = ppc_stub_long_branch_r2off;
11313
                    }
11314
 
11315
                  if (stub_type == ppc_stub_none)
11316
                    continue;
11317
 
11318
                  /* __tls_get_addr calls might be eliminated.  */
11319
                  if (stub_type != ppc_stub_plt_call
11320
                      && hash != NULL
11321
                      && (hash == htab->tls_get_addr
11322
                          || hash == htab->tls_get_addr_fd)
11323
                      && section->has_tls_reloc
11324
                      && irela != internal_relocs)
11325
                    {
11326
                      /* Get tls info.  */
11327
                      unsigned char *tls_mask;
11328
 
11329
                      if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
11330
                                         irela - 1, input_bfd))
11331
                        goto error_ret_free_internal;
11332
                      if (*tls_mask != 0)
11333
                        continue;
11334
                    }
11335
 
11336 163 khays
                  if (stub_type == ppc_stub_plt_call
11337
                      && irela + 1 < irelaend
11338
                      && irela[1].r_offset == irela->r_offset + 4
11339
                      && ELF64_R_TYPE (irela[1].r_info) == R_PPC64_TOCSAVE
11340
                      && !tocsave_find (htab, INSERT,
11341
                                        &local_syms, irela + 1, input_bfd))
11342
                    goto error_ret_free_internal;
11343
 
11344 14 khays
                  /* Support for grouping stub sections.  */
11345
                  id_sec = htab->stub_group[section->id].link_sec;
11346
 
11347
                  /* Get the name of this stub.  */
11348
                  stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
11349
                  if (!stub_name)
11350
                    goto error_ret_free_internal;
11351
 
11352
                  stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
11353
                                                     stub_name, FALSE, FALSE);
11354
                  if (stub_entry != NULL)
11355
                    {
11356
                      /* The proper stub has already been created.  */
11357
                      free (stub_name);
11358
                      continue;
11359
                    }
11360
 
11361
                  stub_entry = ppc_add_stub (stub_name, section, info);
11362
                  if (stub_entry == NULL)
11363
                    {
11364
                      free (stub_name);
11365
                    error_ret_free_internal:
11366
                      if (elf_section_data (section)->relocs == NULL)
11367
                        free (internal_relocs);
11368
                    error_ret_free_local:
11369
                      if (local_syms != NULL
11370
                          && (symtab_hdr->contents
11371
                              != (unsigned char *) local_syms))
11372
                        free (local_syms);
11373
                      return FALSE;
11374
                    }
11375
 
11376
                  stub_entry->stub_type = stub_type;
11377
                  if (stub_type != ppc_stub_plt_call)
11378
                    {
11379
                      stub_entry->target_value = code_value;
11380
                      stub_entry->target_section = code_sec;
11381
                    }
11382
                  else
11383
                    {
11384
                      stub_entry->target_value = sym_value;
11385
                      stub_entry->target_section = sym_sec;
11386
                    }
11387
                  stub_entry->h = hash;
11388
                  stub_entry->plt_ent = plt_ent;
11389
                  stub_entry->addend = irela->r_addend;
11390
 
11391
                  if (stub_entry->h != NULL)
11392
                    htab->stub_globals += 1;
11393
                }
11394
 
11395
              /* We're done with the internal relocs, free them.  */
11396
              if (elf_section_data (section)->relocs != internal_relocs)
11397
                free (internal_relocs);
11398
            }
11399
 
11400
          if (local_syms != NULL
11401
              && symtab_hdr->contents != (unsigned char *) local_syms)
11402
            {
11403
              if (!info->keep_memory)
11404
                free (local_syms);
11405
              else
11406
                symtab_hdr->contents = (unsigned char *) local_syms;
11407
            }
11408
        }
11409
 
11410
      /* We may have added some stubs.  Find out the new size of the
11411
         stub sections.  */
11412
      for (stub_sec = htab->stub_bfd->sections;
11413
           stub_sec != NULL;
11414
           stub_sec = stub_sec->next)
11415
        if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
11416
          {
11417
            stub_sec->rawsize = stub_sec->size;
11418
            stub_sec->size = 0;
11419
            stub_sec->reloc_count = 0;
11420
            stub_sec->flags &= ~SEC_RELOC;
11421
          }
11422
 
11423
      htab->brlt->size = 0;
11424
      htab->brlt->reloc_count = 0;
11425
      htab->brlt->flags &= ~SEC_RELOC;
11426
      if (htab->relbrlt != NULL)
11427
        htab->relbrlt->size = 0;
11428
 
11429
      bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
11430
 
11431
      if (info->emitrelocations
11432
          && htab->glink != NULL && htab->glink->size != 0)
11433
        {
11434
          htab->glink->reloc_count = 1;
11435
          htab->glink->flags |= SEC_RELOC;
11436
        }
11437
 
11438 161 khays
      if (htab->glink_eh_frame != NULL
11439
          && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
11440
          && (htab->glink_eh_frame->flags & SEC_EXCLUDE) == 0)
11441
        {
11442
          bfd_size_type size = 0;
11443
 
11444
          for (stub_sec = htab->stub_bfd->sections;
11445
               stub_sec != NULL;
11446
               stub_sec = stub_sec->next)
11447
            if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
11448
              size += 20;
11449
          if (htab->glink != NULL && htab->glink->size != 0)
11450
            size += 24;
11451
          if (size != 0)
11452
            size += sizeof (glink_eh_frame_cie);
11453
          htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
11454
          htab->glink_eh_frame->size = size;
11455
        }
11456
 
11457 14 khays
      for (stub_sec = htab->stub_bfd->sections;
11458
           stub_sec != NULL;
11459
           stub_sec = stub_sec->next)
11460
        if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
11461
            && stub_sec->rawsize != stub_sec->size)
11462
          break;
11463
 
11464
      /* Exit from this loop when no stubs have been added, and no stubs
11465
         have changed size.  */
11466 161 khays
      if (stub_sec == NULL
11467
          && (htab->glink_eh_frame == NULL
11468
              || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size))
11469 14 khays
        break;
11470
 
11471
      /* Ask the linker to do its stuff.  */
11472
      (*htab->layout_sections_again) ();
11473
    }
11474
 
11475 161 khays
  maybe_strip_output (info, htab->brlt);
11476
  if (htab->glink_eh_frame != NULL)
11477
    maybe_strip_output (info, htab->glink_eh_frame);
11478 14 khays
 
11479
  return TRUE;
11480
}
11481
 
11482
/* Called after we have determined section placement.  If sections
11483
   move, we'll be called again.  Provide a value for TOCstart.  */
11484
 
11485
bfd_vma
11486
ppc64_elf_toc (bfd *obfd)
11487
{
11488
  asection *s;
11489
  bfd_vma TOCstart;
11490
 
11491
  /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
11492
     order.  The TOC starts where the first of these sections starts.  */
11493
  s = bfd_get_section_by_name (obfd, ".got");
11494
  if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
11495
    s = bfd_get_section_by_name (obfd, ".toc");
11496
  if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
11497
    s = bfd_get_section_by_name (obfd, ".tocbss");
11498
  if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
11499
    s = bfd_get_section_by_name (obfd, ".plt");
11500
  if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
11501
    {
11502
      /* This may happen for
11503
         o  references to TOC base (SYM@toc / TOC[tc0]) without a
11504
         .toc directive
11505
         o  bad linker script
11506
         o --gc-sections and empty TOC sections
11507
 
11508
         FIXME: Warn user?  */
11509
 
11510
      /* Look for a likely section.  We probably won't even be
11511
         using TOCstart.  */
11512
      for (s = obfd->sections; s != NULL; s = s->next)
11513
        if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
11514
                         | SEC_EXCLUDE))
11515
            == (SEC_ALLOC | SEC_SMALL_DATA))
11516
          break;
11517
      if (s == NULL)
11518
        for (s = obfd->sections; s != NULL; s = s->next)
11519
          if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
11520
              == (SEC_ALLOC | SEC_SMALL_DATA))
11521
            break;
11522
      if (s == NULL)
11523
        for (s = obfd->sections; s != NULL; s = s->next)
11524
          if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
11525
              == SEC_ALLOC)
11526
            break;
11527
      if (s == NULL)
11528
        for (s = obfd->sections; s != NULL; s = s->next)
11529
          if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
11530
            break;
11531
    }
11532
 
11533
  TOCstart = 0;
11534
  if (s != NULL)
11535
    TOCstart = s->output_section->vma + s->output_offset;
11536
 
11537
  return TOCstart;
11538
}
11539
 
11540
/* Build all the stubs associated with the current output file.
11541
   The stubs are kept in a hash table attached to the main linker
11542
   hash table.  This function is called via gldelf64ppc_finish.  */
11543
 
11544
bfd_boolean
11545
ppc64_elf_build_stubs (bfd_boolean emit_stub_syms,
11546
                       struct bfd_link_info *info,
11547
                       char **stats)
11548
{
11549
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
11550
  asection *stub_sec;
11551
  bfd_byte *p;
11552
  int stub_sec_count = 0;
11553
 
11554
  if (htab == NULL)
11555
    return FALSE;
11556
 
11557
  htab->emit_stub_syms = emit_stub_syms;
11558
 
11559
  /* Allocate memory to hold the linker stubs.  */
11560
  for (stub_sec = htab->stub_bfd->sections;
11561
       stub_sec != NULL;
11562
       stub_sec = stub_sec->next)
11563
    if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
11564
        && stub_sec->size != 0)
11565
      {
11566
        stub_sec->contents = bfd_zalloc (htab->stub_bfd, stub_sec->size);
11567
        if (stub_sec->contents == NULL)
11568
          return FALSE;
11569
        /* We want to check that built size is the same as calculated
11570
           size.  rawsize is a convenient location to use.  */
11571
        stub_sec->rawsize = stub_sec->size;
11572
        stub_sec->size = 0;
11573
      }
11574
 
11575
  if (htab->glink != NULL && htab->glink->size != 0)
11576
    {
11577
      unsigned int indx;
11578
      bfd_vma plt0;
11579
 
11580
      /* Build the .glink plt call stub.  */
11581
      if (htab->emit_stub_syms)
11582
        {
11583
          struct elf_link_hash_entry *h;
11584
          h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
11585
                                    TRUE, FALSE, FALSE);
11586
          if (h == NULL)
11587
            return FALSE;
11588
          if (h->root.type == bfd_link_hash_new)
11589
            {
11590
              h->root.type = bfd_link_hash_defined;
11591
              h->root.u.def.section = htab->glink;
11592
              h->root.u.def.value = 8;
11593
              h->ref_regular = 1;
11594
              h->def_regular = 1;
11595
              h->ref_regular_nonweak = 1;
11596
              h->forced_local = 1;
11597
              h->non_elf = 0;
11598
            }
11599
        }
11600
      plt0 = htab->plt->output_section->vma + htab->plt->output_offset - 16;
11601
      if (info->emitrelocations)
11602
        {
11603
          Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
11604
          if (r == NULL)
11605
            return FALSE;
11606
          r->r_offset = (htab->glink->output_offset
11607
                         + htab->glink->output_section->vma);
11608
          r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
11609
          r->r_addend = plt0;
11610
        }
11611
      p = htab->glink->contents;
11612
      plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
11613
      bfd_put_64 (htab->glink->owner, plt0, p);
11614
      p += 8;
11615
      bfd_put_32 (htab->glink->owner, MFLR_R12, p);
11616
      p += 4;
11617
      bfd_put_32 (htab->glink->owner, BCL_20_31, p);
11618
      p += 4;
11619
      bfd_put_32 (htab->glink->owner, MFLR_R11, p);
11620
      p += 4;
11621
      bfd_put_32 (htab->glink->owner, LD_R2_M16R11, p);
11622
      p += 4;
11623
      bfd_put_32 (htab->glink->owner, MTLR_R12, p);
11624
      p += 4;
11625
      bfd_put_32 (htab->glink->owner, ADD_R12_R2_R11, p);
11626
      p += 4;
11627
      bfd_put_32 (htab->glink->owner, LD_R11_0R12, p);
11628
      p += 4;
11629
      bfd_put_32 (htab->glink->owner, LD_R2_0R12 | 8, p);
11630
      p += 4;
11631
      bfd_put_32 (htab->glink->owner, MTCTR_R11, p);
11632
      p += 4;
11633
      bfd_put_32 (htab->glink->owner, LD_R11_0R12 | 16, p);
11634
      p += 4;
11635
      bfd_put_32 (htab->glink->owner, BCTR, p);
11636
      p += 4;
11637
      while (p - htab->glink->contents < GLINK_CALL_STUB_SIZE)
11638
        {
11639
          bfd_put_32 (htab->glink->owner, NOP, p);
11640
          p += 4;
11641
        }
11642
 
11643
      /* Build the .glink lazy link call stubs.  */
11644
      indx = 0;
11645
      while (p < htab->glink->contents + htab->glink->size)
11646
        {
11647
          if (indx < 0x8000)
11648
            {
11649
              bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
11650
              p += 4;
11651
            }
11652
          else
11653
            {
11654
              bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
11655
              p += 4;
11656
              bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx), p);
11657
              p += 4;
11658
            }
11659
          bfd_put_32 (htab->glink->owner,
11660
                      B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
11661
          indx++;
11662
          p += 4;
11663
        }
11664
      htab->glink->rawsize = p - htab->glink->contents;
11665
    }
11666
 
11667
  if (htab->brlt->size != 0)
11668
    {
11669
      htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
11670
                                         htab->brlt->size);
11671
      if (htab->brlt->contents == NULL)
11672
        return FALSE;
11673
    }
11674
  if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
11675
    {
11676
      htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
11677
                                            htab->relbrlt->size);
11678
      if (htab->relbrlt->contents == NULL)
11679
        return FALSE;
11680
    }
11681
 
11682 161 khays
  if (htab->glink_eh_frame != NULL
11683
      && htab->glink_eh_frame->size != 0)
11684
    {
11685
      bfd_vma val;
11686
 
11687
      p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size);
11688
      if (p == NULL)
11689
        return FALSE;
11690
      htab->glink_eh_frame->contents = p;
11691
 
11692
      htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
11693
 
11694
      memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
11695
      /* CIE length (rewrite in case little-endian).  */
11696
      bfd_put_32 (htab->elf.dynobj, sizeof (glink_eh_frame_cie) - 4, p);
11697
      p += sizeof (glink_eh_frame_cie);
11698
 
11699
      for (stub_sec = htab->stub_bfd->sections;
11700
           stub_sec != NULL;
11701
           stub_sec = stub_sec->next)
11702
        if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
11703
          {
11704
            /* FDE length.  */
11705
            bfd_put_32 (htab->elf.dynobj, 16, p);
11706
            p += 4;
11707
            /* CIE pointer.  */
11708
            val = p - htab->glink_eh_frame->contents;
11709
            bfd_put_32 (htab->elf.dynobj, val, p);
11710
            p += 4;
11711
            /* Offset to stub section.  */
11712
            val = (stub_sec->output_section->vma
11713
                   + stub_sec->output_offset);
11714
            val -= (htab->glink_eh_frame->output_section->vma
11715
                    + htab->glink_eh_frame->output_offset);
11716
            val -= p - htab->glink_eh_frame->contents;
11717
            if (val + 0x80000000 > 0xffffffff)
11718
              {
11719
                info->callbacks->einfo
11720
                  (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
11721
                   stub_sec->name);
11722
                return FALSE;
11723
              }
11724
            bfd_put_32 (htab->elf.dynobj, val, p);
11725
            p += 4;
11726
            /* stub section size.  */
11727
            bfd_put_32 (htab->elf.dynobj, stub_sec->rawsize, p);
11728
            p += 4;
11729
            /* Augmentation.  */
11730
            p += 1;
11731
            /* Pad.  */
11732
            p += 3;
11733
          }
11734
      if (htab->glink != NULL && htab->glink->size != 0)
11735
        {
11736
          /* FDE length.  */
11737
          bfd_put_32 (htab->elf.dynobj, 20, p);
11738
          p += 4;
11739
          /* CIE pointer.  */
11740
          val = p - htab->glink_eh_frame->contents;
11741
          bfd_put_32 (htab->elf.dynobj, val, p);
11742
          p += 4;
11743
          /* Offset to .glink.  */
11744
          val = (htab->glink->output_section->vma
11745
                 + htab->glink->output_offset
11746
                 + 8);
11747
          val -= (htab->glink_eh_frame->output_section->vma
11748
                  + htab->glink_eh_frame->output_offset);
11749
          val -= p - htab->glink_eh_frame->contents;
11750
          if (val + 0x80000000 > 0xffffffff)
11751
            {
11752
              info->callbacks->einfo
11753
                (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
11754
                 htab->glink->name);
11755
              return FALSE;
11756
            }
11757
          bfd_put_32 (htab->elf.dynobj, val, p);
11758
          p += 4;
11759
          /* .glink size.  */
11760
          bfd_put_32 (htab->elf.dynobj, htab->glink->rawsize - 8, p);
11761
          p += 4;
11762
          /* Augmentation.  */
11763
          p += 1;
11764
 
11765
          *p++ = DW_CFA_advance_loc + 1;
11766
          *p++ = DW_CFA_register;
11767
          *p++ = 65;
11768
          *p++ = 12;
11769
          *p++ = DW_CFA_advance_loc + 4;
11770
          *p++ = DW_CFA_restore_extended;
11771
          *p++ = 65;
11772
        }
11773
      htab->glink_eh_frame->size = p - htab->glink_eh_frame->contents;
11774
    }
11775
 
11776 14 khays
  /* Build the stubs as directed by the stub hash table.  */
11777
  bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
11778
 
11779
  if (htab->relbrlt != NULL)
11780
    htab->relbrlt->reloc_count = 0;
11781
 
11782
  for (stub_sec = htab->stub_bfd->sections;
11783
       stub_sec != NULL;
11784
       stub_sec = stub_sec->next)
11785
    if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
11786
      {
11787
        stub_sec_count += 1;
11788
        if (stub_sec->rawsize != stub_sec->size)
11789
          break;
11790
      }
11791
 
11792
  if (stub_sec != NULL
11793 161 khays
      || htab->glink->rawsize != htab->glink->size
11794
      || (htab->glink_eh_frame != NULL
11795
          && htab->glink_eh_frame->rawsize != htab->glink_eh_frame->size))
11796 14 khays
    {
11797
      htab->stub_error = TRUE;
11798 161 khays
      info->callbacks->einfo (_("%P: stubs don't match calculated size\n"));
11799 14 khays
    }
11800
 
11801
  if (htab->stub_error)
11802
    return FALSE;
11803
 
11804
  if (stats != NULL)
11805
    {
11806
      *stats = bfd_malloc (500);
11807
      if (*stats == NULL)
11808
        return FALSE;
11809
 
11810
      sprintf (*stats, _("linker stubs in %u group%s\n"
11811
                         "  branch       %lu\n"
11812
                         "  toc adjust   %lu\n"
11813
                         "  long branch  %lu\n"
11814
                         "  long toc adj %lu\n"
11815
                         "  plt call     %lu"),
11816
               stub_sec_count,
11817
               stub_sec_count == 1 ? "" : "s",
11818
               htab->stub_count[ppc_stub_long_branch - 1],
11819
               htab->stub_count[ppc_stub_long_branch_r2off - 1],
11820
               htab->stub_count[ppc_stub_plt_branch - 1],
11821
               htab->stub_count[ppc_stub_plt_branch_r2off - 1],
11822
               htab->stub_count[ppc_stub_plt_call - 1]);
11823
    }
11824
  return TRUE;
11825
}
11826
 
11827
/* This function undoes the changes made by add_symbol_adjust.  */
11828
 
11829
static bfd_boolean
11830
undo_symbol_twiddle (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
11831
{
11832
  struct ppc_link_hash_entry *eh;
11833
 
11834
  if (h->root.type == bfd_link_hash_indirect)
11835
    return TRUE;
11836
 
11837
  eh = (struct ppc_link_hash_entry *) h;
11838
  if (eh->elf.root.type != bfd_link_hash_undefweak || !eh->was_undefined)
11839
    return TRUE;
11840
 
11841
  eh->elf.root.type = bfd_link_hash_undefined;
11842
  return TRUE;
11843
}
11844
 
11845
void
11846
ppc64_elf_restore_symbols (struct bfd_link_info *info)
11847
{
11848
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
11849
 
11850
  if (htab != NULL)
11851
    elf_link_hash_traverse (&htab->elf, undo_symbol_twiddle, info);
11852
}
11853
 
11854
/* What to do when ld finds relocations against symbols defined in
11855
   discarded sections.  */
11856
 
11857
static unsigned int
11858
ppc64_elf_action_discarded (asection *sec)
11859
{
11860
  if (strcmp (".opd", sec->name) == 0)
11861
    return 0;
11862
 
11863
  if (strcmp (".toc", sec->name) == 0)
11864
    return 0;
11865
 
11866
  if (strcmp (".toc1", sec->name) == 0)
11867
    return 0;
11868
 
11869
  return _bfd_elf_default_action_discarded (sec);
11870
}
11871
 
11872
/* The RELOCATE_SECTION function is called by the ELF backend linker
11873
   to handle the relocations for a section.
11874
 
11875
   The relocs are always passed as Rela structures; if the section
11876
   actually uses Rel structures, the r_addend field will always be
11877
   zero.
11878
 
11879
   This function is responsible for adjust the section contents as
11880
   necessary, and (if using Rela relocs and generating a
11881
   relocatable output file) adjusting the reloc addend as
11882
   necessary.
11883
 
11884
   This function does not have to worry about setting the reloc
11885
   address or the reloc symbol index.
11886
 
11887
   LOCAL_SYMS is a pointer to the swapped in local symbols.
11888
 
11889
   LOCAL_SECTIONS is an array giving the section in the input file
11890
   corresponding to the st_shndx field of each local symbol.
11891
 
11892
   The global hash table entry for the global symbols can be found
11893
   via elf_sym_hashes (input_bfd).
11894
 
11895
   When generating relocatable output, this function must handle
11896
   STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
11897
   going to be the section symbol corresponding to the output
11898
   section, which means that the addend must be adjusted
11899
   accordingly.  */
11900
 
11901
static bfd_boolean
11902
ppc64_elf_relocate_section (bfd *output_bfd,
11903
                            struct bfd_link_info *info,
11904
                            bfd *input_bfd,
11905
                            asection *input_section,
11906
                            bfd_byte *contents,
11907
                            Elf_Internal_Rela *relocs,
11908
                            Elf_Internal_Sym *local_syms,
11909
                            asection **local_sections)
11910
{
11911
  struct ppc_link_hash_table *htab;
11912
  Elf_Internal_Shdr *symtab_hdr;
11913
  struct elf_link_hash_entry **sym_hashes;
11914
  Elf_Internal_Rela *rel;
11915
  Elf_Internal_Rela *relend;
11916
  Elf_Internal_Rela outrel;
11917
  bfd_byte *loc;
11918
  struct got_entry **local_got_ents;
11919
  bfd_vma TOCstart;
11920
  bfd_boolean ret = TRUE;
11921
  bfd_boolean is_opd;
11922
  /* Disabled until we sort out how ld should choose 'y' vs 'at'.  */
11923
  bfd_boolean is_power4 = FALSE;
11924
  bfd_vma d_offset = (bfd_big_endian (output_bfd) ? 2 : 0);
11925
 
11926
  /* Initialize howto table if needed.  */
11927
  if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
11928
    ppc_howto_init ();
11929
 
11930
  htab = ppc_hash_table (info);
11931
  if (htab == NULL)
11932
    return FALSE;
11933
 
11934
  /* Don't relocate stub sections.  */
11935
  if (input_section->owner == htab->stub_bfd)
11936
    return TRUE;
11937
 
11938
  BFD_ASSERT (is_ppc64_elf (input_bfd));
11939
 
11940
  local_got_ents = elf_local_got_ents (input_bfd);
11941
  TOCstart = elf_gp (output_bfd);
11942
  symtab_hdr = &elf_symtab_hdr (input_bfd);
11943
  sym_hashes = elf_sym_hashes (input_bfd);
11944
  is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
11945
 
11946
  rel = relocs;
11947
  relend = relocs + input_section->reloc_count;
11948
  for (; rel < relend; rel++)
11949
    {
11950
      enum elf_ppc64_reloc_type r_type;
11951
      bfd_vma addend, orig_addend;
11952
      bfd_reloc_status_type r;
11953
      Elf_Internal_Sym *sym;
11954
      asection *sec;
11955
      struct elf_link_hash_entry *h_elf;
11956
      struct ppc_link_hash_entry *h;
11957
      struct ppc_link_hash_entry *fdh;
11958
      const char *sym_name;
11959
      unsigned long r_symndx, toc_symndx;
11960
      bfd_vma toc_addend;
11961
      unsigned char tls_mask, tls_gd, tls_type;
11962
      unsigned char sym_type;
11963
      bfd_vma relocation;
11964
      bfd_boolean unresolved_reloc;
11965
      bfd_boolean warned;
11966
      unsigned int insn;
11967
      unsigned int mask;
11968
      struct ppc_stub_hash_entry *stub_entry;
11969
      bfd_vma max_br_offset;
11970
      bfd_vma from;
11971
 
11972
      r_type = ELF64_R_TYPE (rel->r_info);
11973
      r_symndx = ELF64_R_SYM (rel->r_info);
11974
 
11975
      /* For old style R_PPC64_TOC relocs with a zero symbol, use the
11976
         symbol of the previous ADDR64 reloc.  The symbol gives us the
11977
         proper TOC base to use.  */
11978
      if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
11979
          && rel != relocs
11980
          && ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_ADDR64
11981
          && is_opd)
11982
        r_symndx = ELF64_R_SYM (rel[-1].r_info);
11983
 
11984
      sym = NULL;
11985
      sec = NULL;
11986
      h_elf = NULL;
11987
      sym_name = NULL;
11988
      unresolved_reloc = FALSE;
11989
      warned = FALSE;
11990
      orig_addend = rel->r_addend;
11991
 
11992
      if (r_symndx < symtab_hdr->sh_info)
11993
        {
11994
          /* It's a local symbol.  */
11995
          struct _opd_sec_data *opd;
11996
 
11997
          sym = local_syms + r_symndx;
11998
          sec = local_sections[r_symndx];
11999
          sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
12000
          sym_type = ELF64_ST_TYPE (sym->st_info);
12001
          relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
12002
          opd = get_opd_info (sec);
12003
          if (opd != NULL && opd->adjust != NULL)
12004
            {
12005
              long adjust = opd->adjust[(sym->st_value + rel->r_addend) / 8];
12006
              if (adjust == -1)
12007
                relocation = 0;
12008
              else
12009
                {
12010
                  /* If this is a relocation against the opd section sym
12011
                     and we have edited .opd, adjust the reloc addend so
12012
                     that ld -r and ld --emit-relocs output is correct.
12013
                     If it is a reloc against some other .opd symbol,
12014
                     then the symbol value will be adjusted later.  */
12015
                  if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
12016
                    rel->r_addend += adjust;
12017
                  else
12018
                    relocation += adjust;
12019
                }
12020
            }
12021
        }
12022
      else
12023
        {
12024
          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
12025
                                   r_symndx, symtab_hdr, sym_hashes,
12026
                                   h_elf, sec, relocation,
12027
                                   unresolved_reloc, warned);
12028
          sym_name = h_elf->root.root.string;
12029
          sym_type = h_elf->type;
12030
        }
12031
      h = (struct ppc_link_hash_entry *) h_elf;
12032
 
12033
      if (sec != NULL && elf_discarded_section (sec))
12034
        RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
12035
                                         rel, relend,
12036
                                         ppc64_elf_howto_table[r_type],
12037
                                         contents);
12038
 
12039
      if (info->relocatable)
12040
        continue;
12041
 
12042
      /* TLS optimizations.  Replace instruction sequences and relocs
12043
         based on information we collected in tls_optimize.  We edit
12044
         RELOCS so that --emit-relocs will output something sensible
12045
         for the final instruction stream.  */
12046
      tls_mask = 0;
12047
      tls_gd = 0;
12048
      toc_symndx = 0;
12049
      if (h != NULL)
12050
        tls_mask = h->tls_mask;
12051
      else if (local_got_ents != NULL)
12052
        {
12053
          struct plt_entry **local_plt = (struct plt_entry **)
12054
            (local_got_ents + symtab_hdr->sh_info);
12055
          unsigned char *lgot_masks = (unsigned char *)
12056
            (local_plt + symtab_hdr->sh_info);
12057
          tls_mask = lgot_masks[r_symndx];
12058
        }
12059
      if (tls_mask == 0
12060
          && (r_type == R_PPC64_TLS
12061
              || r_type == R_PPC64_TLSGD
12062
              || r_type == R_PPC64_TLSLD))
12063
        {
12064
          /* Check for toc tls entries.  */
12065
          unsigned char *toc_tls;
12066
 
12067
          if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
12068
                             &local_syms, rel, input_bfd))
12069
            return FALSE;
12070
 
12071
          if (toc_tls)
12072
            tls_mask = *toc_tls;
12073
        }
12074
 
12075
      /* Check that tls relocs are used with tls syms, and non-tls
12076
         relocs are used with non-tls syms.  */
12077
      if (r_symndx != STN_UNDEF
12078
          && r_type != R_PPC64_NONE
12079
          && (h == NULL
12080
              || h->elf.root.type == bfd_link_hash_defined
12081
              || h->elf.root.type == bfd_link_hash_defweak)
12082
          && (IS_PPC64_TLS_RELOC (r_type)
12083
              != (sym_type == STT_TLS
12084
                  || (sym_type == STT_SECTION
12085
                      && (sec->flags & SEC_THREAD_LOCAL) != 0))))
12086
        {
12087
          if (tls_mask != 0
12088
              && (r_type == R_PPC64_TLS
12089
                  || r_type == R_PPC64_TLSGD
12090
                  || r_type == R_PPC64_TLSLD))
12091
            /* R_PPC64_TLS is OK against a symbol in the TOC.  */
12092
            ;
12093
          else
12094
            info->callbacks->einfo
12095
              (!IS_PPC64_TLS_RELOC (r_type)
12096 161 khays
               ? _("%P: %H: %s used with TLS symbol %s\n")
12097
               : _("%P: %H: %s used with non-TLS symbol %s\n"),
12098 14 khays
               input_bfd, input_section, rel->r_offset,
12099
               ppc64_elf_howto_table[r_type]->name,
12100
               sym_name);
12101
        }
12102
 
12103
      /* Ensure reloc mapping code below stays sane.  */
12104
      if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
12105
          || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
12106
          || (R_PPC64_GOT_TLSLD16 & 3)    != (R_PPC64_GOT_TLSGD16 & 3)
12107
          || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
12108
          || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
12109
          || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
12110
          || (R_PPC64_GOT_TLSLD16 & 3)    != (R_PPC64_GOT_TPREL16_DS & 3)
12111
          || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
12112
          || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
12113
          || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
12114
        abort ();
12115
 
12116
      switch (r_type)
12117
        {
12118
        default:
12119
          break;
12120
 
12121
        case R_PPC64_LO_DS_OPT:
12122
          insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
12123
          if ((insn & (0x3f << 26)) != 58u << 26)
12124
            abort ();
12125
          insn += (14u << 26) - (58u << 26);
12126
          bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
12127
          r_type = R_PPC64_TOC16_LO;
12128
          rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12129
          break;
12130
 
12131
        case R_PPC64_TOC16:
12132
        case R_PPC64_TOC16_LO:
12133
        case R_PPC64_TOC16_DS:
12134
        case R_PPC64_TOC16_LO_DS:
12135
          {
12136
            /* Check for toc tls entries.  */
12137
            unsigned char *toc_tls;
12138
            int retval;
12139
 
12140
            retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
12141
                                   &local_syms, rel, input_bfd);
12142
            if (retval == 0)
12143
              return FALSE;
12144
 
12145
            if (toc_tls)
12146
              {
12147
                tls_mask = *toc_tls;
12148
                if (r_type == R_PPC64_TOC16_DS
12149
                    || r_type == R_PPC64_TOC16_LO_DS)
12150
                  {
12151
                    if (tls_mask != 0
12152
                        && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
12153
                      goto toctprel;
12154
                  }
12155
                else
12156
                  {
12157
                    /* If we found a GD reloc pair, then we might be
12158
                       doing a GD->IE transition.  */
12159
                    if (retval == 2)
12160
                      {
12161
                        tls_gd = TLS_TPRELGD;
12162
                        if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
12163
                          goto tls_ldgd_opt;
12164
                      }
12165
                    else if (retval == 3)
12166
                      {
12167
                        if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
12168
                          goto tls_ldgd_opt;
12169
                      }
12170
                  }
12171
              }
12172
          }
12173
          break;
12174
 
12175
        case R_PPC64_GOT_TPREL16_HI:
12176
        case R_PPC64_GOT_TPREL16_HA:
12177
          if (tls_mask != 0
12178
              && (tls_mask & TLS_TPREL) == 0)
12179
            {
12180
              rel->r_offset -= d_offset;
12181
              bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
12182
              r_type = R_PPC64_NONE;
12183
              rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12184
            }
12185
          break;
12186
 
12187
        case R_PPC64_GOT_TPREL16_DS:
12188
        case R_PPC64_GOT_TPREL16_LO_DS:
12189
          if (tls_mask != 0
12190
              && (tls_mask & TLS_TPREL) == 0)
12191
            {
12192
            toctprel:
12193
              insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
12194
              insn &= 31 << 21;
12195
              insn |= 0x3c0d0000;       /* addis 0,13,0 */
12196
              bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
12197
              r_type = R_PPC64_TPREL16_HA;
12198
              if (toc_symndx != 0)
12199
                {
12200
                  rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
12201
                  rel->r_addend = toc_addend;
12202
                  /* We changed the symbol.  Start over in order to
12203
                     get h, sym, sec etc. right.  */
12204
                  rel--;
12205
                  continue;
12206
                }
12207
              else
12208
                rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12209
            }
12210
          break;
12211
 
12212
        case R_PPC64_TLS:
12213
          if (tls_mask != 0
12214
              && (tls_mask & TLS_TPREL) == 0)
12215
            {
12216
              insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
12217
              insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
12218
              if (insn == 0)
12219
                abort ();
12220
              bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
12221
              /* Was PPC64_TLS which sits on insn boundary, now
12222
                 PPC64_TPREL16_LO which is at low-order half-word.  */
12223
              rel->r_offset += d_offset;
12224
              r_type = R_PPC64_TPREL16_LO;
12225
              if (toc_symndx != 0)
12226
                {
12227
                  rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
12228
                  rel->r_addend = toc_addend;
12229
                  /* We changed the symbol.  Start over in order to
12230
                     get h, sym, sec etc. right.  */
12231
                  rel--;
12232
                  continue;
12233
                }
12234
              else
12235
                rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12236
            }
12237
          break;
12238
 
12239
        case R_PPC64_GOT_TLSGD16_HI:
12240
        case R_PPC64_GOT_TLSGD16_HA:
12241
          tls_gd = TLS_TPRELGD;
12242
          if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
12243
            goto tls_gdld_hi;
12244
          break;
12245
 
12246
        case R_PPC64_GOT_TLSLD16_HI:
12247
        case R_PPC64_GOT_TLSLD16_HA:
12248
          if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
12249
            {
12250
            tls_gdld_hi:
12251
              if ((tls_mask & tls_gd) != 0)
12252
                r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
12253
                          + R_PPC64_GOT_TPREL16_DS);
12254
              else
12255
                {
12256
                  rel->r_offset -= d_offset;
12257
                  bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
12258
                  r_type = R_PPC64_NONE;
12259
                }
12260
              rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12261
            }
12262
          break;
12263
 
12264
        case R_PPC64_GOT_TLSGD16:
12265
        case R_PPC64_GOT_TLSGD16_LO:
12266
          tls_gd = TLS_TPRELGD;
12267
          if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
12268
            goto tls_ldgd_opt;
12269
          break;
12270
 
12271
        case R_PPC64_GOT_TLSLD16:
12272
        case R_PPC64_GOT_TLSLD16_LO:
12273
          if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
12274
            {
12275
              unsigned int insn1, insn2, insn3;
12276
              bfd_vma offset;
12277
 
12278
            tls_ldgd_opt:
12279
              offset = (bfd_vma) -1;
12280
              /* If not using the newer R_PPC64_TLSGD/LD to mark
12281
                 __tls_get_addr calls, we must trust that the call
12282
                 stays with its arg setup insns, ie. that the next
12283
                 reloc is the __tls_get_addr call associated with
12284
                 the current reloc.  Edit both insns.  */
12285
              if (input_section->has_tls_get_addr_call
12286
                  && rel + 1 < relend
12287
                  && branch_reloc_hash_match (input_bfd, rel + 1,
12288
                                              htab->tls_get_addr,
12289
                                              htab->tls_get_addr_fd))
12290
                offset = rel[1].r_offset;
12291
              if ((tls_mask & tls_gd) != 0)
12292
                {
12293
                  /* IE */
12294
                  insn1 = bfd_get_32 (output_bfd,
12295
                                      contents + rel->r_offset - d_offset);
12296
                  insn1 &= (1 << 26) - (1 << 2);
12297
                  insn1 |= 58 << 26;    /* ld */
12298
                  insn2 = 0x7c636a14;   /* add 3,3,13 */
12299
                  if (offset != (bfd_vma) -1)
12300
                    rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
12301
                  if ((tls_mask & TLS_EXPLICIT) == 0)
12302
                    r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
12303
                              + R_PPC64_GOT_TPREL16_DS);
12304
                  else
12305
                    r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
12306
                  rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12307
                }
12308
              else
12309
                {
12310
                  /* LE */
12311
                  insn1 = 0x3c6d0000;   /* addis 3,13,0 */
12312
                  insn2 = 0x38630000;   /* addi 3,3,0 */
12313
                  if (tls_gd == 0)
12314
                    {
12315
                      /* Was an LD reloc.  */
12316
                      if (toc_symndx)
12317
                        sec = local_sections[toc_symndx];
12318
                      for (r_symndx = 0;
12319
                           r_symndx < symtab_hdr->sh_info;
12320
                           r_symndx++)
12321
                        if (local_sections[r_symndx] == sec)
12322
                          break;
12323
                      if (r_symndx >= symtab_hdr->sh_info)
12324
                        r_symndx = STN_UNDEF;
12325
                      rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
12326
                      if (r_symndx != STN_UNDEF)
12327
                        rel->r_addend -= (local_syms[r_symndx].st_value
12328
                                          + sec->output_offset
12329
                                          + sec->output_section->vma);
12330
                    }
12331
                  else if (toc_symndx != 0)
12332
                    {
12333
                      r_symndx = toc_symndx;
12334
                      rel->r_addend = toc_addend;
12335
                    }
12336
                  r_type = R_PPC64_TPREL16_HA;
12337
                  rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12338
                  if (offset != (bfd_vma) -1)
12339
                    {
12340
                      rel[1].r_info = ELF64_R_INFO (r_symndx,
12341
                                                    R_PPC64_TPREL16_LO);
12342
                      rel[1].r_offset = offset + d_offset;
12343
                      rel[1].r_addend = rel->r_addend;
12344
                    }
12345
                }
12346
              bfd_put_32 (output_bfd, insn1,
12347
                          contents + rel->r_offset - d_offset);
12348
              if (offset != (bfd_vma) -1)
12349
                {
12350
                  insn3 = bfd_get_32 (output_bfd,
12351
                                      contents + offset + 4);
12352
                  if (insn3 == NOP
12353
                      || insn3 == CROR_151515 || insn3 == CROR_313131)
12354
                    {
12355
                      rel[1].r_offset += 4;
12356
                      bfd_put_32 (output_bfd, insn2, contents + offset + 4);
12357
                      insn2 = NOP;
12358
                    }
12359
                  bfd_put_32 (output_bfd, insn2, contents + offset);
12360
                }
12361
              if ((tls_mask & tls_gd) == 0
12362
                  && (tls_gd == 0 || toc_symndx != 0))
12363
                {
12364
                  /* We changed the symbol.  Start over in order
12365
                     to get h, sym, sec etc. right.  */
12366
                  rel--;
12367
                  continue;
12368
                }
12369
            }
12370
          break;
12371
 
12372
        case R_PPC64_TLSGD:
12373
          if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
12374
            {
12375
              unsigned int insn2, insn3;
12376
              bfd_vma offset = rel->r_offset;
12377
 
12378
              if ((tls_mask & TLS_TPRELGD) != 0)
12379
                {
12380
                  /* IE */
12381
                  r_type = R_PPC64_NONE;
12382
                  insn2 = 0x7c636a14;   /* add 3,3,13 */
12383
                }
12384
              else
12385
                {
12386
                  /* LE */
12387
                  if (toc_symndx != 0)
12388
                    {
12389
                      r_symndx = toc_symndx;
12390
                      rel->r_addend = toc_addend;
12391
                    }
12392
                  r_type = R_PPC64_TPREL16_LO;
12393
                  rel->r_offset = offset + d_offset;
12394
                  insn2 = 0x38630000;   /* addi 3,3,0 */
12395
                }
12396
              rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12397
              /* Zap the reloc on the _tls_get_addr call too.  */
12398
              BFD_ASSERT (offset == rel[1].r_offset);
12399
              rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
12400
              insn3 = bfd_get_32 (output_bfd,
12401
                                  contents + offset + 4);
12402
              if (insn3 == NOP
12403
                  || insn3 == CROR_151515 || insn3 == CROR_313131)
12404
                {
12405
                  rel->r_offset += 4;
12406
                  bfd_put_32 (output_bfd, insn2, contents + offset + 4);
12407
                  insn2 = NOP;
12408
                }
12409
              bfd_put_32 (output_bfd, insn2, contents + offset);
12410
              if ((tls_mask & TLS_TPRELGD) == 0 && toc_symndx != 0)
12411
                {
12412
                  rel--;
12413
                  continue;
12414
                }
12415
            }
12416
          break;
12417
 
12418
        case R_PPC64_TLSLD:
12419
          if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
12420
            {
12421
              unsigned int insn2, insn3;
12422
              bfd_vma offset = rel->r_offset;
12423
 
12424
              if (toc_symndx)
12425
                sec = local_sections[toc_symndx];
12426
              for (r_symndx = 0;
12427
                   r_symndx < symtab_hdr->sh_info;
12428
                   r_symndx++)
12429
                if (local_sections[r_symndx] == sec)
12430
                  break;
12431
              if (r_symndx >= symtab_hdr->sh_info)
12432
                r_symndx = STN_UNDEF;
12433
              rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
12434
              if (r_symndx != STN_UNDEF)
12435
                rel->r_addend -= (local_syms[r_symndx].st_value
12436
                                  + sec->output_offset
12437
                                  + sec->output_section->vma);
12438
 
12439
              r_type = R_PPC64_TPREL16_LO;
12440
              rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12441
              rel->r_offset = offset + d_offset;
12442
              /* Zap the reloc on the _tls_get_addr call too.  */
12443
              BFD_ASSERT (offset == rel[1].r_offset);
12444
              rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
12445
              insn2 = 0x38630000;       /* addi 3,3,0 */
12446
              insn3 = bfd_get_32 (output_bfd,
12447
                                  contents + offset + 4);
12448
              if (insn3 == NOP
12449
                  || insn3 == CROR_151515 || insn3 == CROR_313131)
12450
                {
12451
                  rel->r_offset += 4;
12452
                  bfd_put_32 (output_bfd, insn2, contents + offset + 4);
12453
                  insn2 = NOP;
12454
                }
12455
              bfd_put_32 (output_bfd, insn2, contents + offset);
12456
              rel--;
12457
              continue;
12458
            }
12459
          break;
12460
 
12461
        case R_PPC64_DTPMOD64:
12462
          if (rel + 1 < relend
12463
              && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
12464
              && rel[1].r_offset == rel->r_offset + 8)
12465
            {
12466
              if ((tls_mask & TLS_GD) == 0)
12467
                {
12468
                  rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
12469
                  if ((tls_mask & TLS_TPRELGD) != 0)
12470
                    r_type = R_PPC64_TPREL64;
12471
                  else
12472
                    {
12473
                      bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
12474
                      r_type = R_PPC64_NONE;
12475
                    }
12476
                  rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12477
                }
12478
            }
12479
          else
12480
            {
12481
              if ((tls_mask & TLS_LD) == 0)
12482
                {
12483
                  bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
12484
                  r_type = R_PPC64_NONE;
12485
                  rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12486
                }
12487
            }
12488
          break;
12489
 
12490
        case R_PPC64_TPREL64:
12491
          if ((tls_mask & TLS_TPREL) == 0)
12492
            {
12493
              r_type = R_PPC64_NONE;
12494
              rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12495
            }
12496
          break;
12497
        }
12498
 
12499
      /* Handle other relocations that tweak non-addend part of insn.  */
12500
      insn = 0;
12501
      max_br_offset = 1 << 25;
12502
      addend = rel->r_addend;
12503
      switch (r_type)
12504
        {
12505
        default:
12506
          break;
12507
 
12508 163 khays
        case R_PPC64_TOCSAVE:
12509
          if (relocation + addend == (rel->r_offset
12510
                                      + input_section->output_offset
12511
                                      + input_section->output_section->vma)
12512
              && tocsave_find (htab, NO_INSERT,
12513
                               &local_syms, rel, input_bfd))
12514
            {
12515
              insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
12516
              if (insn == NOP
12517
                  || insn == CROR_151515 || insn == CROR_313131)
12518
                bfd_put_32 (input_bfd, STD_R2_40R1,
12519
                            contents + rel->r_offset);
12520
            }
12521
          break;
12522
 
12523 14 khays
          /* Branch taken prediction relocations.  */
12524
        case R_PPC64_ADDR14_BRTAKEN:
12525
        case R_PPC64_REL14_BRTAKEN:
12526
          insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field.  */
12527
          /* Fall thru.  */
12528
 
12529
          /* Branch not taken prediction relocations.  */
12530
        case R_PPC64_ADDR14_BRNTAKEN:
12531
        case R_PPC64_REL14_BRNTAKEN:
12532
          insn |= bfd_get_32 (output_bfd,
12533
                              contents + rel->r_offset) & ~(0x01 << 21);
12534
          /* Fall thru.  */
12535
 
12536
        case R_PPC64_REL14:
12537
          max_br_offset = 1 << 15;
12538
          /* Fall thru.  */
12539
 
12540
        case R_PPC64_REL24:
12541
          /* Calls to functions with a different TOC, such as calls to
12542
             shared objects, need to alter the TOC pointer.  This is
12543
             done using a linkage stub.  A REL24 branching to these
12544
             linkage stubs needs to be followed by a nop, as the nop
12545
             will be replaced with an instruction to restore the TOC
12546
             base pointer.  */
12547
          fdh = h;
12548
          if (h != NULL
12549
              && h->oh != NULL
12550
              && h->oh->is_func_descriptor)
12551
            fdh = ppc_follow_link (h->oh);
12552
          stub_entry = ppc_get_stub_entry (input_section, sec, fdh, rel, htab);
12553
          if (stub_entry != NULL
12554
              && (stub_entry->stub_type == ppc_stub_plt_call
12555
                  || stub_entry->stub_type == ppc_stub_plt_branch_r2off
12556
                  || stub_entry->stub_type == ppc_stub_long_branch_r2off))
12557
            {
12558
              bfd_boolean can_plt_call = FALSE;
12559
 
12560
              if (rel->r_offset + 8 <= input_section->size)
12561
                {
12562
                  unsigned long nop;
12563
                  nop = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
12564
                  if (nop == NOP
12565
                      || nop == CROR_151515 || nop == CROR_313131)
12566
                    {
12567
                      if (h != NULL
12568
                          && (h == htab->tls_get_addr_fd
12569
                              || h == htab->tls_get_addr)
12570
                          && !htab->no_tls_get_addr_opt)
12571
                        {
12572
                          /* Special stub used, leave nop alone.  */
12573
                        }
12574
                      else
12575
                        bfd_put_32 (input_bfd, LD_R2_40R1,
12576
                                    contents + rel->r_offset + 4);
12577
                      can_plt_call = TRUE;
12578
                    }
12579
                }
12580
 
12581
              if (!can_plt_call)
12582
                {
12583
                  if (stub_entry->stub_type == ppc_stub_plt_call)
12584
                    {
12585
                      /* If this is a plain branch rather than a branch
12586
                         and link, don't require a nop.  However, don't
12587
                         allow tail calls in a shared library as they
12588
                         will result in r2 being corrupted.  */
12589
                      unsigned long br;
12590
                      br = bfd_get_32 (input_bfd, contents + rel->r_offset);
12591
                      if (info->executable && (br & 1) == 0)
12592
                        can_plt_call = TRUE;
12593
                      else
12594
                        stub_entry = NULL;
12595
                    }
12596
                  else if (h != NULL
12597
                           && strcmp (h->elf.root.root.string,
12598
                                      ".__libc_start_main") == 0)
12599
                    {
12600
                      /* Allow crt1 branch to go via a toc adjusting stub.  */
12601
                      can_plt_call = TRUE;
12602
                    }
12603
                  else
12604
                    {
12605
                      if (strcmp (input_section->output_section->name,
12606
                                  ".init") == 0
12607
                          || strcmp (input_section->output_section->name,
12608
                                     ".fini") == 0)
12609
                        info->callbacks->einfo
12610 161 khays
                          (_("%P: %H: automatic multiple TOCs "
12611 14 khays
                             "not supported using your crt files; "
12612
                             "recompile with -mminimal-toc or upgrade gcc\n"),
12613
                           input_bfd, input_section, rel->r_offset);
12614
                      else
12615
                        info->callbacks->einfo
12616 161 khays
                          (_("%P: %H: sibling call optimization to `%s' "
12617 14 khays
                             "does not allow automatic multiple TOCs; "
12618
                             "recompile with -mminimal-toc or "
12619
                             "-fno-optimize-sibling-calls, "
12620
                             "or make `%s' extern\n"),
12621
                           input_bfd, input_section, rel->r_offset,
12622
                           sym_name,
12623
                           sym_name);
12624
                      bfd_set_error (bfd_error_bad_value);
12625
                      ret = FALSE;
12626
                    }
12627
                }
12628
 
12629
              if (can_plt_call
12630
                  && stub_entry->stub_type == ppc_stub_plt_call)
12631
                unresolved_reloc = FALSE;
12632
            }
12633
 
12634
          if ((stub_entry == NULL
12635
               || stub_entry->stub_type == ppc_stub_long_branch
12636
               || stub_entry->stub_type == ppc_stub_plt_branch)
12637
              && get_opd_info (sec) != NULL)
12638
            {
12639
              /* The branch destination is the value of the opd entry. */
12640
              bfd_vma off = (relocation + addend
12641
                             - sec->output_section->vma
12642
                             - sec->output_offset);
12643
              bfd_vma dest = opd_entry_value (sec, off, NULL, NULL);
12644
              if (dest != (bfd_vma) -1)
12645
                {
12646
                  relocation = dest;
12647
                  addend = 0;
12648
                }
12649
            }
12650
 
12651
          /* If the branch is out of reach we ought to have a long
12652
             branch stub.  */
12653
          from = (rel->r_offset
12654
                  + input_section->output_offset
12655
                  + input_section->output_section->vma);
12656
 
12657
          if (stub_entry != NULL
12658
              && (stub_entry->stub_type == ppc_stub_long_branch
12659
                  || stub_entry->stub_type == ppc_stub_plt_branch)
12660
              && (r_type == R_PPC64_ADDR14_BRTAKEN
12661
                  || r_type == R_PPC64_ADDR14_BRNTAKEN
12662
                  || (relocation + addend - from + max_br_offset
12663
                      < 2 * max_br_offset)))
12664
            /* Don't use the stub if this branch is in range.  */
12665
            stub_entry = NULL;
12666
 
12667
          if (stub_entry != NULL)
12668
            {
12669
              /* Munge up the value and addend so that we call the stub
12670
                 rather than the procedure directly.  */
12671
              relocation = (stub_entry->stub_offset
12672
                            + stub_entry->stub_sec->output_offset
12673
                            + stub_entry->stub_sec->output_section->vma);
12674
              addend = 0;
12675 163 khays
 
12676
              if (stub_entry->stub_type == ppc_stub_plt_call
12677
                  && rel + 1 < relend
12678
                  && rel[1].r_offset == rel->r_offset + 4
12679
                  && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE)
12680
                relocation += 4;
12681 14 khays
            }
12682
 
12683
          if (insn != 0)
12684
            {
12685
              if (is_power4)
12686
                {
12687
                  /* Set 'a' bit.  This is 0b00010 in BO field for branch
12688
                     on CR(BI) insns (BO == 001at or 011at), and 0b01000
12689
                     for branch on CTR insns (BO == 1a00t or 1a01t).  */
12690
                  if ((insn & (0x14 << 21)) == (0x04 << 21))
12691
                    insn |= 0x02 << 21;
12692
                  else if ((insn & (0x14 << 21)) == (0x10 << 21))
12693
                    insn |= 0x08 << 21;
12694
                  else
12695
                    break;
12696
                }
12697
              else
12698
                {
12699
                  /* Invert 'y' bit if not the default.  */
12700
                  if ((bfd_signed_vma) (relocation + addend - from) < 0)
12701
                    insn ^= 0x01 << 21;
12702
                }
12703
 
12704
              bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
12705
            }
12706
 
12707
          /* NOP out calls to undefined weak functions.
12708
             We can thus call a weak function without first
12709
             checking whether the function is defined.  */
12710
          else if (h != NULL
12711
                   && h->elf.root.type == bfd_link_hash_undefweak
12712
                   && h->elf.dynindx == -1
12713
                   && r_type == R_PPC64_REL24
12714
                   && relocation == 0
12715
                   && addend == 0)
12716
            {
12717
              bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
12718
              continue;
12719
            }
12720
          break;
12721
        }
12722
 
12723
      /* Set `addend'.  */
12724
      tls_type = 0;
12725
      switch (r_type)
12726
        {
12727
        default:
12728
          info->callbacks->einfo
12729 161 khays
            (_("%P: %B: unknown relocation type %d for symbol %s\n"),
12730 14 khays
             input_bfd, (int) r_type, sym_name);
12731
 
12732
          bfd_set_error (bfd_error_bad_value);
12733
          ret = FALSE;
12734
          continue;
12735
 
12736
        case R_PPC64_NONE:
12737
        case R_PPC64_TLS:
12738
        case R_PPC64_TLSGD:
12739
        case R_PPC64_TLSLD:
12740 163 khays
        case R_PPC64_TOCSAVE:
12741 14 khays
        case R_PPC64_GNU_VTINHERIT:
12742
        case R_PPC64_GNU_VTENTRY:
12743
          continue;
12744
 
12745
          /* GOT16 relocations.  Like an ADDR16 using the symbol's
12746
             address in the GOT as relocation value instead of the
12747
             symbol's value itself.  Also, create a GOT entry for the
12748
             symbol and put the symbol value there.  */
12749
        case R_PPC64_GOT_TLSGD16:
12750
        case R_PPC64_GOT_TLSGD16_LO:
12751
        case R_PPC64_GOT_TLSGD16_HI:
12752
        case R_PPC64_GOT_TLSGD16_HA:
12753
          tls_type = TLS_TLS | TLS_GD;
12754
          goto dogot;
12755
 
12756
        case R_PPC64_GOT_TLSLD16:
12757
        case R_PPC64_GOT_TLSLD16_LO:
12758
        case R_PPC64_GOT_TLSLD16_HI:
12759
        case R_PPC64_GOT_TLSLD16_HA:
12760
          tls_type = TLS_TLS | TLS_LD;
12761
          goto dogot;
12762
 
12763
        case R_PPC64_GOT_TPREL16_DS:
12764
        case R_PPC64_GOT_TPREL16_LO_DS:
12765
        case R_PPC64_GOT_TPREL16_HI:
12766
        case R_PPC64_GOT_TPREL16_HA:
12767
          tls_type = TLS_TLS | TLS_TPREL;
12768
          goto dogot;
12769
 
12770
        case R_PPC64_GOT_DTPREL16_DS:
12771
        case R_PPC64_GOT_DTPREL16_LO_DS:
12772
        case R_PPC64_GOT_DTPREL16_HI:
12773
        case R_PPC64_GOT_DTPREL16_HA:
12774
          tls_type = TLS_TLS | TLS_DTPREL;
12775
          goto dogot;
12776
 
12777
        case R_PPC64_GOT16:
12778
        case R_PPC64_GOT16_LO:
12779
        case R_PPC64_GOT16_HI:
12780
        case R_PPC64_GOT16_HA:
12781
        case R_PPC64_GOT16_DS:
12782
        case R_PPC64_GOT16_LO_DS:
12783
        dogot:
12784
          {
12785
            /* Relocation is to the entry for this symbol in the global
12786
               offset table.  */
12787
            asection *got;
12788
            bfd_vma *offp;
12789
            bfd_vma off;
12790
            unsigned long indx = 0;
12791
            struct got_entry *ent;
12792
 
12793
            if (tls_type == (TLS_TLS | TLS_LD)
12794
                && (h == NULL
12795
                    || !h->elf.def_dynamic))
12796
              ent = ppc64_tlsld_got (input_bfd);
12797
            else
12798
              {
12799
 
12800
                if (h != NULL)
12801
                  {
12802
                    bfd_boolean dyn = htab->elf.dynamic_sections_created;
12803
                    if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
12804
                                                          &h->elf)
12805
                        || (info->shared
12806
                            && SYMBOL_CALLS_LOCAL (info, &h->elf)))
12807
                      /* This is actually a static link, or it is a
12808
                         -Bsymbolic link and the symbol is defined
12809
                         locally, or the symbol was forced to be local
12810
                         because of a version file.  */
12811
                      ;
12812
                    else
12813
                      {
12814
                        indx = h->elf.dynindx;
12815
                        unresolved_reloc = FALSE;
12816
                      }
12817
                    ent = h->elf.got.glist;
12818
                  }
12819
                else
12820
                  {
12821
                    if (local_got_ents == NULL)
12822
                      abort ();
12823
                    ent = local_got_ents[r_symndx];
12824
                  }
12825
 
12826
                for (; ent != NULL; ent = ent->next)
12827
                  if (ent->addend == orig_addend
12828
                      && ent->owner == input_bfd
12829
                      && ent->tls_type == tls_type)
12830
                    break;
12831
              }
12832
 
12833
            if (ent == NULL)
12834
              abort ();
12835
            if (ent->is_indirect)
12836
              ent = ent->got.ent;
12837
            offp = &ent->got.offset;
12838
            got = ppc64_elf_tdata (ent->owner)->got;
12839
            if (got == NULL)
12840
              abort ();
12841
 
12842
            /* The offset must always be a multiple of 8.  We use the
12843
               least significant bit to record whether we have already
12844
               processed this entry.  */
12845
            off = *offp;
12846
            if ((off & 1) != 0)
12847
              off &= ~1;
12848
            else
12849
              {
12850
                /* Generate relocs for the dynamic linker, except in
12851
                   the case of TLSLD where we'll use one entry per
12852
                   module.  */
12853
                asection *relgot;
12854
                bfd_boolean ifunc;
12855
 
12856
                *offp = off | 1;
12857
                relgot = NULL;
12858
                ifunc = (h != NULL
12859
                         ? h->elf.type == STT_GNU_IFUNC
12860
                         : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
12861
                if ((info->shared || indx != 0)
12862
                    && (h == NULL
12863
                        || (tls_type == (TLS_TLS | TLS_LD)
12864
                            && !h->elf.def_dynamic)
12865
                        || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
12866
                        || h->elf.root.type != bfd_link_hash_undefweak))
12867
                  relgot = ppc64_elf_tdata (ent->owner)->relgot;
12868
                else if (ifunc)
12869
                  relgot = htab->reliplt;
12870
                if (relgot != NULL)
12871
                  {
12872
                    outrel.r_offset = (got->output_section->vma
12873
                                       + got->output_offset
12874
                                       + off);
12875
                    outrel.r_addend = addend;
12876
                    if (tls_type & (TLS_LD | TLS_GD))
12877
                      {
12878
                        outrel.r_addend = 0;
12879
                        outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
12880
                        if (tls_type == (TLS_TLS | TLS_GD))
12881
                          {
12882
                            loc = relgot->contents;
12883
                            loc += (relgot->reloc_count++
12884
                                    * sizeof (Elf64_External_Rela));
12885
                            bfd_elf64_swap_reloca_out (output_bfd,
12886
                                                       &outrel, loc);
12887
                            outrel.r_offset += 8;
12888
                            outrel.r_addend = addend;
12889
                            outrel.r_info
12890
                              = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
12891
                          }
12892
                      }
12893
                    else if (tls_type == (TLS_TLS | TLS_DTPREL))
12894
                      outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
12895
                    else if (tls_type == (TLS_TLS | TLS_TPREL))
12896
                      outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
12897
                    else if (indx != 0)
12898
                      outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
12899
                    else
12900
                      {
12901
                        if (ifunc)
12902
                          outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
12903
                        else
12904
                          outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
12905
 
12906
                        /* Write the .got section contents for the sake
12907
                           of prelink.  */
12908
                        loc = got->contents + off;
12909
                        bfd_put_64 (output_bfd, outrel.r_addend + relocation,
12910
                                    loc);
12911
                      }
12912
 
12913
                    if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
12914
                      {
12915
                        outrel.r_addend += relocation;
12916
                        if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
12917
                          outrel.r_addend -= htab->elf.tls_sec->vma;
12918
                      }
12919
                    loc = relgot->contents;
12920
                    loc += (relgot->reloc_count++
12921
                            * sizeof (Elf64_External_Rela));
12922
                    bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
12923
                  }
12924
 
12925
                /* Init the .got section contents here if we're not
12926
                   emitting a reloc.  */
12927
                else
12928
                  {
12929
                    relocation += addend;
12930
                    if (tls_type == (TLS_TLS | TLS_LD))
12931
                      relocation = 1;
12932
                    else if (tls_type != 0)
12933
                      {
12934
                        relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
12935
                        if (tls_type == (TLS_TLS | TLS_TPREL))
12936
                          relocation += DTP_OFFSET - TP_OFFSET;
12937
 
12938
                        if (tls_type == (TLS_TLS | TLS_GD))
12939
                          {
12940
                            bfd_put_64 (output_bfd, relocation,
12941
                                        got->contents + off + 8);
12942
                            relocation = 1;
12943
                          }
12944
                      }
12945
 
12946
                    bfd_put_64 (output_bfd, relocation,
12947
                                got->contents + off);
12948
                  }
12949
              }
12950
 
12951
            if (off >= (bfd_vma) -2)
12952
              abort ();
12953
 
12954
            relocation = got->output_section->vma + got->output_offset + off;
12955
            addend = -(TOCstart + htab->stub_group[input_section->id].toc_off);
12956
          }
12957
          break;
12958
 
12959
        case R_PPC64_PLT16_HA:
12960
        case R_PPC64_PLT16_HI:
12961
        case R_PPC64_PLT16_LO:
12962
        case R_PPC64_PLT32:
12963
        case R_PPC64_PLT64:
12964
          /* Relocation is to the entry for this symbol in the
12965
             procedure linkage table.  */
12966
 
12967
          /* Resolve a PLT reloc against a local symbol directly,
12968
             without using the procedure linkage table.  */
12969
          if (h == NULL)
12970
            break;
12971
 
12972
          /* It's possible that we didn't make a PLT entry for this
12973
             symbol.  This happens when statically linking PIC code,
12974
             or when using -Bsymbolic.  Go find a match if there is a
12975
             PLT entry.  */
12976
          if (htab->plt != NULL)
12977
            {
12978
              struct plt_entry *ent;
12979
              for (ent = h->elf.plt.plist; ent != NULL; ent = ent->next)
12980
                if (ent->addend == orig_addend
12981
                    && ent->plt.offset != (bfd_vma) -1)
12982
                  {
12983
                    relocation = (htab->plt->output_section->vma
12984
                                  + htab->plt->output_offset
12985
                                  + ent->plt.offset);
12986
                    unresolved_reloc = FALSE;
12987
                  }
12988
            }
12989
          break;
12990
 
12991
        case R_PPC64_TOC:
12992
          /* Relocation value is TOC base.  */
12993
          relocation = TOCstart;
12994
          if (r_symndx == STN_UNDEF)
12995
            relocation += htab->stub_group[input_section->id].toc_off;
12996
          else if (unresolved_reloc)
12997
            ;
12998
          else if (sec != NULL && sec->id <= htab->top_id)
12999
            relocation += htab->stub_group[sec->id].toc_off;
13000
          else
13001
            unresolved_reloc = TRUE;
13002
          goto dodyn;
13003
 
13004
          /* TOC16 relocs.  We want the offset relative to the TOC base,
13005
             which is the address of the start of the TOC plus 0x8000.
13006
             The TOC consists of sections .got, .toc, .tocbss, and .plt,
13007
             in this order.  */
13008
        case R_PPC64_TOC16:
13009
        case R_PPC64_TOC16_LO:
13010
        case R_PPC64_TOC16_HI:
13011
        case R_PPC64_TOC16_DS:
13012
        case R_PPC64_TOC16_LO_DS:
13013
        case R_PPC64_TOC16_HA:
13014
          addend -= TOCstart + htab->stub_group[input_section->id].toc_off;
13015
          break;
13016
 
13017
          /* Relocate against the beginning of the section.  */
13018
        case R_PPC64_SECTOFF:
13019
        case R_PPC64_SECTOFF_LO:
13020
        case R_PPC64_SECTOFF_HI:
13021
        case R_PPC64_SECTOFF_DS:
13022
        case R_PPC64_SECTOFF_LO_DS:
13023
        case R_PPC64_SECTOFF_HA:
13024
          if (sec != NULL)
13025
            addend -= sec->output_section->vma;
13026
          break;
13027
 
13028
        case R_PPC64_REL16:
13029
        case R_PPC64_REL16_LO:
13030
        case R_PPC64_REL16_HI:
13031
        case R_PPC64_REL16_HA:
13032
          break;
13033
 
13034
        case R_PPC64_REL14:
13035
        case R_PPC64_REL14_BRNTAKEN:
13036
        case R_PPC64_REL14_BRTAKEN:
13037
        case R_PPC64_REL24:
13038
          break;
13039
 
13040
        case R_PPC64_TPREL16:
13041
        case R_PPC64_TPREL16_LO:
13042
        case R_PPC64_TPREL16_HI:
13043
        case R_PPC64_TPREL16_HA:
13044
        case R_PPC64_TPREL16_DS:
13045
        case R_PPC64_TPREL16_LO_DS:
13046
        case R_PPC64_TPREL16_HIGHER:
13047
        case R_PPC64_TPREL16_HIGHERA:
13048
        case R_PPC64_TPREL16_HIGHEST:
13049
        case R_PPC64_TPREL16_HIGHESTA:
13050
          if (h != NULL
13051
              && h->elf.root.type == bfd_link_hash_undefweak
13052
              && h->elf.dynindx == -1)
13053
            {
13054
              /* Make this relocation against an undefined weak symbol
13055
                 resolve to zero.  This is really just a tweak, since
13056
                 code using weak externs ought to check that they are
13057
                 defined before using them.  */
13058
              bfd_byte *p = contents + rel->r_offset - d_offset;
13059
 
13060
              insn = bfd_get_32 (output_bfd, p);
13061
              insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
13062
              if (insn != 0)
13063
                bfd_put_32 (output_bfd, insn, p);
13064
              break;
13065
            }
13066
          addend -= htab->elf.tls_sec->vma + TP_OFFSET;
13067
          if (info->shared)
13068
            /* The TPREL16 relocs shouldn't really be used in shared
13069
               libs as they will result in DT_TEXTREL being set, but
13070
               support them anyway.  */
13071
            goto dodyn;
13072
          break;
13073
 
13074
        case R_PPC64_DTPREL16:
13075
        case R_PPC64_DTPREL16_LO:
13076
        case R_PPC64_DTPREL16_HI:
13077
        case R_PPC64_DTPREL16_HA:
13078
        case R_PPC64_DTPREL16_DS:
13079
        case R_PPC64_DTPREL16_LO_DS:
13080
        case R_PPC64_DTPREL16_HIGHER:
13081
        case R_PPC64_DTPREL16_HIGHERA:
13082
        case R_PPC64_DTPREL16_HIGHEST:
13083
        case R_PPC64_DTPREL16_HIGHESTA:
13084
          addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
13085
          break;
13086
 
13087
        case R_PPC64_DTPMOD64:
13088
          relocation = 1;
13089
          addend = 0;
13090
          goto dodyn;
13091
 
13092
        case R_PPC64_TPREL64:
13093
          addend -= htab->elf.tls_sec->vma + TP_OFFSET;
13094
          goto dodyn;
13095
 
13096
        case R_PPC64_DTPREL64:
13097
          addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
13098
          /* Fall thru */
13099
 
13100
          /* Relocations that may need to be propagated if this is a
13101
             dynamic object.  */
13102
        case R_PPC64_REL30:
13103
        case R_PPC64_REL32:
13104
        case R_PPC64_REL64:
13105
        case R_PPC64_ADDR14:
13106
        case R_PPC64_ADDR14_BRNTAKEN:
13107
        case R_PPC64_ADDR14_BRTAKEN:
13108
        case R_PPC64_ADDR16:
13109
        case R_PPC64_ADDR16_DS:
13110
        case R_PPC64_ADDR16_HA:
13111
        case R_PPC64_ADDR16_HI:
13112
        case R_PPC64_ADDR16_HIGHER:
13113
        case R_PPC64_ADDR16_HIGHERA:
13114
        case R_PPC64_ADDR16_HIGHEST:
13115
        case R_PPC64_ADDR16_HIGHESTA:
13116
        case R_PPC64_ADDR16_LO:
13117
        case R_PPC64_ADDR16_LO_DS:
13118
        case R_PPC64_ADDR24:
13119
        case R_PPC64_ADDR32:
13120
        case R_PPC64_ADDR64:
13121
        case R_PPC64_UADDR16:
13122
        case R_PPC64_UADDR32:
13123
        case R_PPC64_UADDR64:
13124
        dodyn:
13125
          if ((input_section->flags & SEC_ALLOC) == 0)
13126
            break;
13127
 
13128
          if (NO_OPD_RELOCS && is_opd)
13129
            break;
13130
 
13131
          if ((info->shared
13132
               && (h == NULL
13133
                   || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
13134
                   || h->elf.root.type != bfd_link_hash_undefweak)
13135
               && (must_be_dyn_reloc (info, r_type)
13136
                   || !SYMBOL_CALLS_LOCAL (info, &h->elf)))
13137
              || (ELIMINATE_COPY_RELOCS
13138
                  && !info->shared
13139
                  && h != NULL
13140
                  && h->elf.dynindx != -1
13141
                  && !h->elf.non_got_ref
13142
                  && !h->elf.def_regular)
13143
              || (!info->shared
13144
                  && (h != NULL
13145
                      ? h->elf.type == STT_GNU_IFUNC
13146
                      : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)))
13147
            {
13148
              bfd_boolean skip, relocate;
13149
              asection *sreloc;
13150
              bfd_vma out_off;
13151
 
13152
              /* When generating a dynamic object, these relocations
13153
                 are copied into the output file to be resolved at run
13154
                 time.  */
13155
 
13156
              skip = FALSE;
13157
              relocate = FALSE;
13158
 
13159
              out_off = _bfd_elf_section_offset (output_bfd, info,
13160
                                                 input_section, rel->r_offset);
13161
              if (out_off == (bfd_vma) -1)
13162
                skip = TRUE;
13163
              else if (out_off == (bfd_vma) -2)
13164
                skip = TRUE, relocate = TRUE;
13165
              out_off += (input_section->output_section->vma
13166
                          + input_section->output_offset);
13167
              outrel.r_offset = out_off;
13168
              outrel.r_addend = rel->r_addend;
13169
 
13170
              /* Optimize unaligned reloc use.  */
13171
              if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
13172
                  || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
13173
                r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
13174
              else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
13175
                       || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
13176
                r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
13177
              else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
13178
                       || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
13179
                r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
13180
 
13181
              if (skip)
13182
                memset (&outrel, 0, sizeof outrel);
13183
              else if (!SYMBOL_CALLS_LOCAL (info, &h->elf)
13184
                       && !is_opd
13185
                       && r_type != R_PPC64_TOC)
13186
                outrel.r_info = ELF64_R_INFO (h->elf.dynindx, r_type);
13187
              else
13188
                {
13189
                  /* This symbol is local, or marked to become local,
13190
                     or this is an opd section reloc which must point
13191
                     at a local function.  */
13192
                  outrel.r_addend += relocation;
13193
                  if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
13194
                    {
13195
                      if (is_opd && h != NULL)
13196
                        {
13197
                          /* Lie about opd entries.  This case occurs
13198
                             when building shared libraries and we
13199
                             reference a function in another shared
13200
                             lib.  The same thing happens for a weak
13201
                             definition in an application that's
13202
                             overridden by a strong definition in a
13203
                             shared lib.  (I believe this is a generic
13204
                             bug in binutils handling of weak syms.)
13205
                             In these cases we won't use the opd
13206
                             entry in this lib.  */
13207
                          unresolved_reloc = FALSE;
13208
                        }
13209
                      if (!is_opd
13210
                          && r_type == R_PPC64_ADDR64
13211
                          && (h != NULL
13212
                              ? h->elf.type == STT_GNU_IFUNC
13213
                              : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
13214
                        outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13215
                      else
13216
                        {
13217
                          outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13218
 
13219
                          /* We need to relocate .opd contents for ld.so.
13220
                             Prelink also wants simple and consistent rules
13221
                             for relocs.  This make all RELATIVE relocs have
13222
                             *r_offset equal to r_addend.  */
13223
                          relocate = TRUE;
13224
                        }
13225
                    }
13226
                  else
13227
                    {
13228
                      long indx = 0;
13229
 
13230
                      if (h != NULL
13231
                          ? h->elf.type == STT_GNU_IFUNC
13232
                          : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
13233
                        {
13234
                          info->callbacks->einfo
13235 161 khays
                            (_("%P: %H: relocation %s for indirect "
13236 14 khays
                               "function %s unsupported\n"),
13237
                             input_bfd, input_section, rel->r_offset,
13238
                             ppc64_elf_howto_table[r_type]->name,
13239
                             sym_name);
13240
                          ret = FALSE;
13241
                        }
13242
                      else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
13243
                        ;
13244
                      else if (sec == NULL || sec->owner == NULL)
13245
                        {
13246
                          bfd_set_error (bfd_error_bad_value);
13247
                          return FALSE;
13248
                        }
13249
                      else
13250
                        {
13251
                          asection *osec;
13252
 
13253
                          osec = sec->output_section;
13254
                          indx = elf_section_data (osec)->dynindx;
13255
 
13256
                          if (indx == 0)
13257
                            {
13258
                              if ((osec->flags & SEC_READONLY) == 0
13259
                                  && htab->elf.data_index_section != NULL)
13260
                                osec = htab->elf.data_index_section;
13261
                              else
13262
                                osec = htab->elf.text_index_section;
13263
                              indx = elf_section_data (osec)->dynindx;
13264
                            }
13265
                          BFD_ASSERT (indx != 0);
13266
 
13267
                          /* We are turning this relocation into one
13268
                             against a section symbol, so subtract out
13269
                             the output section's address but not the
13270
                             offset of the input section in the output
13271
                             section.  */
13272
                          outrel.r_addend -= osec->vma;
13273
                        }
13274
 
13275
                      outrel.r_info = ELF64_R_INFO (indx, r_type);
13276
                    }
13277
                }
13278
 
13279
              sreloc = elf_section_data (input_section)->sreloc;
13280
              if (!htab->elf.dynamic_sections_created)
13281
                sreloc = htab->reliplt;
13282
              if (sreloc == NULL)
13283
                abort ();
13284
 
13285
              if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
13286
                  >= sreloc->size)
13287
                abort ();
13288
              loc = sreloc->contents;
13289
              loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
13290
              bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
13291
 
13292
              /* If this reloc is against an external symbol, it will
13293
                 be computed at runtime, so there's no need to do
13294
                 anything now.  However, for the sake of prelink ensure
13295
                 that the section contents are a known value.  */
13296
              if (! relocate)
13297
                {
13298
                  unresolved_reloc = FALSE;
13299
                  /* The value chosen here is quite arbitrary as ld.so
13300
                     ignores section contents except for the special
13301
                     case of .opd where the contents might be accessed
13302
                     before relocation.  Choose zero, as that won't
13303
                     cause reloc overflow.  */
13304
                  relocation = 0;
13305
                  addend = 0;
13306
                  /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
13307
                     to improve backward compatibility with older
13308
                     versions of ld.  */
13309
                  if (r_type == R_PPC64_ADDR64)
13310
                    addend = outrel.r_addend;
13311
                  /* Adjust pc_relative relocs to have zero in *r_offset.  */
13312
                  else if (ppc64_elf_howto_table[r_type]->pc_relative)
13313
                    addend = (input_section->output_section->vma
13314
                              + input_section->output_offset
13315
                              + rel->r_offset);
13316
                }
13317
            }
13318
          break;
13319
 
13320
        case R_PPC64_COPY:
13321
        case R_PPC64_GLOB_DAT:
13322
        case R_PPC64_JMP_SLOT:
13323
        case R_PPC64_JMP_IREL:
13324
        case R_PPC64_RELATIVE:
13325
          /* We shouldn't ever see these dynamic relocs in relocatable
13326
             files.  */
13327
          /* Fall through.  */
13328
 
13329
        case R_PPC64_PLTGOT16:
13330
        case R_PPC64_PLTGOT16_DS:
13331
        case R_PPC64_PLTGOT16_HA:
13332
        case R_PPC64_PLTGOT16_HI:
13333
        case R_PPC64_PLTGOT16_LO:
13334
        case R_PPC64_PLTGOT16_LO_DS:
13335
        case R_PPC64_PLTREL32:
13336
        case R_PPC64_PLTREL64:
13337
          /* These ones haven't been implemented yet.  */
13338
 
13339
          info->callbacks->einfo
13340 161 khays
            (_("%P: %B: relocation %s is not supported for symbol %s\n"),
13341 14 khays
             input_bfd,
13342
             ppc64_elf_howto_table[r_type]->name, sym_name);
13343
 
13344
          bfd_set_error (bfd_error_invalid_operation);
13345
          ret = FALSE;
13346
          continue;
13347
        }
13348
 
13349
      /* Multi-instruction sequences that access the TOC can be
13350
         optimized, eg. addis ra,r2,0; addi rb,ra,x;
13351
         to             nop;           addi rb,r2,x;  */
13352
      switch (r_type)
13353
        {
13354
        default:
13355
          break;
13356
 
13357
        case R_PPC64_GOT_TLSLD16_HI:
13358
        case R_PPC64_GOT_TLSGD16_HI:
13359
        case R_PPC64_GOT_TPREL16_HI:
13360
        case R_PPC64_GOT_DTPREL16_HI:
13361
        case R_PPC64_GOT16_HI:
13362
        case R_PPC64_TOC16_HI:
13363
          /* These relocs would only be useful if building up an
13364
             offset to later add to r2, perhaps in an indexed
13365
             addressing mode instruction.  Don't try to optimize.
13366
             Unfortunately, the possibility of someone building up an
13367
             offset like this or even with the HA relocs, means that
13368
             we need to check the high insn when optimizing the low
13369
             insn.  */
13370
          break;
13371
 
13372
        case R_PPC64_GOT_TLSLD16_HA:
13373
        case R_PPC64_GOT_TLSGD16_HA:
13374
        case R_PPC64_GOT_TPREL16_HA:
13375
        case R_PPC64_GOT_DTPREL16_HA:
13376
        case R_PPC64_GOT16_HA:
13377
        case R_PPC64_TOC16_HA:
13378 163 khays
          if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
13379
              && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
13380
            {
13381
              bfd_byte *p = contents + (rel->r_offset & ~3);
13382
              bfd_put_32 (input_bfd, NOP, p);
13383
            }
13384 14 khays
          break;
13385
 
13386
        case R_PPC64_GOT_TLSLD16_LO:
13387
        case R_PPC64_GOT_TLSGD16_LO:
13388
        case R_PPC64_GOT_TPREL16_LO_DS:
13389
        case R_PPC64_GOT_DTPREL16_LO_DS:
13390
        case R_PPC64_GOT16_LO:
13391
        case R_PPC64_GOT16_LO_DS:
13392
        case R_PPC64_TOC16_LO:
13393
        case R_PPC64_TOC16_LO_DS:
13394 163 khays
          if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
13395
              && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
13396 14 khays
            {
13397
              bfd_byte *p = contents + (rel->r_offset & ~3);
13398
              insn = bfd_get_32 (input_bfd, p);
13399 163 khays
              if ((insn & (0x3f << 26)) == 12u << 26 /* addic */)
13400 14 khays
                {
13401 163 khays
                  /* Transform addic to addi when we change reg.  */
13402
                  insn &= ~((0x3f << 26) | (0x1f << 16));
13403
                  insn |= (14u << 26) | (2 << 16);
13404 14 khays
                }
13405 163 khays
              else
13406
                {
13407
                  insn &= ~(0x1f << 16);
13408
                  insn |= 2 << 16;
13409
                }
13410
              bfd_put_32 (input_bfd, insn, p);
13411 14 khays
            }
13412
          break;
13413
        }
13414
 
13415
      /* Do any further special processing.  */
13416
      switch (r_type)
13417
        {
13418
        default:
13419
          break;
13420
 
13421
        case R_PPC64_ADDR16_HA:
13422
        case R_PPC64_REL16_HA:
13423
        case R_PPC64_ADDR16_HIGHERA:
13424
        case R_PPC64_ADDR16_HIGHESTA:
13425
        case R_PPC64_TOC16_HA:
13426
        case R_PPC64_SECTOFF_HA:
13427
        case R_PPC64_TPREL16_HA:
13428
        case R_PPC64_DTPREL16_HA:
13429
        case R_PPC64_TPREL16_HIGHER:
13430
        case R_PPC64_TPREL16_HIGHERA:
13431
        case R_PPC64_TPREL16_HIGHEST:
13432
        case R_PPC64_TPREL16_HIGHESTA:
13433
        case R_PPC64_DTPREL16_HIGHER:
13434
        case R_PPC64_DTPREL16_HIGHERA:
13435
        case R_PPC64_DTPREL16_HIGHEST:
13436
        case R_PPC64_DTPREL16_HIGHESTA:
13437
          /* It's just possible that this symbol is a weak symbol
13438
             that's not actually defined anywhere. In that case,
13439
             'sec' would be NULL, and we should leave the symbol
13440
             alone (it will be set to zero elsewhere in the link).  */
13441
          if (sec == NULL)
13442
            break;
13443
          /* Fall thru */
13444
 
13445
        case R_PPC64_GOT16_HA:
13446
        case R_PPC64_PLTGOT16_HA:
13447
        case R_PPC64_PLT16_HA:
13448
        case R_PPC64_GOT_TLSGD16_HA:
13449
        case R_PPC64_GOT_TLSLD16_HA:
13450
        case R_PPC64_GOT_TPREL16_HA:
13451
        case R_PPC64_GOT_DTPREL16_HA:
13452
          /* Add 0x10000 if sign bit in 0:15 is set.
13453
             Bits 0:15 are not used.  */
13454
          addend += 0x8000;
13455
          break;
13456
 
13457
        case R_PPC64_ADDR16_DS:
13458
        case R_PPC64_ADDR16_LO_DS:
13459
        case R_PPC64_GOT16_DS:
13460
        case R_PPC64_GOT16_LO_DS:
13461
        case R_PPC64_PLT16_LO_DS:
13462
        case R_PPC64_SECTOFF_DS:
13463
        case R_PPC64_SECTOFF_LO_DS:
13464
        case R_PPC64_TOC16_DS:
13465
        case R_PPC64_TOC16_LO_DS:
13466
        case R_PPC64_PLTGOT16_DS:
13467
        case R_PPC64_PLTGOT16_LO_DS:
13468
        case R_PPC64_GOT_TPREL16_DS:
13469
        case R_PPC64_GOT_TPREL16_LO_DS:
13470
        case R_PPC64_GOT_DTPREL16_DS:
13471
        case R_PPC64_GOT_DTPREL16_LO_DS:
13472
        case R_PPC64_TPREL16_DS:
13473
        case R_PPC64_TPREL16_LO_DS:
13474
        case R_PPC64_DTPREL16_DS:
13475
        case R_PPC64_DTPREL16_LO_DS:
13476
          insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
13477
          mask = 3;
13478
          /* If this reloc is against an lq insn, then the value must be
13479
             a multiple of 16.  This is somewhat of a hack, but the
13480
             "correct" way to do this by defining _DQ forms of all the
13481
             _DS relocs bloats all reloc switches in this file.  It
13482
             doesn't seem to make much sense to use any of these relocs
13483
             in data, so testing the insn should be safe.  */
13484
          if ((insn & (0x3f << 26)) == (56u << 26))
13485
            mask = 15;
13486
          if (((relocation + addend) & mask) != 0)
13487
            {
13488
              info->callbacks->einfo
13489 161 khays
                (_("%P: %H: error: %s not a multiple of %u\n"),
13490 14 khays
                 input_bfd, input_section, rel->r_offset,
13491
                 ppc64_elf_howto_table[r_type]->name,
13492
                 mask + 1);
13493
              bfd_set_error (bfd_error_bad_value);
13494
              ret = FALSE;
13495
              continue;
13496
            }
13497
          break;
13498
        }
13499
 
13500
      /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
13501
         because such sections are not SEC_ALLOC and thus ld.so will
13502
         not process them.  */
13503
      if (unresolved_reloc
13504
          && !((input_section->flags & SEC_DEBUGGING) != 0
13505 163 khays
               && h->elf.def_dynamic)
13506
          && _bfd_elf_section_offset (output_bfd, info, input_section,
13507
                                      rel->r_offset) != (bfd_vma) -1)
13508 14 khays
        {
13509
          info->callbacks->einfo
13510 161 khays
            (_("%P: %H: unresolvable %s relocation against symbol `%s'\n"),
13511 14 khays
             input_bfd, input_section, rel->r_offset,
13512
             ppc64_elf_howto_table[(int) r_type]->name,
13513
             h->elf.root.root.string);
13514
          ret = FALSE;
13515
        }
13516
 
13517
      r = _bfd_final_link_relocate (ppc64_elf_howto_table[(int) r_type],
13518
                                    input_bfd,
13519
                                    input_section,
13520
                                    contents,
13521
                                    rel->r_offset,
13522
                                    relocation,
13523
                                    addend);
13524
 
13525
      if (r != bfd_reloc_ok)
13526
        {
13527
          if (sym_name == NULL)
13528
            sym_name = "(null)";
13529
          if (r == bfd_reloc_overflow)
13530
            {
13531
              if (warned)
13532
                continue;
13533
              if (h != NULL
13534
                  && h->elf.root.type == bfd_link_hash_undefweak
13535
                  && ppc64_elf_howto_table[r_type]->pc_relative)
13536
                {
13537
                  /* Assume this is a call protected by other code that
13538
                     detects the symbol is undefined.  If this is the case,
13539
                     we can safely ignore the overflow.  If not, the
13540
                     program is hosed anyway, and a little warning isn't
13541
                     going to help.  */
13542
 
13543
                  continue;
13544
                }
13545
 
13546
              if (!((*info->callbacks->reloc_overflow)
13547
                    (info, (h ? &h->elf.root : NULL), sym_name,
13548
                     ppc64_elf_howto_table[r_type]->name,
13549
                     orig_addend, input_bfd, input_section, rel->r_offset)))
13550
                return FALSE;
13551
            }
13552
          else
13553
            {
13554
              info->callbacks->einfo
13555 161 khays
                (_("%P: %H: %s reloc against `%s': error %d\n"),
13556 14 khays
                 input_bfd, input_section, rel->r_offset,
13557
                 ppc64_elf_howto_table[r_type]->name,
13558
                 sym_name,
13559
                 (int) r);
13560
              ret = FALSE;
13561
            }
13562
        }
13563
    }
13564
 
13565
  /* If we're emitting relocations, then shortly after this function
13566
     returns, reloc offsets and addends for this section will be
13567
     adjusted.  Worse, reloc symbol indices will be for the output
13568
     file rather than the input.  Save a copy of the relocs for
13569
     opd_entry_value.  */
13570
  if (is_opd && (info->emitrelocations || info->relocatable))
13571
    {
13572
      bfd_size_type amt;
13573
      amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
13574
      rel = bfd_alloc (input_bfd, amt);
13575
      BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd_relocs == NULL);
13576
      ppc64_elf_tdata (input_bfd)->opd_relocs = rel;
13577
      if (rel == NULL)
13578
        return FALSE;
13579
      memcpy (rel, relocs, amt);
13580
    }
13581
  return ret;
13582
}
13583
 
13584
/* Adjust the value of any local symbols in opd sections.  */
13585
 
13586
static int
13587
ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
13588
                              const char *name ATTRIBUTE_UNUSED,
13589
                              Elf_Internal_Sym *elfsym,
13590
                              asection *input_sec,
13591
                              struct elf_link_hash_entry *h)
13592
{
13593
  struct _opd_sec_data *opd;
13594
  long adjust;
13595
  bfd_vma value;
13596
 
13597
  if (h != NULL)
13598
    return 1;
13599
 
13600
  opd = get_opd_info (input_sec);
13601
  if (opd == NULL || opd->adjust == NULL)
13602
    return 1;
13603
 
13604
  value = elfsym->st_value - input_sec->output_offset;
13605
  if (!info->relocatable)
13606
    value -= input_sec->output_section->vma;
13607
 
13608
  adjust = opd->adjust[value / 8];
13609
  if (adjust == -1)
13610
    return 2;
13611
 
13612
  elfsym->st_value += adjust;
13613
  return 1;
13614
}
13615
 
13616
/* Finish up dynamic symbol handling.  We set the contents of various
13617
   dynamic sections here.  */
13618
 
13619
static bfd_boolean
13620
ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
13621
                                 struct bfd_link_info *info,
13622
                                 struct elf_link_hash_entry *h,
13623
                                 Elf_Internal_Sym *sym)
13624
{
13625
  struct ppc_link_hash_table *htab;
13626
  struct plt_entry *ent;
13627
  Elf_Internal_Rela rela;
13628
  bfd_byte *loc;
13629
 
13630
  htab = ppc_hash_table (info);
13631
  if (htab == NULL)
13632
    return FALSE;
13633
 
13634
  for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13635
    if (ent->plt.offset != (bfd_vma) -1)
13636
      {
13637
        /* This symbol has an entry in the procedure linkage
13638
           table.  Set it up.  */
13639
        if (!htab->elf.dynamic_sections_created
13640
            || h->dynindx == -1)
13641
          {
13642
            BFD_ASSERT (h->type == STT_GNU_IFUNC
13643
                        && h->def_regular
13644
                        && (h->root.type == bfd_link_hash_defined
13645
                            || h->root.type == bfd_link_hash_defweak));
13646
            rela.r_offset = (htab->iplt->output_section->vma
13647
                             + htab->iplt->output_offset
13648
                             + ent->plt.offset);
13649
            rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
13650
            rela.r_addend = (h->root.u.def.value
13651
                             + h->root.u.def.section->output_offset
13652
                             + h->root.u.def.section->output_section->vma
13653
                             + ent->addend);
13654
            loc = (htab->reliplt->contents
13655
                   + (htab->reliplt->reloc_count++
13656
                      * sizeof (Elf64_External_Rela)));
13657
          }
13658
        else
13659
          {
13660
            rela.r_offset = (htab->plt->output_section->vma
13661
                             + htab->plt->output_offset
13662
                             + ent->plt.offset);
13663
            rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
13664
            rela.r_addend = ent->addend;
13665
            loc = (htab->relplt->contents
13666
                   + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE)
13667
                      / (PLT_ENTRY_SIZE / sizeof (Elf64_External_Rela))));
13668
          }
13669
        bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
13670
      }
13671
 
13672
  if (h->needs_copy)
13673
    {
13674
      /* This symbol needs a copy reloc.  Set it up.  */
13675
 
13676
      if (h->dynindx == -1
13677
          || (h->root.type != bfd_link_hash_defined
13678
              && h->root.type != bfd_link_hash_defweak)
13679
          || htab->relbss == NULL)
13680
        abort ();
13681
 
13682
      rela.r_offset = (h->root.u.def.value
13683
                       + h->root.u.def.section->output_section->vma
13684
                       + h->root.u.def.section->output_offset);
13685
      rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
13686
      rela.r_addend = 0;
13687
      loc = htab->relbss->contents;
13688
      loc += htab->relbss->reloc_count++ * sizeof (Elf64_External_Rela);
13689
      bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
13690
    }
13691
 
13692
  /* Mark some specially defined symbols as absolute.  */
13693
  if (strcmp (h->root.root.string, "_DYNAMIC") == 0)
13694
    sym->st_shndx = SHN_ABS;
13695
 
13696
  return TRUE;
13697
}
13698
 
13699
/* Used to decide how to sort relocs in an optimal manner for the
13700
   dynamic linker, before writing them out.  */
13701
 
13702
static enum elf_reloc_type_class
13703
ppc64_elf_reloc_type_class (const Elf_Internal_Rela *rela)
13704
{
13705
  enum elf_ppc64_reloc_type r_type;
13706
 
13707
  r_type = ELF64_R_TYPE (rela->r_info);
13708
  switch (r_type)
13709
    {
13710
    case R_PPC64_RELATIVE:
13711
      return reloc_class_relative;
13712
    case R_PPC64_JMP_SLOT:
13713
      return reloc_class_plt;
13714
    case R_PPC64_COPY:
13715
      return reloc_class_copy;
13716
    default:
13717
      return reloc_class_normal;
13718
    }
13719
}
13720
 
13721
/* Finish up the dynamic sections.  */
13722
 
13723
static bfd_boolean
13724
ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
13725
                                   struct bfd_link_info *info)
13726
{
13727
  struct ppc_link_hash_table *htab;
13728
  bfd *dynobj;
13729
  asection *sdyn;
13730
 
13731
  htab = ppc_hash_table (info);
13732
  if (htab == NULL)
13733
    return FALSE;
13734
 
13735
  dynobj = htab->elf.dynobj;
13736
  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
13737
 
13738
  if (htab->elf.dynamic_sections_created)
13739
    {
13740
      Elf64_External_Dyn *dyncon, *dynconend;
13741
 
13742
      if (sdyn == NULL || htab->got == NULL)
13743
        abort ();
13744
 
13745
      dyncon = (Elf64_External_Dyn *) sdyn->contents;
13746
      dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
13747
      for (; dyncon < dynconend; dyncon++)
13748
        {
13749
          Elf_Internal_Dyn dyn;
13750
          asection *s;
13751
 
13752
          bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
13753
 
13754
          switch (dyn.d_tag)
13755
            {
13756
            default:
13757
              continue;
13758
 
13759
            case DT_PPC64_GLINK:
13760
              s = htab->glink;
13761
              dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
13762
              /* We stupidly defined DT_PPC64_GLINK to be the start
13763
                 of glink rather than the first entry point, which is
13764
                 what ld.so needs, and now have a bigger stub to
13765
                 support automatic multiple TOCs.  */
13766
              dyn.d_un.d_ptr += GLINK_CALL_STUB_SIZE - 32;
13767
              break;
13768
 
13769
            case DT_PPC64_OPD:
13770
              s = bfd_get_section_by_name (output_bfd, ".opd");
13771
              if (s == NULL)
13772
                continue;
13773
              dyn.d_un.d_ptr = s->vma;
13774
              break;
13775
 
13776
            case DT_PPC64_OPDSZ:
13777
              s = bfd_get_section_by_name (output_bfd, ".opd");
13778
              if (s == NULL)
13779
                continue;
13780
              dyn.d_un.d_val = s->size;
13781
              break;
13782
 
13783
            case DT_PLTGOT:
13784
              s = htab->plt;
13785
              dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
13786
              break;
13787
 
13788
            case DT_JMPREL:
13789
              s = htab->relplt;
13790
              dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
13791
              break;
13792
 
13793
            case DT_PLTRELSZ:
13794
              dyn.d_un.d_val = htab->relplt->size;
13795
              break;
13796
 
13797
            case DT_RELASZ:
13798
              /* Don't count procedure linkage table relocs in the
13799
                 overall reloc count.  */
13800
              s = htab->relplt;
13801
              if (s == NULL)
13802
                continue;
13803
              dyn.d_un.d_val -= s->size;
13804
              break;
13805
 
13806
            case DT_RELA:
13807
              /* We may not be using the standard ELF linker script.
13808
                 If .rela.plt is the first .rela section, we adjust
13809
                 DT_RELA to not include it.  */
13810
              s = htab->relplt;
13811
              if (s == NULL)
13812
                continue;
13813
              if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
13814
                continue;
13815
              dyn.d_un.d_ptr += s->size;
13816
              break;
13817
            }
13818
 
13819
          bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
13820
        }
13821
    }
13822
 
13823
  if (htab->got != NULL && htab->got->size != 0)
13824
    {
13825
      /* Fill in the first entry in the global offset table.
13826
         We use it to hold the link-time TOCbase.  */
13827
      bfd_put_64 (output_bfd,
13828
                  elf_gp (output_bfd) + TOC_BASE_OFF,
13829
                  htab->got->contents);
13830
 
13831
      /* Set .got entry size.  */
13832
      elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 8;
13833
    }
13834
 
13835
  if (htab->plt != NULL && htab->plt->size != 0)
13836
    {
13837
      /* Set .plt entry size.  */
13838
      elf_section_data (htab->plt->output_section)->this_hdr.sh_entsize
13839
        = PLT_ENTRY_SIZE;
13840
    }
13841
 
13842
  /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
13843
     brlt ourselves if emitrelocations.  */
13844
  if (htab->brlt != NULL
13845
      && htab->brlt->reloc_count != 0
13846
      && !_bfd_elf_link_output_relocs (output_bfd,
13847
                                       htab->brlt,
13848
                                       elf_section_data (htab->brlt)->rela.hdr,
13849
                                       elf_section_data (htab->brlt)->relocs,
13850
                                       NULL))
13851
    return FALSE;
13852
 
13853
  if (htab->glink != NULL
13854
      && htab->glink->reloc_count != 0
13855
      && !_bfd_elf_link_output_relocs (output_bfd,
13856
                                       htab->glink,
13857
                                       elf_section_data (htab->glink)->rela.hdr,
13858
                                       elf_section_data (htab->glink)->relocs,
13859
                                       NULL))
13860
    return FALSE;
13861
 
13862 161 khays
 
13863
  if (htab->glink_eh_frame != NULL
13864
      && htab->glink_eh_frame->sec_info_type == ELF_INFO_TYPE_EH_FRAME
13865
      && !_bfd_elf_write_section_eh_frame (output_bfd, info,
13866
                                           htab->glink_eh_frame,
13867
                                           htab->glink_eh_frame->contents))
13868
    return FALSE;
13869
 
13870 14 khays
  /* We need to handle writing out multiple GOT sections ourselves,
13871
     since we didn't add them to DYNOBJ.  We know dynobj is the first
13872
     bfd.  */
13873
  while ((dynobj = dynobj->link_next) != NULL)
13874
    {
13875
      asection *s;
13876
 
13877
      if (!is_ppc64_elf (dynobj))
13878
        continue;
13879
 
13880
      s = ppc64_elf_tdata (dynobj)->got;
13881
      if (s != NULL
13882
          && s->size != 0
13883
          && s->output_section != bfd_abs_section_ptr
13884
          && !bfd_set_section_contents (output_bfd, s->output_section,
13885
                                        s->contents, s->output_offset,
13886
                                        s->size))
13887
        return FALSE;
13888
      s = ppc64_elf_tdata (dynobj)->relgot;
13889
      if (s != NULL
13890
          && s->size != 0
13891
          && s->output_section != bfd_abs_section_ptr
13892
          && !bfd_set_section_contents (output_bfd, s->output_section,
13893
                                        s->contents, s->output_offset,
13894
                                        s->size))
13895
        return FALSE;
13896
    }
13897
 
13898
  return TRUE;
13899
}
13900
 
13901
#include "elf64-target.h"

powered by: WebSVN 2.1.0

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