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 303

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 166 khays
   2009, 2010, 2011, 2012 Free Software Foundation, Inc.
4 14 khays
   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 166 khays
#define elf_backend_maybe_function_sym        ppc64_elf_maybe_function_sym
109 14 khays
#define elf_backend_always_size_sections      ppc64_elf_func_desc_adjust
110
#define elf_backend_size_dynamic_sections     ppc64_elf_size_dynamic_sections
111
#define elf_backend_init_index_section        _bfd_elf_init_2_index_sections
112
#define elf_backend_action_discarded          ppc64_elf_action_discarded
113
#define elf_backend_relocate_section          ppc64_elf_relocate_section
114
#define elf_backend_finish_dynamic_symbol     ppc64_elf_finish_dynamic_symbol
115
#define elf_backend_reloc_type_class          ppc64_elf_reloc_type_class
116
#define elf_backend_finish_dynamic_sections   ppc64_elf_finish_dynamic_sections
117
#define elf_backend_link_output_symbol_hook   ppc64_elf_output_symbol_hook
118
#define elf_backend_special_sections          ppc64_elf_special_sections
119
#define elf_backend_post_process_headers      _bfd_elf_set_osabi
120
 
121
/* The name of the dynamic interpreter.  This is put in the .interp
122
   section.  */
123
#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
124
 
125
/* The size in bytes of an entry in the procedure linkage table.  */
126
#define PLT_ENTRY_SIZE 24
127
 
128
/* The initial size of the plt reserved for the dynamic linker.  */
129
#define PLT_INITIAL_ENTRY_SIZE PLT_ENTRY_SIZE
130
 
131
/* TOC base pointers offset from start of TOC.  */
132
#define TOC_BASE_OFF    0x8000
133
 
134
/* Offset of tp and dtp pointers from start of TLS block.  */
135
#define TP_OFFSET       0x7000
136
#define DTP_OFFSET      0x8000
137
 
138
/* .plt call stub instructions.  The normal stub is like this, but
139
   sometimes the .plt entry crosses a 64k boundary and we need to
140
   insert an addi to adjust r12.  */
141
#define PLT_CALL_STUB_SIZE (7*4)
142
#define ADDIS_R12_R2    0x3d820000      /* addis %r12,%r2,xxx@ha     */
143
#define STD_R2_40R1     0xf8410028      /* std   %r2,40(%r1)         */
144
#define LD_R11_0R12     0xe96c0000      /* ld    %r11,xxx+0@l(%r12)  */
145
#define MTCTR_R11       0x7d6903a6      /* mtctr %r11                */
146
#define LD_R2_0R12      0xe84c0000      /* ld    %r2,xxx+8@l(%r12)   */
147
                                        /* ld    %r11,xxx+16@l(%r12) */
148
#define BCTR            0x4e800420      /* bctr                      */
149
 
150
 
151
#define ADDIS_R12_R12   0x3d8c0000      /* addis %r12,%r12,off@ha  */
152
#define ADDI_R12_R12    0x398c0000      /* addi %r12,%r12,off@l  */
153
#define ADDIS_R2_R2     0x3c420000      /* addis %r2,%r2,off@ha  */
154
#define ADDI_R2_R2      0x38420000      /* addi  %r2,%r2,off@l   */
155
 
156 166 khays
#define XOR_R11_R11_R11 0x7d6b5a78      /* xor   %r11,%r11,%r11  */
157
#define ADD_R12_R12_R11 0x7d8c5a14      /* add   %r12,%r12,%r11  */
158
#define ADD_R2_R2_R11   0x7c425a14      /* add   %r2,%r2,%r11    */
159
#define CMPLDI_R2_0     0x28220000      /* cmpldi %r2,0          */
160
#define BNECTR          0x4ca20420      /* bnectr+               */
161
#define BNECTR_P4       0x4ce20420      /* bnectr+               */
162
 
163 14 khays
#define LD_R11_0R2      0xe9620000      /* ld    %r11,xxx+0(%r2) */
164
#define LD_R2_0R2       0xe8420000      /* ld    %r2,xxx+0(%r2)  */
165
 
166
#define LD_R2_40R1      0xe8410028      /* ld    %r2,40(%r1)     */
167
 
168
/* glink call stub instructions.  We enter with the index in R0.  */
169
#define GLINK_CALL_STUB_SIZE (16*4)
170
                                        /* 0:                           */
171
                                        /*  .quad plt0-1f               */
172
                                        /* __glink:                     */
173
#define MFLR_R12        0x7d8802a6      /*  mflr %12                    */
174
#define BCL_20_31       0x429f0005      /*  bcl 20,31,1f                */
175
                                        /* 1:                           */
176
#define MFLR_R11        0x7d6802a6      /*  mflr %11                    */
177
#define LD_R2_M16R11    0xe84bfff0      /*  ld %2,(0b-1b)(%11)          */
178
#define MTLR_R12        0x7d8803a6      /*  mtlr %12                    */
179
#define ADD_R12_R2_R11  0x7d825a14      /*  add %12,%2,%11              */
180
                                        /*  ld %11,0(%12)               */
181
                                        /*  ld %2,8(%12)                */
182
                                        /*  mtctr %11                   */
183
                                        /*  ld %11,16(%12)              */
184
                                        /*  bctr                        */
185
 
186
/* Pad with this.  */
187
#define NOP             0x60000000
188
 
189
/* Some other nops.  */
190
#define CROR_151515     0x4def7b82
191
#define CROR_313131     0x4ffffb82
192
 
193
/* .glink entries for the first 32k functions are two instructions.  */
194
#define LI_R0_0         0x38000000      /* li    %r0,0          */
195
#define B_DOT           0x48000000      /* b     .              */
196
 
197
/* After that, we need two instructions to load the index, followed by
198
   a branch.  */
199
#define LIS_R0_0        0x3c000000      /* lis   %r0,0          */
200
#define ORI_R0_R0_0     0x60000000      /* ori   %r0,%r0,0      */
201
 
202
/* Instructions used by the save and restore reg functions.  */
203
#define STD_R0_0R1      0xf8010000      /* std   %r0,0(%r1)     */
204
#define STD_R0_0R12     0xf80c0000      /* std   %r0,0(%r12)    */
205
#define LD_R0_0R1       0xe8010000      /* ld    %r0,0(%r1)     */
206
#define LD_R0_0R12      0xe80c0000      /* ld    %r0,0(%r12)    */
207
#define STFD_FR0_0R1    0xd8010000      /* stfd  %fr0,0(%r1)    */
208
#define LFD_FR0_0R1     0xc8010000      /* lfd   %fr0,0(%r1)    */
209
#define LI_R12_0        0x39800000      /* li    %r12,0         */
210
#define STVX_VR0_R12_R0 0x7c0c01ce      /* stvx  %v0,%r12,%r0   */
211
#define LVX_VR0_R12_R0  0x7c0c00ce      /* lvx   %v0,%r12,%r0   */
212
#define MTLR_R0         0x7c0803a6      /* mtlr  %r0            */
213
#define BLR             0x4e800020      /* blr                  */
214
 
215
/* Since .opd is an array of descriptors and each entry will end up
216
   with identical R_PPC64_RELATIVE relocs, there is really no need to
217
   propagate .opd relocs;  The dynamic linker should be taught to
218
   relocate .opd without reloc entries.  */
219
#ifndef NO_OPD_RELOCS
220
#define NO_OPD_RELOCS 0
221
#endif
222
 
223
#define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
224
 
225
/* Relocation HOWTO's.  */
226
static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
227
 
228
static reloc_howto_type ppc64_elf_howto_raw[] = {
229
  /* This reloc does nothing.  */
230
  HOWTO (R_PPC64_NONE,          /* type */
231
         0,                      /* rightshift */
232
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
233
         32,                    /* bitsize */
234
         FALSE,                 /* pc_relative */
235
         0,                      /* bitpos */
236
         complain_overflow_dont, /* complain_on_overflow */
237
         bfd_elf_generic_reloc, /* special_function */
238
         "R_PPC64_NONE",        /* name */
239
         FALSE,                 /* partial_inplace */
240
         0,                      /* src_mask */
241
         0,                      /* dst_mask */
242
         FALSE),                /* pcrel_offset */
243
 
244
  /* A standard 32 bit relocation.  */
245
  HOWTO (R_PPC64_ADDR32,        /* type */
246
         0,                      /* rightshift */
247
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
248
         32,                    /* bitsize */
249
         FALSE,                 /* pc_relative */
250
         0,                      /* bitpos */
251
         complain_overflow_bitfield, /* complain_on_overflow */
252
         bfd_elf_generic_reloc, /* special_function */
253
         "R_PPC64_ADDR32",      /* name */
254
         FALSE,                 /* partial_inplace */
255
         0,                      /* src_mask */
256
         0xffffffff,            /* dst_mask */
257
         FALSE),                /* pcrel_offset */
258
 
259
  /* An absolute 26 bit branch; the lower two bits must be zero.
260
     FIXME: we don't check that, we just clear them.  */
261
  HOWTO (R_PPC64_ADDR24,        /* type */
262
         0,                      /* rightshift */
263
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
264
         26,                    /* bitsize */
265
         FALSE,                 /* pc_relative */
266
         0,                      /* bitpos */
267
         complain_overflow_bitfield, /* complain_on_overflow */
268
         bfd_elf_generic_reloc, /* special_function */
269
         "R_PPC64_ADDR24",      /* name */
270
         FALSE,                 /* partial_inplace */
271
         0,                      /* src_mask */
272
         0x03fffffc,            /* dst_mask */
273
         FALSE),                /* pcrel_offset */
274
 
275
  /* A standard 16 bit relocation.  */
276
  HOWTO (R_PPC64_ADDR16,        /* type */
277
         0,                      /* rightshift */
278
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
279
         16,                    /* bitsize */
280
         FALSE,                 /* pc_relative */
281
         0,                      /* bitpos */
282
         complain_overflow_bitfield, /* complain_on_overflow */
283
         bfd_elf_generic_reloc, /* special_function */
284
         "R_PPC64_ADDR16",      /* name */
285
         FALSE,                 /* partial_inplace */
286
         0,                      /* src_mask */
287
         0xffff,                /* dst_mask */
288
         FALSE),                /* pcrel_offset */
289
 
290
  /* A 16 bit relocation without overflow.  */
291
  HOWTO (R_PPC64_ADDR16_LO,     /* type */
292
         0,                      /* rightshift */
293
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
294
         16,                    /* bitsize */
295
         FALSE,                 /* pc_relative */
296
         0,                      /* bitpos */
297
         complain_overflow_dont,/* complain_on_overflow */
298
         bfd_elf_generic_reloc, /* special_function */
299
         "R_PPC64_ADDR16_LO",   /* name */
300
         FALSE,                 /* partial_inplace */
301
         0,                      /* src_mask */
302
         0xffff,                /* dst_mask */
303
         FALSE),                /* pcrel_offset */
304
 
305
  /* Bits 16-31 of an address.  */
306
  HOWTO (R_PPC64_ADDR16_HI,     /* type */
307
         16,                    /* rightshift */
308
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
309
         16,                    /* bitsize */
310
         FALSE,                 /* pc_relative */
311
         0,                      /* bitpos */
312
         complain_overflow_dont, /* complain_on_overflow */
313
         bfd_elf_generic_reloc, /* special_function */
314
         "R_PPC64_ADDR16_HI",   /* name */
315
         FALSE,                 /* partial_inplace */
316
         0,                      /* src_mask */
317
         0xffff,                /* dst_mask */
318
         FALSE),                /* pcrel_offset */
319
 
320
  /* Bits 16-31 of an address, plus 1 if the contents of the low 16
321
     bits, treated as a signed number, is negative.  */
322
  HOWTO (R_PPC64_ADDR16_HA,     /* type */
323
         16,                    /* rightshift */
324
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
325
         16,                    /* bitsize */
326
         FALSE,                 /* pc_relative */
327
         0,                      /* bitpos */
328
         complain_overflow_dont, /* complain_on_overflow */
329
         ppc64_elf_ha_reloc,    /* special_function */
330
         "R_PPC64_ADDR16_HA",   /* name */
331
         FALSE,                 /* partial_inplace */
332
         0,                      /* src_mask */
333
         0xffff,                /* dst_mask */
334
         FALSE),                /* pcrel_offset */
335
 
336
  /* An absolute 16 bit branch; the lower two bits must be zero.
337
     FIXME: we don't check that, we just clear them.  */
338
  HOWTO (R_PPC64_ADDR14,        /* type */
339
         0,                      /* rightshift */
340
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
341
         16,                    /* bitsize */
342
         FALSE,                 /* pc_relative */
343
         0,                      /* bitpos */
344
         complain_overflow_bitfield, /* complain_on_overflow */
345
         ppc64_elf_branch_reloc, /* special_function */
346
         "R_PPC64_ADDR14",      /* name */
347
         FALSE,                 /* partial_inplace */
348
         0,                      /* src_mask */
349
         0x0000fffc,            /* dst_mask */
350
         FALSE),                /* pcrel_offset */
351
 
352
  /* An absolute 16 bit branch, for which bit 10 should be set to
353
     indicate that the branch is expected to be taken.  The lower two
354
     bits must be zero.  */
355
  HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */
356
         0,                      /* rightshift */
357
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
358
         16,                    /* bitsize */
359
         FALSE,                 /* pc_relative */
360
         0,                      /* bitpos */
361
         complain_overflow_bitfield, /* complain_on_overflow */
362
         ppc64_elf_brtaken_reloc, /* special_function */
363
         "R_PPC64_ADDR14_BRTAKEN",/* name */
364
         FALSE,                 /* partial_inplace */
365
         0,                      /* src_mask */
366
         0x0000fffc,            /* dst_mask */
367
         FALSE),                /* pcrel_offset */
368
 
369
  /* An absolute 16 bit branch, for which bit 10 should be set to
370
     indicate that the branch is not expected to be taken.  The lower
371
     two bits must be zero.  */
372
  HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */
373
         0,                      /* rightshift */
374
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
375
         16,                    /* bitsize */
376
         FALSE,                 /* pc_relative */
377
         0,                      /* bitpos */
378
         complain_overflow_bitfield, /* complain_on_overflow */
379
         ppc64_elf_brtaken_reloc, /* special_function */
380
         "R_PPC64_ADDR14_BRNTAKEN",/* name */
381
         FALSE,                 /* partial_inplace */
382
         0,                      /* src_mask */
383
         0x0000fffc,            /* dst_mask */
384
         FALSE),                /* pcrel_offset */
385
 
386
  /* A relative 26 bit branch; the lower two bits must be zero.  */
387
  HOWTO (R_PPC64_REL24,         /* type */
388
         0,                      /* rightshift */
389
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
390
         26,                    /* bitsize */
391
         TRUE,                  /* pc_relative */
392
         0,                      /* bitpos */
393
         complain_overflow_signed, /* complain_on_overflow */
394
         ppc64_elf_branch_reloc, /* special_function */
395
         "R_PPC64_REL24",       /* name */
396
         FALSE,                 /* partial_inplace */
397
         0,                      /* src_mask */
398
         0x03fffffc,            /* dst_mask */
399
         TRUE),                 /* pcrel_offset */
400
 
401
  /* A relative 16 bit branch; the lower two bits must be zero.  */
402
  HOWTO (R_PPC64_REL14,         /* type */
403
         0,                      /* rightshift */
404
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
405
         16,                    /* bitsize */
406
         TRUE,                  /* pc_relative */
407
         0,                      /* bitpos */
408
         complain_overflow_signed, /* complain_on_overflow */
409
         ppc64_elf_branch_reloc, /* special_function */
410
         "R_PPC64_REL14",       /* name */
411
         FALSE,                 /* partial_inplace */
412
         0,                      /* src_mask */
413
         0x0000fffc,            /* dst_mask */
414
         TRUE),                 /* pcrel_offset */
415
 
416
  /* A relative 16 bit branch.  Bit 10 should be set to indicate that
417
     the branch is expected to be taken.  The lower two bits must be
418
     zero.  */
419
  HOWTO (R_PPC64_REL14_BRTAKEN, /* type */
420
         0,                      /* rightshift */
421
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
422
         16,                    /* bitsize */
423
         TRUE,                  /* pc_relative */
424
         0,                      /* bitpos */
425
         complain_overflow_signed, /* complain_on_overflow */
426
         ppc64_elf_brtaken_reloc, /* special_function */
427
         "R_PPC64_REL14_BRTAKEN", /* name */
428
         FALSE,                 /* partial_inplace */
429
         0,                      /* src_mask */
430
         0x0000fffc,            /* dst_mask */
431
         TRUE),                 /* pcrel_offset */
432
 
433
  /* A relative 16 bit branch.  Bit 10 should be set to indicate that
434
     the branch is not expected to be taken.  The lower two bits must
435
     be zero.  */
436
  HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */
437
         0,                      /* rightshift */
438
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
439
         16,                    /* bitsize */
440
         TRUE,                  /* pc_relative */
441
         0,                      /* bitpos */
442
         complain_overflow_signed, /* complain_on_overflow */
443
         ppc64_elf_brtaken_reloc, /* special_function */
444
         "R_PPC64_REL14_BRNTAKEN",/* name */
445
         FALSE,                 /* partial_inplace */
446
         0,                      /* src_mask */
447
         0x0000fffc,            /* dst_mask */
448
         TRUE),                 /* pcrel_offset */
449
 
450
  /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
451
     symbol.  */
452
  HOWTO (R_PPC64_GOT16,         /* type */
453
         0,                      /* rightshift */
454
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
455
         16,                    /* bitsize */
456
         FALSE,                 /* pc_relative */
457
         0,                      /* bitpos */
458
         complain_overflow_signed, /* complain_on_overflow */
459
         ppc64_elf_unhandled_reloc, /* special_function */
460
         "R_PPC64_GOT16",       /* name */
461
         FALSE,                 /* partial_inplace */
462
         0,                      /* src_mask */
463
         0xffff,                /* dst_mask */
464
         FALSE),                /* pcrel_offset */
465
 
466
  /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
467
     the symbol.  */
468
  HOWTO (R_PPC64_GOT16_LO,      /* type */
469
         0,                      /* rightshift */
470
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
471
         16,                    /* bitsize */
472
         FALSE,                 /* pc_relative */
473
         0,                      /* bitpos */
474
         complain_overflow_dont, /* complain_on_overflow */
475
         ppc64_elf_unhandled_reloc, /* special_function */
476
         "R_PPC64_GOT16_LO",    /* name */
477
         FALSE,                 /* partial_inplace */
478
         0,                      /* src_mask */
479
         0xffff,                /* dst_mask */
480
         FALSE),                /* pcrel_offset */
481
 
482
  /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
483
     the symbol.  */
484
  HOWTO (R_PPC64_GOT16_HI,      /* type */
485
         16,                    /* rightshift */
486
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
487
         16,                    /* bitsize */
488
         FALSE,                 /* pc_relative */
489
         0,                      /* bitpos */
490
         complain_overflow_dont,/* complain_on_overflow */
491
         ppc64_elf_unhandled_reloc, /* special_function */
492
         "R_PPC64_GOT16_HI",    /* name */
493
         FALSE,                 /* partial_inplace */
494
         0,                      /* src_mask */
495
         0xffff,                /* dst_mask */
496
         FALSE),                /* pcrel_offset */
497
 
498
  /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
499
     the symbol.  */
500
  HOWTO (R_PPC64_GOT16_HA,      /* type */
501
         16,                    /* rightshift */
502
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
503
         16,                    /* bitsize */
504
         FALSE,                 /* pc_relative */
505
         0,                      /* bitpos */
506
         complain_overflow_dont,/* complain_on_overflow */
507
         ppc64_elf_unhandled_reloc, /* special_function */
508
         "R_PPC64_GOT16_HA",    /* name */
509
         FALSE,                 /* partial_inplace */
510
         0,                      /* src_mask */
511
         0xffff,                /* dst_mask */
512
         FALSE),                /* pcrel_offset */
513
 
514
  /* This is used only by the dynamic linker.  The symbol should exist
515
     both in the object being run and in some shared library.  The
516
     dynamic linker copies the data addressed by the symbol from the
517
     shared library into the object, because the object being
518
     run has to have the data at some particular address.  */
519
  HOWTO (R_PPC64_COPY,          /* type */
520
         0,                      /* rightshift */
521
         0,                      /* this one is variable size */
522
         0,                      /* bitsize */
523
         FALSE,                 /* pc_relative */
524
         0,                      /* bitpos */
525
         complain_overflow_dont, /* complain_on_overflow */
526
         ppc64_elf_unhandled_reloc, /* special_function */
527
         "R_PPC64_COPY",        /* name */
528
         FALSE,                 /* partial_inplace */
529
         0,                      /* src_mask */
530
         0,                      /* dst_mask */
531
         FALSE),                /* pcrel_offset */
532
 
533
  /* Like R_PPC64_ADDR64, but used when setting global offset table
534
     entries.  */
535
  HOWTO (R_PPC64_GLOB_DAT,      /* type */
536
         0,                      /* rightshift */
537
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
538
         64,                    /* bitsize */
539
         FALSE,                 /* pc_relative */
540
         0,                      /* bitpos */
541
         complain_overflow_dont, /* complain_on_overflow */
542
         ppc64_elf_unhandled_reloc,  /* special_function */
543
         "R_PPC64_GLOB_DAT",    /* name */
544
         FALSE,                 /* partial_inplace */
545
         0,                      /* src_mask */
546
         ONES (64),             /* dst_mask */
547
         FALSE),                /* pcrel_offset */
548
 
549
  /* Created by the link editor.  Marks a procedure linkage table
550
     entry for a symbol.  */
551
  HOWTO (R_PPC64_JMP_SLOT,      /* type */
552
         0,                      /* rightshift */
553
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
554
         0,                      /* bitsize */
555
         FALSE,                 /* pc_relative */
556
         0,                      /* bitpos */
557
         complain_overflow_dont, /* complain_on_overflow */
558
         ppc64_elf_unhandled_reloc, /* special_function */
559
         "R_PPC64_JMP_SLOT",    /* name */
560
         FALSE,                 /* partial_inplace */
561
         0,                      /* src_mask */
562
         0,                      /* dst_mask */
563
         FALSE),                /* pcrel_offset */
564
 
565
  /* Used only by the dynamic linker.  When the object is run, this
566
     doubleword64 is set to the load address of the object, plus the
567
     addend.  */
568
  HOWTO (R_PPC64_RELATIVE,      /* type */
569
         0,                      /* rightshift */
570
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
571
         64,                    /* bitsize */
572
         FALSE,                 /* pc_relative */
573
         0,                      /* bitpos */
574
         complain_overflow_dont, /* complain_on_overflow */
575
         bfd_elf_generic_reloc, /* special_function */
576
         "R_PPC64_RELATIVE",    /* name */
577
         FALSE,                 /* partial_inplace */
578
         0,                      /* src_mask */
579
         ONES (64),             /* dst_mask */
580
         FALSE),                /* pcrel_offset */
581
 
582
  /* Like R_PPC64_ADDR32, but may be unaligned.  */
583
  HOWTO (R_PPC64_UADDR32,       /* type */
584
         0,                      /* rightshift */
585
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
586
         32,                    /* bitsize */
587
         FALSE,                 /* pc_relative */
588
         0,                      /* bitpos */
589
         complain_overflow_bitfield, /* complain_on_overflow */
590
         bfd_elf_generic_reloc, /* special_function */
591
         "R_PPC64_UADDR32",     /* name */
592
         FALSE,                 /* partial_inplace */
593
         0,                      /* src_mask */
594
         0xffffffff,            /* dst_mask */
595
         FALSE),                /* pcrel_offset */
596
 
597
  /* Like R_PPC64_ADDR16, but may be unaligned.  */
598
  HOWTO (R_PPC64_UADDR16,       /* type */
599
         0,                      /* rightshift */
600
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
601
         16,                    /* bitsize */
602
         FALSE,                 /* pc_relative */
603
         0,                      /* bitpos */
604
         complain_overflow_bitfield, /* complain_on_overflow */
605
         bfd_elf_generic_reloc, /* special_function */
606
         "R_PPC64_UADDR16",     /* name */
607
         FALSE,                 /* partial_inplace */
608
         0,                      /* src_mask */
609
         0xffff,                /* dst_mask */
610
         FALSE),                /* pcrel_offset */
611
 
612
  /* 32-bit PC relative.  */
613
  HOWTO (R_PPC64_REL32,         /* type */
614
         0,                      /* rightshift */
615
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
616
         32,                    /* bitsize */
617
         TRUE,                  /* pc_relative */
618
         0,                      /* bitpos */
619
         /* FIXME: Verify.  Was complain_overflow_bitfield.  */
620
         complain_overflow_signed, /* complain_on_overflow */
621
         bfd_elf_generic_reloc, /* special_function */
622
         "R_PPC64_REL32",       /* name */
623
         FALSE,                 /* partial_inplace */
624
         0,                      /* src_mask */
625
         0xffffffff,            /* dst_mask */
626
         TRUE),                 /* pcrel_offset */
627
 
628
  /* 32-bit relocation to the symbol's procedure linkage table.  */
629
  HOWTO (R_PPC64_PLT32,         /* type */
630
         0,                      /* rightshift */
631
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
632
         32,                    /* bitsize */
633
         FALSE,                 /* pc_relative */
634
         0,                      /* bitpos */
635
         complain_overflow_bitfield, /* complain_on_overflow */
636
         ppc64_elf_unhandled_reloc, /* special_function */
637
         "R_PPC64_PLT32",       /* name */
638
         FALSE,                 /* partial_inplace */
639
         0,                      /* src_mask */
640
         0xffffffff,            /* dst_mask */
641
         FALSE),                /* pcrel_offset */
642
 
643
  /* 32-bit PC relative relocation to the symbol's procedure linkage table.
644
     FIXME: R_PPC64_PLTREL32 not supported.  */
645
  HOWTO (R_PPC64_PLTREL32,      /* type */
646
         0,                      /* rightshift */
647
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
648
         32,                    /* bitsize */
649
         TRUE,                  /* pc_relative */
650
         0,                      /* bitpos */
651
         complain_overflow_signed, /* complain_on_overflow */
652
         bfd_elf_generic_reloc, /* special_function */
653
         "R_PPC64_PLTREL32",    /* name */
654
         FALSE,                 /* partial_inplace */
655
         0,                      /* src_mask */
656
         0xffffffff,            /* dst_mask */
657
         TRUE),                 /* pcrel_offset */
658
 
659
  /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
660
     the symbol.  */
661
  HOWTO (R_PPC64_PLT16_LO,      /* type */
662
         0,                      /* rightshift */
663
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
664
         16,                    /* bitsize */
665
         FALSE,                 /* pc_relative */
666
         0,                      /* bitpos */
667
         complain_overflow_dont, /* complain_on_overflow */
668
         ppc64_elf_unhandled_reloc, /* special_function */
669
         "R_PPC64_PLT16_LO",    /* name */
670
         FALSE,                 /* partial_inplace */
671
         0,                      /* src_mask */
672
         0xffff,                /* dst_mask */
673
         FALSE),                /* pcrel_offset */
674
 
675
  /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
676
     the symbol.  */
677
  HOWTO (R_PPC64_PLT16_HI,      /* type */
678
         16,                    /* rightshift */
679
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
680
         16,                    /* bitsize */
681
         FALSE,                 /* pc_relative */
682
         0,                      /* bitpos */
683
         complain_overflow_dont, /* complain_on_overflow */
684
         ppc64_elf_unhandled_reloc, /* special_function */
685
         "R_PPC64_PLT16_HI",    /* name */
686
         FALSE,                 /* partial_inplace */
687
         0,                      /* src_mask */
688
         0xffff,                /* dst_mask */
689
         FALSE),                /* pcrel_offset */
690
 
691
  /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
692
     the symbol.  */
693
  HOWTO (R_PPC64_PLT16_HA,      /* type */
694
         16,                    /* rightshift */
695
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
696
         16,                    /* bitsize */
697
         FALSE,                 /* pc_relative */
698
         0,                      /* bitpos */
699
         complain_overflow_dont, /* complain_on_overflow */
700
         ppc64_elf_unhandled_reloc, /* special_function */
701
         "R_PPC64_PLT16_HA",    /* name */
702
         FALSE,                 /* partial_inplace */
703
         0,                      /* src_mask */
704
         0xffff,                /* dst_mask */
705
         FALSE),                /* pcrel_offset */
706
 
707
  /* 16-bit section relative relocation.  */
708
  HOWTO (R_PPC64_SECTOFF,       /* type */
709
         0,                      /* rightshift */
710
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
711
         16,                    /* bitsize */
712
         FALSE,                 /* pc_relative */
713
         0,                      /* bitpos */
714
         complain_overflow_bitfield, /* complain_on_overflow */
715
         ppc64_elf_sectoff_reloc, /* special_function */
716
         "R_PPC64_SECTOFF",     /* name */
717
         FALSE,                 /* partial_inplace */
718
         0,                      /* src_mask */
719
         0xffff,                /* dst_mask */
720
         FALSE),                /* pcrel_offset */
721
 
722
  /* Like R_PPC64_SECTOFF, but no overflow warning.  */
723
  HOWTO (R_PPC64_SECTOFF_LO,    /* type */
724
         0,                      /* rightshift */
725
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
726
         16,                    /* bitsize */
727
         FALSE,                 /* pc_relative */
728
         0,                      /* bitpos */
729
         complain_overflow_dont, /* complain_on_overflow */
730
         ppc64_elf_sectoff_reloc, /* special_function */
731
         "R_PPC64_SECTOFF_LO",  /* name */
732
         FALSE,                 /* partial_inplace */
733
         0,                      /* src_mask */
734
         0xffff,                /* dst_mask */
735
         FALSE),                /* pcrel_offset */
736
 
737
  /* 16-bit upper half section relative relocation.  */
738
  HOWTO (R_PPC64_SECTOFF_HI,    /* type */
739
         16,                    /* rightshift */
740
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
741
         16,                    /* bitsize */
742
         FALSE,                 /* pc_relative */
743
         0,                      /* bitpos */
744
         complain_overflow_dont, /* complain_on_overflow */
745
         ppc64_elf_sectoff_reloc, /* special_function */
746
         "R_PPC64_SECTOFF_HI",  /* name */
747
         FALSE,                 /* partial_inplace */
748
         0,                      /* src_mask */
749
         0xffff,                /* dst_mask */
750
         FALSE),                /* pcrel_offset */
751
 
752
  /* 16-bit upper half adjusted section relative relocation.  */
753
  HOWTO (R_PPC64_SECTOFF_HA,    /* type */
754
         16,                    /* rightshift */
755
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
756
         16,                    /* bitsize */
757
         FALSE,                 /* pc_relative */
758
         0,                      /* bitpos */
759
         complain_overflow_dont, /* complain_on_overflow */
760
         ppc64_elf_sectoff_ha_reloc, /* special_function */
761
         "R_PPC64_SECTOFF_HA",  /* name */
762
         FALSE,                 /* partial_inplace */
763
         0,                      /* src_mask */
764
         0xffff,                /* dst_mask */
765
         FALSE),                /* pcrel_offset */
766
 
767
  /* Like R_PPC64_REL24 without touching the two least significant bits.  */
768
  HOWTO (R_PPC64_REL30,         /* type */
769
         2,                     /* rightshift */
770
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
771
         30,                    /* bitsize */
772
         TRUE,                  /* pc_relative */
773
         0,                      /* bitpos */
774
         complain_overflow_dont, /* complain_on_overflow */
775
         bfd_elf_generic_reloc, /* special_function */
776
         "R_PPC64_REL30",       /* name */
777
         FALSE,                 /* partial_inplace */
778
         0,                      /* src_mask */
779
         0xfffffffc,            /* dst_mask */
780
         TRUE),                 /* pcrel_offset */
781
 
782
  /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI.  */
783
 
784
  /* A standard 64-bit relocation.  */
785
  HOWTO (R_PPC64_ADDR64,        /* type */
786
         0,                      /* rightshift */
787
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
788
         64,                    /* bitsize */
789
         FALSE,                 /* pc_relative */
790
         0,                      /* bitpos */
791
         complain_overflow_dont, /* complain_on_overflow */
792
         bfd_elf_generic_reloc, /* special_function */
793
         "R_PPC64_ADDR64",      /* name */
794
         FALSE,                 /* partial_inplace */
795
         0,                      /* src_mask */
796
         ONES (64),             /* dst_mask */
797
         FALSE),                /* pcrel_offset */
798
 
799
  /* The bits 32-47 of an address.  */
800
  HOWTO (R_PPC64_ADDR16_HIGHER, /* type */
801
         32,                    /* rightshift */
802
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
803
         16,                    /* bitsize */
804
         FALSE,                 /* pc_relative */
805
         0,                      /* bitpos */
806
         complain_overflow_dont, /* complain_on_overflow */
807
         bfd_elf_generic_reloc, /* special_function */
808
         "R_PPC64_ADDR16_HIGHER", /* name */
809
         FALSE,                 /* partial_inplace */
810
         0,                      /* src_mask */
811
         0xffff,                /* dst_mask */
812
         FALSE),                /* pcrel_offset */
813
 
814
  /* The bits 32-47 of an address, plus 1 if the contents of the low
815
     16 bits, treated as a signed number, is negative.  */
816
  HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */
817
         32,                    /* rightshift */
818
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
819
         16,                    /* bitsize */
820
         FALSE,                 /* pc_relative */
821
         0,                      /* bitpos */
822
         complain_overflow_dont, /* complain_on_overflow */
823
         ppc64_elf_ha_reloc,    /* special_function */
824
         "R_PPC64_ADDR16_HIGHERA", /* name */
825
         FALSE,                 /* partial_inplace */
826
         0,                      /* src_mask */
827
         0xffff,                /* dst_mask */
828
         FALSE),                /* pcrel_offset */
829
 
830
  /* The bits 48-63 of an address.  */
831
  HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */
832
         48,                    /* rightshift */
833
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
834
         16,                    /* bitsize */
835
         FALSE,                 /* pc_relative */
836
         0,                      /* bitpos */
837
         complain_overflow_dont, /* complain_on_overflow */
838
         bfd_elf_generic_reloc, /* special_function */
839
         "R_PPC64_ADDR16_HIGHEST", /* name */
840
         FALSE,                 /* partial_inplace */
841
         0,                      /* src_mask */
842
         0xffff,                /* dst_mask */
843
         FALSE),                /* pcrel_offset */
844
 
845
  /* The bits 48-63 of an address, plus 1 if the contents of the low
846
     16 bits, treated as a signed number, is negative.  */
847
  HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */
848
         48,                    /* rightshift */
849
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
850
         16,                    /* bitsize */
851
         FALSE,                 /* pc_relative */
852
         0,                      /* bitpos */
853
         complain_overflow_dont, /* complain_on_overflow */
854
         ppc64_elf_ha_reloc,    /* special_function */
855
         "R_PPC64_ADDR16_HIGHESTA", /* name */
856
         FALSE,                 /* partial_inplace */
857
         0,                      /* src_mask */
858
         0xffff,                /* dst_mask */
859
         FALSE),                /* pcrel_offset */
860
 
861
  /* Like ADDR64, but may be unaligned.  */
862
  HOWTO (R_PPC64_UADDR64,       /* type */
863
         0,                      /* rightshift */
864
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
865
         64,                    /* bitsize */
866
         FALSE,                 /* pc_relative */
867
         0,                      /* bitpos */
868
         complain_overflow_dont, /* complain_on_overflow */
869
         bfd_elf_generic_reloc, /* special_function */
870
         "R_PPC64_UADDR64",     /* name */
871
         FALSE,                 /* partial_inplace */
872
         0,                      /* src_mask */
873
         ONES (64),             /* dst_mask */
874
         FALSE),                /* pcrel_offset */
875
 
876
  /* 64-bit relative relocation.  */
877
  HOWTO (R_PPC64_REL64,         /* type */
878
         0,                      /* rightshift */
879
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
880
         64,                    /* bitsize */
881
         TRUE,                  /* pc_relative */
882
         0,                      /* bitpos */
883
         complain_overflow_dont, /* complain_on_overflow */
884
         bfd_elf_generic_reloc, /* special_function */
885
         "R_PPC64_REL64",       /* name */
886
         FALSE,                 /* partial_inplace */
887
         0,                      /* src_mask */
888
         ONES (64),             /* dst_mask */
889
         TRUE),                 /* pcrel_offset */
890
 
891
  /* 64-bit relocation to the symbol's procedure linkage table.  */
892
  HOWTO (R_PPC64_PLT64,         /* type */
893
         0,                      /* rightshift */
894
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
895
         64,                    /* bitsize */
896
         FALSE,                 /* pc_relative */
897
         0,                      /* bitpos */
898
         complain_overflow_dont, /* complain_on_overflow */
899
         ppc64_elf_unhandled_reloc, /* special_function */
900
         "R_PPC64_PLT64",       /* name */
901
         FALSE,                 /* partial_inplace */
902
         0,                      /* src_mask */
903
         ONES (64),             /* dst_mask */
904
         FALSE),                /* pcrel_offset */
905
 
906
  /* 64-bit PC relative relocation to the symbol's procedure linkage
907
     table.  */
908
  /* FIXME: R_PPC64_PLTREL64 not supported.  */
909
  HOWTO (R_PPC64_PLTREL64,      /* type */
910
         0,                      /* rightshift */
911
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
912
         64,                    /* bitsize */
913
         TRUE,                  /* pc_relative */
914
         0,                      /* bitpos */
915
         complain_overflow_dont, /* complain_on_overflow */
916
         ppc64_elf_unhandled_reloc, /* special_function */
917
         "R_PPC64_PLTREL64",    /* name */
918
         FALSE,                 /* partial_inplace */
919
         0,                      /* src_mask */
920
         ONES (64),             /* dst_mask */
921
         TRUE),                 /* pcrel_offset */
922
 
923
  /* 16 bit TOC-relative relocation.  */
924
 
925
  /* R_PPC64_TOC16        47       half16*      S + A - .TOC.  */
926
  HOWTO (R_PPC64_TOC16,         /* type */
927
         0,                      /* rightshift */
928
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
929
         16,                    /* bitsize */
930
         FALSE,                 /* pc_relative */
931
         0,                      /* bitpos */
932
         complain_overflow_signed, /* complain_on_overflow */
933
         ppc64_elf_toc_reloc,   /* special_function */
934
         "R_PPC64_TOC16",       /* name */
935
         FALSE,                 /* partial_inplace */
936
         0,                      /* src_mask */
937
         0xffff,                /* dst_mask */
938
         FALSE),                /* pcrel_offset */
939
 
940
  /* 16 bit TOC-relative relocation without overflow.  */
941
 
942
  /* R_PPC64_TOC16_LO     48       half16        #lo (S + A - .TOC.)  */
943
  HOWTO (R_PPC64_TOC16_LO,      /* type */
944
         0,                      /* rightshift */
945
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
946
         16,                    /* bitsize */
947
         FALSE,                 /* pc_relative */
948
         0,                      /* bitpos */
949
         complain_overflow_dont, /* complain_on_overflow */
950
         ppc64_elf_toc_reloc,   /* special_function */
951
         "R_PPC64_TOC16_LO",    /* name */
952
         FALSE,                 /* partial_inplace */
953
         0,                      /* src_mask */
954
         0xffff,                /* dst_mask */
955
         FALSE),                /* pcrel_offset */
956
 
957
  /* 16 bit TOC-relative relocation, high 16 bits.  */
958
 
959
  /* R_PPC64_TOC16_HI     49       half16        #hi (S + A - .TOC.)  */
960
  HOWTO (R_PPC64_TOC16_HI,      /* type */
961
         16,                    /* rightshift */
962
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
963
         16,                    /* bitsize */
964
         FALSE,                 /* pc_relative */
965
         0,                      /* bitpos */
966
         complain_overflow_dont, /* complain_on_overflow */
967
         ppc64_elf_toc_reloc,   /* special_function */
968
         "R_PPC64_TOC16_HI",    /* name */
969
         FALSE,                 /* partial_inplace */
970
         0,                      /* src_mask */
971
         0xffff,                /* dst_mask */
972
         FALSE),                /* pcrel_offset */
973
 
974
  /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
975
     contents of the low 16 bits, treated as a signed number, is
976
     negative.  */
977
 
978
  /* R_PPC64_TOC16_HA     50       half16        #ha (S + A - .TOC.)  */
979
  HOWTO (R_PPC64_TOC16_HA,      /* type */
980
         16,                    /* rightshift */
981
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
982
         16,                    /* bitsize */
983
         FALSE,                 /* pc_relative */
984
         0,                      /* bitpos */
985
         complain_overflow_dont, /* complain_on_overflow */
986
         ppc64_elf_toc_ha_reloc, /* special_function */
987
         "R_PPC64_TOC16_HA",    /* name */
988
         FALSE,                 /* partial_inplace */
989
         0,                      /* src_mask */
990
         0xffff,                /* dst_mask */
991
         FALSE),                /* pcrel_offset */
992
 
993
  /* 64-bit relocation; insert value of TOC base (.TOC.).  */
994
 
995
  /* R_PPC64_TOC                  51       doubleword64  .TOC.  */
996
  HOWTO (R_PPC64_TOC,           /* type */
997
         0,                      /* rightshift */
998
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
999
         64,                    /* bitsize */
1000
         FALSE,                 /* pc_relative */
1001
         0,                      /* bitpos */
1002
         complain_overflow_bitfield, /* complain_on_overflow */
1003
         ppc64_elf_toc64_reloc, /* special_function */
1004
         "R_PPC64_TOC",         /* name */
1005
         FALSE,                 /* partial_inplace */
1006
         0,                      /* src_mask */
1007
         ONES (64),             /* dst_mask */
1008
         FALSE),                /* pcrel_offset */
1009
 
1010
  /* Like R_PPC64_GOT16, but also informs the link editor that the
1011
     value to relocate may (!) refer to a PLT entry which the link
1012
     editor (a) may replace with the symbol value.  If the link editor
1013
     is unable to fully resolve the symbol, it may (b) create a PLT
1014
     entry and store the address to the new PLT entry in the GOT.
1015
     This permits lazy resolution of function symbols at run time.
1016
     The link editor may also skip all of this and just (c) emit a
1017
     R_PPC64_GLOB_DAT to tie the symbol to the GOT entry.  */
1018
  /* FIXME: R_PPC64_PLTGOT16 not implemented.  */
1019
    HOWTO (R_PPC64_PLTGOT16,    /* type */
1020
         0,                      /* rightshift */
1021
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1022
         16,                    /* bitsize */
1023
         FALSE,                 /* pc_relative */
1024
         0,                      /* bitpos */
1025
         complain_overflow_signed, /* complain_on_overflow */
1026
         ppc64_elf_unhandled_reloc, /* special_function */
1027
         "R_PPC64_PLTGOT16",    /* name */
1028
         FALSE,                 /* partial_inplace */
1029
         0,                      /* src_mask */
1030
         0xffff,                /* dst_mask */
1031
         FALSE),                /* pcrel_offset */
1032
 
1033
  /* Like R_PPC64_PLTGOT16, but without overflow.  */
1034
  /* FIXME: R_PPC64_PLTGOT16_LO not implemented.  */
1035
  HOWTO (R_PPC64_PLTGOT16_LO,   /* type */
1036
         0,                      /* rightshift */
1037
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1038
         16,                    /* bitsize */
1039
         FALSE,                 /* pc_relative */
1040
         0,                      /* bitpos */
1041
         complain_overflow_dont, /* complain_on_overflow */
1042
         ppc64_elf_unhandled_reloc, /* special_function */
1043
         "R_PPC64_PLTGOT16_LO", /* name */
1044
         FALSE,                 /* partial_inplace */
1045
         0,                      /* src_mask */
1046
         0xffff,                /* dst_mask */
1047
         FALSE),                /* pcrel_offset */
1048
 
1049
  /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address.  */
1050
  /* FIXME: R_PPC64_PLTGOT16_HI not implemented.  */
1051
  HOWTO (R_PPC64_PLTGOT16_HI,   /* type */
1052
         16,                    /* rightshift */
1053
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1054
         16,                    /* bitsize */
1055
         FALSE,                 /* pc_relative */
1056
         0,                      /* bitpos */
1057
         complain_overflow_dont, /* complain_on_overflow */
1058
         ppc64_elf_unhandled_reloc, /* special_function */
1059
         "R_PPC64_PLTGOT16_HI", /* name */
1060
         FALSE,                 /* partial_inplace */
1061
         0,                      /* src_mask */
1062
         0xffff,                /* dst_mask */
1063
         FALSE),                /* pcrel_offset */
1064
 
1065
  /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1066
     1 if the contents of the low 16 bits, treated as a signed number,
1067
     is negative.  */
1068
  /* FIXME: R_PPC64_PLTGOT16_HA not implemented.  */
1069
  HOWTO (R_PPC64_PLTGOT16_HA,   /* type */
1070
         16,                    /* rightshift */
1071
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1072
         16,                    /* bitsize */
1073
         FALSE,                 /* pc_relative */
1074
         0,                      /* bitpos */
1075
         complain_overflow_dont,/* complain_on_overflow */
1076
         ppc64_elf_unhandled_reloc, /* special_function */
1077
         "R_PPC64_PLTGOT16_HA", /* name */
1078
         FALSE,                 /* partial_inplace */
1079
         0,                      /* src_mask */
1080
         0xffff,                /* dst_mask */
1081
         FALSE),                /* pcrel_offset */
1082
 
1083
  /* Like R_PPC64_ADDR16, but for instructions with a DS field.  */
1084
  HOWTO (R_PPC64_ADDR16_DS,     /* type */
1085
         0,                      /* rightshift */
1086
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1087
         16,                    /* bitsize */
1088
         FALSE,                 /* pc_relative */
1089
         0,                      /* bitpos */
1090
         complain_overflow_bitfield, /* complain_on_overflow */
1091
         bfd_elf_generic_reloc, /* special_function */
1092
         "R_PPC64_ADDR16_DS",   /* name */
1093
         FALSE,                 /* partial_inplace */
1094
         0,                      /* src_mask */
1095
         0xfffc,                /* dst_mask */
1096
         FALSE),                /* pcrel_offset */
1097
 
1098
  /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field.  */
1099
  HOWTO (R_PPC64_ADDR16_LO_DS,  /* type */
1100
         0,                      /* rightshift */
1101
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1102
         16,                    /* bitsize */
1103
         FALSE,                 /* pc_relative */
1104
         0,                      /* bitpos */
1105
         complain_overflow_dont,/* complain_on_overflow */
1106
         bfd_elf_generic_reloc, /* special_function */
1107
         "R_PPC64_ADDR16_LO_DS",/* name */
1108
         FALSE,                 /* partial_inplace */
1109
         0,                      /* src_mask */
1110
         0xfffc,                /* dst_mask */
1111
         FALSE),                /* pcrel_offset */
1112
 
1113
  /* Like R_PPC64_GOT16, but for instructions with a DS field.  */
1114
  HOWTO (R_PPC64_GOT16_DS,      /* type */
1115
         0,                      /* rightshift */
1116
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1117
         16,                    /* bitsize */
1118
         FALSE,                 /* pc_relative */
1119
         0,                      /* bitpos */
1120
         complain_overflow_signed, /* complain_on_overflow */
1121
         ppc64_elf_unhandled_reloc, /* special_function */
1122
         "R_PPC64_GOT16_DS",    /* name */
1123
         FALSE,                 /* partial_inplace */
1124
         0,                      /* src_mask */
1125
         0xfffc,                /* dst_mask */
1126
         FALSE),                /* pcrel_offset */
1127
 
1128
  /* Like R_PPC64_GOT16_LO, but for instructions with a DS field.  */
1129
  HOWTO (R_PPC64_GOT16_LO_DS,   /* type */
1130
         0,                      /* rightshift */
1131
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1132
         16,                    /* bitsize */
1133
         FALSE,                 /* pc_relative */
1134
         0,                      /* bitpos */
1135
         complain_overflow_dont, /* complain_on_overflow */
1136
         ppc64_elf_unhandled_reloc, /* special_function */
1137
         "R_PPC64_GOT16_LO_DS", /* name */
1138
         FALSE,                 /* partial_inplace */
1139
         0,                      /* src_mask */
1140
         0xfffc,                /* dst_mask */
1141
         FALSE),                /* pcrel_offset */
1142
 
1143
  /* Like R_PPC64_PLT16_LO, but for instructions with a DS field.  */
1144
  HOWTO (R_PPC64_PLT16_LO_DS,   /* type */
1145
         0,                      /* rightshift */
1146
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1147
         16,                    /* bitsize */
1148
         FALSE,                 /* pc_relative */
1149
         0,                      /* bitpos */
1150
         complain_overflow_dont, /* complain_on_overflow */
1151
         ppc64_elf_unhandled_reloc, /* special_function */
1152
         "R_PPC64_PLT16_LO_DS", /* name */
1153
         FALSE,                 /* partial_inplace */
1154
         0,                      /* src_mask */
1155
         0xfffc,                /* dst_mask */
1156
         FALSE),                /* pcrel_offset */
1157
 
1158
  /* Like R_PPC64_SECTOFF, but for instructions with a DS field.  */
1159
  HOWTO (R_PPC64_SECTOFF_DS,    /* type */
1160
         0,                      /* rightshift */
1161
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1162
         16,                    /* bitsize */
1163
         FALSE,                 /* pc_relative */
1164
         0,                      /* bitpos */
1165
         complain_overflow_bitfield, /* complain_on_overflow */
1166
         ppc64_elf_sectoff_reloc, /* special_function */
1167
         "R_PPC64_SECTOFF_DS",  /* name */
1168
         FALSE,                 /* partial_inplace */
1169
         0,                      /* src_mask */
1170
         0xfffc,                /* dst_mask */
1171
         FALSE),                /* pcrel_offset */
1172
 
1173
  /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field.  */
1174
  HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */
1175
         0,                      /* rightshift */
1176
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1177
         16,                    /* bitsize */
1178
         FALSE,                 /* pc_relative */
1179
         0,                      /* bitpos */
1180
         complain_overflow_dont, /* complain_on_overflow */
1181
         ppc64_elf_sectoff_reloc, /* special_function */
1182
         "R_PPC64_SECTOFF_LO_DS",/* name */
1183
         FALSE,                 /* partial_inplace */
1184
         0,                      /* src_mask */
1185
         0xfffc,                /* dst_mask */
1186
         FALSE),                /* pcrel_offset */
1187
 
1188
  /* Like R_PPC64_TOC16, but for instructions with a DS field.  */
1189
  HOWTO (R_PPC64_TOC16_DS,      /* type */
1190
         0,                      /* rightshift */
1191
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1192
         16,                    /* bitsize */
1193
         FALSE,                 /* pc_relative */
1194
         0,                      /* bitpos */
1195
         complain_overflow_signed, /* complain_on_overflow */
1196
         ppc64_elf_toc_reloc,   /* special_function */
1197
         "R_PPC64_TOC16_DS",    /* name */
1198
         FALSE,                 /* partial_inplace */
1199
         0,                      /* src_mask */
1200
         0xfffc,                /* dst_mask */
1201
         FALSE),                /* pcrel_offset */
1202
 
1203
  /* Like R_PPC64_TOC16_LO, but for instructions with a DS field.  */
1204
  HOWTO (R_PPC64_TOC16_LO_DS,   /* type */
1205
         0,                      /* rightshift */
1206
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1207
         16,                    /* bitsize */
1208
         FALSE,                 /* pc_relative */
1209
         0,                      /* bitpos */
1210
         complain_overflow_dont, /* complain_on_overflow */
1211
         ppc64_elf_toc_reloc,   /* special_function */
1212
         "R_PPC64_TOC16_LO_DS", /* name */
1213
         FALSE,                 /* partial_inplace */
1214
         0,                      /* src_mask */
1215
         0xfffc,                /* dst_mask */
1216
         FALSE),                /* pcrel_offset */
1217
 
1218
  /* Like R_PPC64_PLTGOT16, but for instructions with a DS field.  */
1219
  /* FIXME: R_PPC64_PLTGOT16_DS not implemented.  */
1220
  HOWTO (R_PPC64_PLTGOT16_DS,   /* type */
1221
         0,                      /* rightshift */
1222
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1223
         16,                    /* bitsize */
1224
         FALSE,                 /* pc_relative */
1225
         0,                      /* bitpos */
1226
         complain_overflow_signed, /* complain_on_overflow */
1227
         ppc64_elf_unhandled_reloc, /* special_function */
1228
         "R_PPC64_PLTGOT16_DS", /* name */
1229
         FALSE,                 /* partial_inplace */
1230
         0,                      /* src_mask */
1231
         0xfffc,                /* dst_mask */
1232
         FALSE),                /* pcrel_offset */
1233
 
1234
  /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field.  */
1235
  /* FIXME: R_PPC64_PLTGOT16_LO not implemented.  */
1236
  HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */
1237
         0,                      /* rightshift */
1238
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1239
         16,                    /* bitsize */
1240
         FALSE,                 /* pc_relative */
1241
         0,                      /* bitpos */
1242
         complain_overflow_dont, /* complain_on_overflow */
1243
         ppc64_elf_unhandled_reloc, /* special_function */
1244
         "R_PPC64_PLTGOT16_LO_DS",/* name */
1245
         FALSE,                 /* partial_inplace */
1246
         0,                      /* src_mask */
1247
         0xfffc,                /* dst_mask */
1248
         FALSE),                /* pcrel_offset */
1249
 
1250
  /* Marker relocs for TLS.  */
1251
  HOWTO (R_PPC64_TLS,
1252
         0,                      /* rightshift */
1253
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1254
         32,                    /* bitsize */
1255
         FALSE,                 /* pc_relative */
1256
         0,                      /* bitpos */
1257
         complain_overflow_dont, /* complain_on_overflow */
1258
         bfd_elf_generic_reloc, /* special_function */
1259
         "R_PPC64_TLS",         /* name */
1260
         FALSE,                 /* partial_inplace */
1261
         0,                      /* src_mask */
1262
         0,                      /* dst_mask */
1263
         FALSE),                /* pcrel_offset */
1264
 
1265
  HOWTO (R_PPC64_TLSGD,
1266
         0,                      /* rightshift */
1267
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1268
         32,                    /* bitsize */
1269
         FALSE,                 /* pc_relative */
1270
         0,                      /* bitpos */
1271
         complain_overflow_dont, /* complain_on_overflow */
1272
         bfd_elf_generic_reloc, /* special_function */
1273
         "R_PPC64_TLSGD",       /* name */
1274
         FALSE,                 /* partial_inplace */
1275
         0,                      /* src_mask */
1276
         0,                      /* dst_mask */
1277
         FALSE),                /* pcrel_offset */
1278
 
1279
  HOWTO (R_PPC64_TLSLD,
1280
         0,                      /* rightshift */
1281
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1282
         32,                    /* bitsize */
1283
         FALSE,                 /* pc_relative */
1284
         0,                      /* bitpos */
1285
         complain_overflow_dont, /* complain_on_overflow */
1286
         bfd_elf_generic_reloc, /* special_function */
1287
         "R_PPC64_TLSLD",       /* name */
1288
         FALSE,                 /* partial_inplace */
1289
         0,                      /* src_mask */
1290
         0,                      /* dst_mask */
1291
         FALSE),                /* pcrel_offset */
1292
 
1293 163 khays
  HOWTO (R_PPC64_TOCSAVE,
1294
         0,                      /* rightshift */
1295
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1296
         32,                    /* bitsize */
1297
         FALSE,                 /* pc_relative */
1298
         0,                      /* bitpos */
1299
         complain_overflow_dont, /* complain_on_overflow */
1300
         bfd_elf_generic_reloc, /* special_function */
1301
         "R_PPC64_TOCSAVE",     /* name */
1302
         FALSE,                 /* partial_inplace */
1303
         0,                      /* src_mask */
1304
         0,                      /* dst_mask */
1305
         FALSE),                /* pcrel_offset */
1306
 
1307 14 khays
  /* Computes the load module index of the load module that contains the
1308
     definition of its TLS sym.  */
1309
  HOWTO (R_PPC64_DTPMOD64,
1310
         0,                      /* rightshift */
1311
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
1312
         64,                    /* bitsize */
1313
         FALSE,                 /* pc_relative */
1314
         0,                      /* bitpos */
1315
         complain_overflow_dont, /* complain_on_overflow */
1316
         ppc64_elf_unhandled_reloc, /* special_function */
1317
         "R_PPC64_DTPMOD64",    /* name */
1318
         FALSE,                 /* partial_inplace */
1319
         0,                      /* src_mask */
1320
         ONES (64),             /* dst_mask */
1321
         FALSE),                /* pcrel_offset */
1322
 
1323
  /* Computes a dtv-relative displacement, the difference between the value
1324
     of sym+add and the base address of the thread-local storage block that
1325
     contains the definition of sym, minus 0x8000.  */
1326
  HOWTO (R_PPC64_DTPREL64,
1327
         0,                      /* rightshift */
1328
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
1329
         64,                    /* bitsize */
1330
         FALSE,                 /* pc_relative */
1331
         0,                      /* bitpos */
1332
         complain_overflow_dont, /* complain_on_overflow */
1333
         ppc64_elf_unhandled_reloc, /* special_function */
1334
         "R_PPC64_DTPREL64",    /* name */
1335
         FALSE,                 /* partial_inplace */
1336
         0,                      /* src_mask */
1337
         ONES (64),             /* dst_mask */
1338
         FALSE),                /* pcrel_offset */
1339
 
1340
  /* A 16 bit dtprel reloc.  */
1341
  HOWTO (R_PPC64_DTPREL16,
1342
         0,                      /* rightshift */
1343
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1344
         16,                    /* bitsize */
1345
         FALSE,                 /* pc_relative */
1346
         0,                      /* bitpos */
1347
         complain_overflow_signed, /* complain_on_overflow */
1348
         ppc64_elf_unhandled_reloc, /* special_function */
1349
         "R_PPC64_DTPREL16",    /* name */
1350
         FALSE,                 /* partial_inplace */
1351
         0,                      /* src_mask */
1352
         0xffff,                /* dst_mask */
1353
         FALSE),                /* pcrel_offset */
1354
 
1355
  /* Like DTPREL16, but no overflow.  */
1356
  HOWTO (R_PPC64_DTPREL16_LO,
1357
         0,                      /* rightshift */
1358
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1359
         16,                    /* bitsize */
1360
         FALSE,                 /* pc_relative */
1361
         0,                      /* bitpos */
1362
         complain_overflow_dont, /* complain_on_overflow */
1363
         ppc64_elf_unhandled_reloc, /* special_function */
1364
         "R_PPC64_DTPREL16_LO", /* name */
1365
         FALSE,                 /* partial_inplace */
1366
         0,                      /* src_mask */
1367
         0xffff,                /* dst_mask */
1368
         FALSE),                /* pcrel_offset */
1369
 
1370
  /* Like DTPREL16_LO, but next higher group of 16 bits.  */
1371
  HOWTO (R_PPC64_DTPREL16_HI,
1372
         16,                    /* rightshift */
1373
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1374
         16,                    /* bitsize */
1375
         FALSE,                 /* pc_relative */
1376
         0,                      /* bitpos */
1377
         complain_overflow_dont, /* complain_on_overflow */
1378
         ppc64_elf_unhandled_reloc, /* special_function */
1379
         "R_PPC64_DTPREL16_HI", /* name */
1380
         FALSE,                 /* partial_inplace */
1381
         0,                      /* src_mask */
1382
         0xffff,                /* dst_mask */
1383
         FALSE),                /* pcrel_offset */
1384
 
1385
  /* Like DTPREL16_HI, but adjust for low 16 bits.  */
1386
  HOWTO (R_PPC64_DTPREL16_HA,
1387
         16,                    /* rightshift */
1388
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1389
         16,                    /* bitsize */
1390
         FALSE,                 /* pc_relative */
1391
         0,                      /* bitpos */
1392
         complain_overflow_dont, /* complain_on_overflow */
1393
         ppc64_elf_unhandled_reloc, /* special_function */
1394
         "R_PPC64_DTPREL16_HA", /* name */
1395
         FALSE,                 /* partial_inplace */
1396
         0,                      /* src_mask */
1397
         0xffff,                /* dst_mask */
1398
         FALSE),                /* pcrel_offset */
1399
 
1400
  /* Like DTPREL16_HI, but next higher group of 16 bits.  */
1401
  HOWTO (R_PPC64_DTPREL16_HIGHER,
1402
         32,                    /* rightshift */
1403
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1404
         16,                    /* bitsize */
1405
         FALSE,                 /* pc_relative */
1406
         0,                      /* bitpos */
1407
         complain_overflow_dont, /* complain_on_overflow */
1408
         ppc64_elf_unhandled_reloc, /* special_function */
1409
         "R_PPC64_DTPREL16_HIGHER", /* name */
1410
         FALSE,                 /* partial_inplace */
1411
         0,                      /* src_mask */
1412
         0xffff,                /* dst_mask */
1413
         FALSE),                /* pcrel_offset */
1414
 
1415
  /* Like DTPREL16_HIGHER, but adjust for low 16 bits.  */
1416
  HOWTO (R_PPC64_DTPREL16_HIGHERA,
1417
         32,                    /* rightshift */
1418
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1419
         16,                    /* bitsize */
1420
         FALSE,                 /* pc_relative */
1421
         0,                      /* bitpos */
1422
         complain_overflow_dont, /* complain_on_overflow */
1423
         ppc64_elf_unhandled_reloc, /* special_function */
1424
         "R_PPC64_DTPREL16_HIGHERA", /* name */
1425
         FALSE,                 /* partial_inplace */
1426
         0,                      /* src_mask */
1427
         0xffff,                /* dst_mask */
1428
         FALSE),                /* pcrel_offset */
1429
 
1430
  /* Like DTPREL16_HIGHER, but next higher group of 16 bits.  */
1431
  HOWTO (R_PPC64_DTPREL16_HIGHEST,
1432
         48,                    /* rightshift */
1433
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1434
         16,                    /* bitsize */
1435
         FALSE,                 /* pc_relative */
1436
         0,                      /* bitpos */
1437
         complain_overflow_dont, /* complain_on_overflow */
1438
         ppc64_elf_unhandled_reloc, /* special_function */
1439
         "R_PPC64_DTPREL16_HIGHEST", /* name */
1440
         FALSE,                 /* partial_inplace */
1441
         0,                      /* src_mask */
1442
         0xffff,                /* dst_mask */
1443
         FALSE),                /* pcrel_offset */
1444
 
1445
  /* Like DTPREL16_HIGHEST, but adjust for low 16 bits.  */
1446
  HOWTO (R_PPC64_DTPREL16_HIGHESTA,
1447
         48,                    /* rightshift */
1448
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1449
         16,                    /* bitsize */
1450
         FALSE,                 /* pc_relative */
1451
         0,                      /* bitpos */
1452
         complain_overflow_dont, /* complain_on_overflow */
1453
         ppc64_elf_unhandled_reloc, /* special_function */
1454
         "R_PPC64_DTPREL16_HIGHESTA", /* name */
1455
         FALSE,                 /* partial_inplace */
1456
         0,                      /* src_mask */
1457
         0xffff,                /* dst_mask */
1458
         FALSE),                /* pcrel_offset */
1459
 
1460
  /* Like DTPREL16, but for insns with a DS field.  */
1461
  HOWTO (R_PPC64_DTPREL16_DS,
1462
         0,                      /* rightshift */
1463
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1464
         16,                    /* bitsize */
1465
         FALSE,                 /* pc_relative */
1466
         0,                      /* bitpos */
1467
         complain_overflow_signed, /* complain_on_overflow */
1468
         ppc64_elf_unhandled_reloc, /* special_function */
1469
         "R_PPC64_DTPREL16_DS", /* name */
1470
         FALSE,                 /* partial_inplace */
1471
         0,                      /* src_mask */
1472
         0xfffc,                /* dst_mask */
1473
         FALSE),                /* pcrel_offset */
1474
 
1475
  /* Like DTPREL16_DS, but no overflow.  */
1476
  HOWTO (R_PPC64_DTPREL16_LO_DS,
1477
         0,                      /* rightshift */
1478
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1479
         16,                    /* bitsize */
1480
         FALSE,                 /* pc_relative */
1481
         0,                      /* bitpos */
1482
         complain_overflow_dont, /* complain_on_overflow */
1483
         ppc64_elf_unhandled_reloc, /* special_function */
1484
         "R_PPC64_DTPREL16_LO_DS", /* name */
1485
         FALSE,                 /* partial_inplace */
1486
         0,                      /* src_mask */
1487
         0xfffc,                /* dst_mask */
1488
         FALSE),                /* pcrel_offset */
1489
 
1490
  /* Computes a tp-relative displacement, the difference between the value of
1491
     sym+add and the value of the thread pointer (r13).  */
1492
  HOWTO (R_PPC64_TPREL64,
1493
         0,                      /* rightshift */
1494
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
1495
         64,                    /* bitsize */
1496
         FALSE,                 /* pc_relative */
1497
         0,                      /* bitpos */
1498
         complain_overflow_dont, /* complain_on_overflow */
1499
         ppc64_elf_unhandled_reloc, /* special_function */
1500
         "R_PPC64_TPREL64",     /* name */
1501
         FALSE,                 /* partial_inplace */
1502
         0,                      /* src_mask */
1503
         ONES (64),             /* dst_mask */
1504
         FALSE),                /* pcrel_offset */
1505
 
1506
  /* A 16 bit tprel reloc.  */
1507
  HOWTO (R_PPC64_TPREL16,
1508
         0,                      /* rightshift */
1509
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1510
         16,                    /* bitsize */
1511
         FALSE,                 /* pc_relative */
1512
         0,                      /* bitpos */
1513
         complain_overflow_signed, /* complain_on_overflow */
1514
         ppc64_elf_unhandled_reloc, /* special_function */
1515
         "R_PPC64_TPREL16",     /* name */
1516
         FALSE,                 /* partial_inplace */
1517
         0,                      /* src_mask */
1518
         0xffff,                /* dst_mask */
1519
         FALSE),                /* pcrel_offset */
1520
 
1521
  /* Like TPREL16, but no overflow.  */
1522
  HOWTO (R_PPC64_TPREL16_LO,
1523
         0,                      /* rightshift */
1524
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1525
         16,                    /* bitsize */
1526
         FALSE,                 /* pc_relative */
1527
         0,                      /* bitpos */
1528
         complain_overflow_dont, /* complain_on_overflow */
1529
         ppc64_elf_unhandled_reloc, /* special_function */
1530
         "R_PPC64_TPREL16_LO",  /* name */
1531
         FALSE,                 /* partial_inplace */
1532
         0,                      /* src_mask */
1533
         0xffff,                /* dst_mask */
1534
         FALSE),                /* pcrel_offset */
1535
 
1536
  /* Like TPREL16_LO, but next higher group of 16 bits.  */
1537
  HOWTO (R_PPC64_TPREL16_HI,
1538
         16,                    /* rightshift */
1539
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1540
         16,                    /* bitsize */
1541
         FALSE,                 /* pc_relative */
1542
         0,                      /* bitpos */
1543
         complain_overflow_dont, /* complain_on_overflow */
1544
         ppc64_elf_unhandled_reloc, /* special_function */
1545
         "R_PPC64_TPREL16_HI",  /* name */
1546
         FALSE,                 /* partial_inplace */
1547
         0,                      /* src_mask */
1548
         0xffff,                /* dst_mask */
1549
         FALSE),                /* pcrel_offset */
1550
 
1551
  /* Like TPREL16_HI, but adjust for low 16 bits.  */
1552
  HOWTO (R_PPC64_TPREL16_HA,
1553
         16,                    /* rightshift */
1554
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1555
         16,                    /* bitsize */
1556
         FALSE,                 /* pc_relative */
1557
         0,                      /* bitpos */
1558
         complain_overflow_dont, /* complain_on_overflow */
1559
         ppc64_elf_unhandled_reloc, /* special_function */
1560
         "R_PPC64_TPREL16_HA",  /* name */
1561
         FALSE,                 /* partial_inplace */
1562
         0,                      /* src_mask */
1563
         0xffff,                /* dst_mask */
1564
         FALSE),                /* pcrel_offset */
1565
 
1566
  /* Like TPREL16_HI, but next higher group of 16 bits.  */
1567
  HOWTO (R_PPC64_TPREL16_HIGHER,
1568
         32,                    /* rightshift */
1569
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1570
         16,                    /* bitsize */
1571
         FALSE,                 /* pc_relative */
1572
         0,                      /* bitpos */
1573
         complain_overflow_dont, /* complain_on_overflow */
1574
         ppc64_elf_unhandled_reloc, /* special_function */
1575
         "R_PPC64_TPREL16_HIGHER",      /* name */
1576
         FALSE,                 /* partial_inplace */
1577
         0,                      /* src_mask */
1578
         0xffff,                /* dst_mask */
1579
         FALSE),                /* pcrel_offset */
1580
 
1581
  /* Like TPREL16_HIGHER, but adjust for low 16 bits.  */
1582
  HOWTO (R_PPC64_TPREL16_HIGHERA,
1583
         32,                    /* rightshift */
1584
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1585
         16,                    /* bitsize */
1586
         FALSE,                 /* pc_relative */
1587
         0,                      /* bitpos */
1588
         complain_overflow_dont, /* complain_on_overflow */
1589
         ppc64_elf_unhandled_reloc, /* special_function */
1590
         "R_PPC64_TPREL16_HIGHERA", /* name */
1591
         FALSE,                 /* partial_inplace */
1592
         0,                      /* src_mask */
1593
         0xffff,                /* dst_mask */
1594
         FALSE),                /* pcrel_offset */
1595
 
1596
  /* Like TPREL16_HIGHER, but next higher group of 16 bits.  */
1597
  HOWTO (R_PPC64_TPREL16_HIGHEST,
1598
         48,                    /* rightshift */
1599
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1600
         16,                    /* bitsize */
1601
         FALSE,                 /* pc_relative */
1602
         0,                      /* bitpos */
1603
         complain_overflow_dont, /* complain_on_overflow */
1604
         ppc64_elf_unhandled_reloc, /* special_function */
1605
         "R_PPC64_TPREL16_HIGHEST", /* name */
1606
         FALSE,                 /* partial_inplace */
1607
         0,                      /* src_mask */
1608
         0xffff,                /* dst_mask */
1609
         FALSE),                /* pcrel_offset */
1610
 
1611
  /* Like TPREL16_HIGHEST, but adjust for low 16 bits.  */
1612
  HOWTO (R_PPC64_TPREL16_HIGHESTA,
1613
         48,                    /* rightshift */
1614
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1615
         16,                    /* bitsize */
1616
         FALSE,                 /* pc_relative */
1617
         0,                      /* bitpos */
1618
         complain_overflow_dont, /* complain_on_overflow */
1619
         ppc64_elf_unhandled_reloc, /* special_function */
1620
         "R_PPC64_TPREL16_HIGHESTA", /* name */
1621
         FALSE,                 /* partial_inplace */
1622
         0,                      /* src_mask */
1623
         0xffff,                /* dst_mask */
1624
         FALSE),                /* pcrel_offset */
1625
 
1626
  /* Like TPREL16, but for insns with a DS field.  */
1627
  HOWTO (R_PPC64_TPREL16_DS,
1628
         0,                      /* rightshift */
1629
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1630
         16,                    /* bitsize */
1631
         FALSE,                 /* pc_relative */
1632
         0,                      /* bitpos */
1633
         complain_overflow_signed, /* complain_on_overflow */
1634
         ppc64_elf_unhandled_reloc, /* special_function */
1635
         "R_PPC64_TPREL16_DS",  /* name */
1636
         FALSE,                 /* partial_inplace */
1637
         0,                      /* src_mask */
1638
         0xfffc,                /* dst_mask */
1639
         FALSE),                /* pcrel_offset */
1640
 
1641
  /* Like TPREL16_DS, but no overflow.  */
1642
  HOWTO (R_PPC64_TPREL16_LO_DS,
1643
         0,                      /* rightshift */
1644
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1645
         16,                    /* bitsize */
1646
         FALSE,                 /* pc_relative */
1647
         0,                      /* bitpos */
1648
         complain_overflow_dont, /* complain_on_overflow */
1649
         ppc64_elf_unhandled_reloc, /* special_function */
1650
         "R_PPC64_TPREL16_LO_DS", /* name */
1651
         FALSE,                 /* partial_inplace */
1652
         0,                      /* src_mask */
1653
         0xfffc,                /* dst_mask */
1654
         FALSE),                /* pcrel_offset */
1655
 
1656
  /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1657
     with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1658
     to the first entry relative to the TOC base (r2).  */
1659
  HOWTO (R_PPC64_GOT_TLSGD16,
1660
         0,                      /* rightshift */
1661
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1662
         16,                    /* bitsize */
1663
         FALSE,                 /* pc_relative */
1664
         0,                      /* bitpos */
1665
         complain_overflow_signed, /* complain_on_overflow */
1666
         ppc64_elf_unhandled_reloc, /* special_function */
1667
         "R_PPC64_GOT_TLSGD16", /* name */
1668
         FALSE,                 /* partial_inplace */
1669
         0,                      /* src_mask */
1670
         0xffff,                /* dst_mask */
1671
         FALSE),                /* pcrel_offset */
1672
 
1673
  /* Like GOT_TLSGD16, but no overflow.  */
1674
  HOWTO (R_PPC64_GOT_TLSGD16_LO,
1675
         0,                      /* rightshift */
1676
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1677
         16,                    /* bitsize */
1678
         FALSE,                 /* pc_relative */
1679
         0,                      /* bitpos */
1680
         complain_overflow_dont, /* complain_on_overflow */
1681
         ppc64_elf_unhandled_reloc, /* special_function */
1682
         "R_PPC64_GOT_TLSGD16_LO", /* name */
1683
         FALSE,                 /* partial_inplace */
1684
         0,                      /* src_mask */
1685
         0xffff,                /* dst_mask */
1686
         FALSE),                /* pcrel_offset */
1687
 
1688
  /* Like GOT_TLSGD16_LO, but next higher group of 16 bits.  */
1689
  HOWTO (R_PPC64_GOT_TLSGD16_HI,
1690
         16,                    /* rightshift */
1691
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1692
         16,                    /* bitsize */
1693
         FALSE,                 /* pc_relative */
1694
         0,                      /* bitpos */
1695
         complain_overflow_dont, /* complain_on_overflow */
1696
         ppc64_elf_unhandled_reloc, /* special_function */
1697
         "R_PPC64_GOT_TLSGD16_HI", /* name */
1698
         FALSE,                 /* partial_inplace */
1699
         0,                      /* src_mask */
1700
         0xffff,                /* dst_mask */
1701
         FALSE),                /* pcrel_offset */
1702
 
1703
  /* Like GOT_TLSGD16_HI, but adjust for low 16 bits.  */
1704
  HOWTO (R_PPC64_GOT_TLSGD16_HA,
1705
         16,                    /* rightshift */
1706
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1707
         16,                    /* bitsize */
1708
         FALSE,                 /* pc_relative */
1709
         0,                      /* bitpos */
1710
         complain_overflow_dont, /* complain_on_overflow */
1711
         ppc64_elf_unhandled_reloc, /* special_function */
1712
         "R_PPC64_GOT_TLSGD16_HA", /* name */
1713
         FALSE,                 /* partial_inplace */
1714
         0,                      /* src_mask */
1715
         0xffff,                /* dst_mask */
1716
         FALSE),                /* pcrel_offset */
1717
 
1718
  /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1719
     with values (sym+add)@dtpmod and zero, and computes the offset to the
1720
     first entry relative to the TOC base (r2).  */
1721
  HOWTO (R_PPC64_GOT_TLSLD16,
1722
         0,                      /* rightshift */
1723
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1724
         16,                    /* bitsize */
1725
         FALSE,                 /* pc_relative */
1726
         0,                      /* bitpos */
1727
         complain_overflow_signed, /* complain_on_overflow */
1728
         ppc64_elf_unhandled_reloc, /* special_function */
1729
         "R_PPC64_GOT_TLSLD16", /* name */
1730
         FALSE,                 /* partial_inplace */
1731
         0,                      /* src_mask */
1732
         0xffff,                /* dst_mask */
1733
         FALSE),                /* pcrel_offset */
1734
 
1735
  /* Like GOT_TLSLD16, but no overflow.  */
1736
  HOWTO (R_PPC64_GOT_TLSLD16_LO,
1737
         0,                      /* rightshift */
1738
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1739
         16,                    /* bitsize */
1740
         FALSE,                 /* pc_relative */
1741
         0,                      /* bitpos */
1742
         complain_overflow_dont, /* complain_on_overflow */
1743
         ppc64_elf_unhandled_reloc, /* special_function */
1744
         "R_PPC64_GOT_TLSLD16_LO", /* name */
1745
         FALSE,                 /* partial_inplace */
1746
         0,                      /* src_mask */
1747
         0xffff,                /* dst_mask */
1748
         FALSE),                /* pcrel_offset */
1749
 
1750
  /* Like GOT_TLSLD16_LO, but next higher group of 16 bits.  */
1751
  HOWTO (R_PPC64_GOT_TLSLD16_HI,
1752
         16,                    /* rightshift */
1753
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1754
         16,                    /* bitsize */
1755
         FALSE,                 /* pc_relative */
1756
         0,                      /* bitpos */
1757
         complain_overflow_dont, /* complain_on_overflow */
1758
         ppc64_elf_unhandled_reloc, /* special_function */
1759
         "R_PPC64_GOT_TLSLD16_HI", /* name */
1760
         FALSE,                 /* partial_inplace */
1761
         0,                      /* src_mask */
1762
         0xffff,                /* dst_mask */
1763
         FALSE),                /* pcrel_offset */
1764
 
1765
  /* Like GOT_TLSLD16_HI, but adjust for low 16 bits.  */
1766
  HOWTO (R_PPC64_GOT_TLSLD16_HA,
1767
         16,                    /* rightshift */
1768
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1769
         16,                    /* bitsize */
1770
         FALSE,                 /* pc_relative */
1771
         0,                      /* bitpos */
1772
         complain_overflow_dont, /* complain_on_overflow */
1773
         ppc64_elf_unhandled_reloc, /* special_function */
1774
         "R_PPC64_GOT_TLSLD16_HA", /* name */
1775
         FALSE,                 /* partial_inplace */
1776
         0,                      /* src_mask */
1777
         0xffff,                /* dst_mask */
1778
         FALSE),                /* pcrel_offset */
1779
 
1780
  /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1781
     the offset to the entry relative to the TOC base (r2).  */
1782
  HOWTO (R_PPC64_GOT_DTPREL16_DS,
1783
         0,                      /* rightshift */
1784
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1785
         16,                    /* bitsize */
1786
         FALSE,                 /* pc_relative */
1787
         0,                      /* bitpos */
1788
         complain_overflow_signed, /* complain_on_overflow */
1789
         ppc64_elf_unhandled_reloc, /* special_function */
1790
         "R_PPC64_GOT_DTPREL16_DS", /* name */
1791
         FALSE,                 /* partial_inplace */
1792
         0,                      /* src_mask */
1793
         0xfffc,                /* dst_mask */
1794
         FALSE),                /* pcrel_offset */
1795
 
1796
  /* Like GOT_DTPREL16_DS, but no overflow.  */
1797
  HOWTO (R_PPC64_GOT_DTPREL16_LO_DS,
1798
         0,                      /* rightshift */
1799
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1800
         16,                    /* bitsize */
1801
         FALSE,                 /* pc_relative */
1802
         0,                      /* bitpos */
1803
         complain_overflow_dont, /* complain_on_overflow */
1804
         ppc64_elf_unhandled_reloc, /* special_function */
1805
         "R_PPC64_GOT_DTPREL16_LO_DS", /* name */
1806
         FALSE,                 /* partial_inplace */
1807
         0,                      /* src_mask */
1808
         0xfffc,                /* dst_mask */
1809
         FALSE),                /* pcrel_offset */
1810
 
1811
  /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits.  */
1812
  HOWTO (R_PPC64_GOT_DTPREL16_HI,
1813
         16,                    /* rightshift */
1814
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1815
         16,                    /* bitsize */
1816
         FALSE,                 /* pc_relative */
1817
         0,                      /* bitpos */
1818
         complain_overflow_dont, /* complain_on_overflow */
1819
         ppc64_elf_unhandled_reloc, /* special_function */
1820
         "R_PPC64_GOT_DTPREL16_HI", /* name */
1821
         FALSE,                 /* partial_inplace */
1822
         0,                      /* src_mask */
1823
         0xffff,                /* dst_mask */
1824
         FALSE),                /* pcrel_offset */
1825
 
1826
  /* Like GOT_DTPREL16_HI, but adjust for low 16 bits.  */
1827
  HOWTO (R_PPC64_GOT_DTPREL16_HA,
1828
         16,                    /* rightshift */
1829
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1830
         16,                    /* bitsize */
1831
         FALSE,                 /* pc_relative */
1832
         0,                      /* bitpos */
1833
         complain_overflow_dont, /* complain_on_overflow */
1834
         ppc64_elf_unhandled_reloc, /* special_function */
1835
         "R_PPC64_GOT_DTPREL16_HA", /* name */
1836
         FALSE,                 /* partial_inplace */
1837
         0,                      /* src_mask */
1838
         0xffff,                /* dst_mask */
1839
         FALSE),                /* pcrel_offset */
1840
 
1841
  /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1842
     offset to the entry relative to the TOC base (r2).  */
1843
  HOWTO (R_PPC64_GOT_TPREL16_DS,
1844
         0,                      /* rightshift */
1845
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1846
         16,                    /* bitsize */
1847
         FALSE,                 /* pc_relative */
1848
         0,                      /* bitpos */
1849
         complain_overflow_signed, /* complain_on_overflow */
1850
         ppc64_elf_unhandled_reloc, /* special_function */
1851
         "R_PPC64_GOT_TPREL16_DS", /* name */
1852
         FALSE,                 /* partial_inplace */
1853
         0,                      /* src_mask */
1854
         0xfffc,                /* dst_mask */
1855
         FALSE),                /* pcrel_offset */
1856
 
1857
  /* Like GOT_TPREL16_DS, but no overflow.  */
1858
  HOWTO (R_PPC64_GOT_TPREL16_LO_DS,
1859
         0,                      /* rightshift */
1860
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1861
         16,                    /* bitsize */
1862
         FALSE,                 /* pc_relative */
1863
         0,                      /* bitpos */
1864
         complain_overflow_dont, /* complain_on_overflow */
1865
         ppc64_elf_unhandled_reloc, /* special_function */
1866
         "R_PPC64_GOT_TPREL16_LO_DS", /* name */
1867
         FALSE,                 /* partial_inplace */
1868
         0,                      /* src_mask */
1869
         0xfffc,                /* dst_mask */
1870
         FALSE),                /* pcrel_offset */
1871
 
1872
  /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits.  */
1873
  HOWTO (R_PPC64_GOT_TPREL16_HI,
1874
         16,                    /* rightshift */
1875
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1876
         16,                    /* bitsize */
1877
         FALSE,                 /* pc_relative */
1878
         0,                      /* bitpos */
1879
         complain_overflow_dont, /* complain_on_overflow */
1880
         ppc64_elf_unhandled_reloc, /* special_function */
1881
         "R_PPC64_GOT_TPREL16_HI", /* name */
1882
         FALSE,                 /* partial_inplace */
1883
         0,                      /* src_mask */
1884
         0xffff,                /* dst_mask */
1885
         FALSE),                /* pcrel_offset */
1886
 
1887
  /* Like GOT_TPREL16_HI, but adjust for low 16 bits.  */
1888
  HOWTO (R_PPC64_GOT_TPREL16_HA,
1889
         16,                    /* rightshift */
1890
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1891
         16,                    /* bitsize */
1892
         FALSE,                 /* pc_relative */
1893
         0,                      /* bitpos */
1894
         complain_overflow_dont, /* complain_on_overflow */
1895
         ppc64_elf_unhandled_reloc, /* special_function */
1896
         "R_PPC64_GOT_TPREL16_HA", /* name */
1897
         FALSE,                 /* partial_inplace */
1898
         0,                      /* src_mask */
1899
         0xffff,                /* dst_mask */
1900
         FALSE),                /* pcrel_offset */
1901
 
1902
  HOWTO (R_PPC64_JMP_IREL,      /* type */
1903
         0,                      /* rightshift */
1904
         0,                      /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1905
         0,                      /* bitsize */
1906
         FALSE,                 /* pc_relative */
1907
         0,                      /* bitpos */
1908
         complain_overflow_dont, /* complain_on_overflow */
1909
         ppc64_elf_unhandled_reloc, /* special_function */
1910
         "R_PPC64_JMP_IREL",    /* name */
1911
         FALSE,                 /* partial_inplace */
1912
         0,                      /* src_mask */
1913
         0,                      /* dst_mask */
1914
         FALSE),                /* pcrel_offset */
1915
 
1916
  HOWTO (R_PPC64_IRELATIVE,     /* type */
1917
         0,                      /* rightshift */
1918
         4,                     /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1919
         64,                    /* bitsize */
1920
         FALSE,                 /* pc_relative */
1921
         0,                      /* bitpos */
1922
         complain_overflow_dont, /* complain_on_overflow */
1923
         bfd_elf_generic_reloc, /* special_function */
1924
         "R_PPC64_IRELATIVE",   /* name */
1925
         FALSE,                 /* partial_inplace */
1926
         0,                      /* src_mask */
1927
         ONES (64),             /* dst_mask */
1928
         FALSE),                /* pcrel_offset */
1929
 
1930
  /* A 16 bit relative relocation.  */
1931
  HOWTO (R_PPC64_REL16,         /* type */
1932
         0,                      /* rightshift */
1933
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1934
         16,                    /* bitsize */
1935
         TRUE,                  /* pc_relative */
1936
         0,                      /* bitpos */
1937
         complain_overflow_bitfield, /* complain_on_overflow */
1938
         bfd_elf_generic_reloc, /* special_function */
1939
         "R_PPC64_REL16",       /* name */
1940
         FALSE,                 /* partial_inplace */
1941
         0,                      /* src_mask */
1942
         0xffff,                /* dst_mask */
1943
         TRUE),                 /* pcrel_offset */
1944
 
1945
  /* A 16 bit relative relocation without overflow.  */
1946
  HOWTO (R_PPC64_REL16_LO,      /* type */
1947
         0,                      /* rightshift */
1948
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1949
         16,                    /* bitsize */
1950
         TRUE,                  /* pc_relative */
1951
         0,                      /* bitpos */
1952
         complain_overflow_dont,/* complain_on_overflow */
1953
         bfd_elf_generic_reloc, /* special_function */
1954
         "R_PPC64_REL16_LO",    /* name */
1955
         FALSE,                 /* partial_inplace */
1956
         0,                      /* src_mask */
1957
         0xffff,                /* dst_mask */
1958
         TRUE),                 /* pcrel_offset */
1959
 
1960
  /* The high order 16 bits of a relative address.  */
1961
  HOWTO (R_PPC64_REL16_HI,      /* type */
1962
         16,                    /* rightshift */
1963
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1964
         16,                    /* bitsize */
1965
         TRUE,                  /* pc_relative */
1966
         0,                      /* bitpos */
1967
         complain_overflow_dont, /* complain_on_overflow */
1968
         bfd_elf_generic_reloc, /* special_function */
1969
         "R_PPC64_REL16_HI",    /* name */
1970
         FALSE,                 /* partial_inplace */
1971
         0,                      /* src_mask */
1972
         0xffff,                /* dst_mask */
1973
         TRUE),                 /* pcrel_offset */
1974
 
1975
  /* The high order 16 bits of a relative address, plus 1 if the contents of
1976
     the low 16 bits, treated as a signed number, is negative.  */
1977
  HOWTO (R_PPC64_REL16_HA,      /* type */
1978
         16,                    /* rightshift */
1979
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1980
         16,                    /* bitsize */
1981
         TRUE,                  /* pc_relative */
1982
         0,                      /* bitpos */
1983
         complain_overflow_dont, /* complain_on_overflow */
1984
         ppc64_elf_ha_reloc,    /* special_function */
1985
         "R_PPC64_REL16_HA",    /* name */
1986
         FALSE,                 /* partial_inplace */
1987
         0,                      /* src_mask */
1988
         0xffff,                /* dst_mask */
1989
         TRUE),                 /* pcrel_offset */
1990
 
1991
  /* GNU extension to record C++ vtable hierarchy.  */
1992
  HOWTO (R_PPC64_GNU_VTINHERIT, /* type */
1993
         0,                      /* rightshift */
1994
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
1995
         0,                      /* bitsize */
1996
         FALSE,                 /* pc_relative */
1997
         0,                      /* bitpos */
1998
         complain_overflow_dont, /* complain_on_overflow */
1999
         NULL,                  /* special_function */
2000
         "R_PPC64_GNU_VTINHERIT", /* name */
2001
         FALSE,                 /* partial_inplace */
2002
         0,                      /* src_mask */
2003
         0,                      /* dst_mask */
2004
         FALSE),                /* pcrel_offset */
2005
 
2006
  /* GNU extension to record C++ vtable member usage.  */
2007
  HOWTO (R_PPC64_GNU_VTENTRY,   /* type */
2008
         0,                      /* rightshift */
2009
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
2010
         0,                      /* bitsize */
2011
         FALSE,                 /* pc_relative */
2012
         0,                      /* bitpos */
2013
         complain_overflow_dont, /* complain_on_overflow */
2014
         NULL,                  /* special_function */
2015
         "R_PPC64_GNU_VTENTRY", /* name */
2016
         FALSE,                 /* partial_inplace */
2017
         0,                      /* src_mask */
2018
         0,                      /* dst_mask */
2019
         FALSE),                /* pcrel_offset */
2020
};
2021
 
2022
 
2023
/* Initialize the ppc64_elf_howto_table, so that linear accesses can
2024
   be done.  */
2025
 
2026
static void
2027
ppc_howto_init (void)
2028
{
2029
  unsigned int i, type;
2030
 
2031
  for (i = 0;
2032
       i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
2033
       i++)
2034
    {
2035
      type = ppc64_elf_howto_raw[i].type;
2036
      BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table)
2037
                          / sizeof (ppc64_elf_howto_table[0])));
2038
      ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
2039
    }
2040
}
2041
 
2042
static reloc_howto_type *
2043
ppc64_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2044
                             bfd_reloc_code_real_type code)
2045
{
2046
  enum elf_ppc64_reloc_type r = R_PPC64_NONE;
2047
 
2048
  if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2049
    /* Initialize howto table if needed.  */
2050
    ppc_howto_init ();
2051
 
2052
  switch (code)
2053
    {
2054
    default:
2055
      return NULL;
2056
 
2057
    case BFD_RELOC_NONE:                        r = R_PPC64_NONE;
2058
      break;
2059
    case BFD_RELOC_32:                          r = R_PPC64_ADDR32;
2060
      break;
2061
    case BFD_RELOC_PPC_BA26:                    r = R_PPC64_ADDR24;
2062
      break;
2063
    case BFD_RELOC_16:                          r = R_PPC64_ADDR16;
2064
      break;
2065
    case BFD_RELOC_LO16:                        r = R_PPC64_ADDR16_LO;
2066
      break;
2067
    case BFD_RELOC_HI16:                        r = R_PPC64_ADDR16_HI;
2068
      break;
2069
    case BFD_RELOC_HI16_S:                      r = R_PPC64_ADDR16_HA;
2070
      break;
2071
    case BFD_RELOC_PPC_BA16:                    r = R_PPC64_ADDR14;
2072
      break;
2073
    case BFD_RELOC_PPC_BA16_BRTAKEN:            r = R_PPC64_ADDR14_BRTAKEN;
2074
      break;
2075
    case BFD_RELOC_PPC_BA16_BRNTAKEN:           r = R_PPC64_ADDR14_BRNTAKEN;
2076
      break;
2077
    case BFD_RELOC_PPC_B26:                     r = R_PPC64_REL24;
2078
      break;
2079
    case BFD_RELOC_PPC_B16:                     r = R_PPC64_REL14;
2080
      break;
2081
    case BFD_RELOC_PPC_B16_BRTAKEN:             r = R_PPC64_REL14_BRTAKEN;
2082
      break;
2083
    case BFD_RELOC_PPC_B16_BRNTAKEN:            r = R_PPC64_REL14_BRNTAKEN;
2084
      break;
2085
    case BFD_RELOC_16_GOTOFF:                   r = R_PPC64_GOT16;
2086
      break;
2087
    case BFD_RELOC_LO16_GOTOFF:                 r = R_PPC64_GOT16_LO;
2088
      break;
2089
    case BFD_RELOC_HI16_GOTOFF:                 r = R_PPC64_GOT16_HI;
2090
      break;
2091
    case BFD_RELOC_HI16_S_GOTOFF:               r = R_PPC64_GOT16_HA;
2092
      break;
2093
    case BFD_RELOC_PPC_COPY:                    r = R_PPC64_COPY;
2094
      break;
2095
    case BFD_RELOC_PPC_GLOB_DAT:                r = R_PPC64_GLOB_DAT;
2096
      break;
2097
    case BFD_RELOC_32_PCREL:                    r = R_PPC64_REL32;
2098
      break;
2099
    case BFD_RELOC_32_PLTOFF:                   r = R_PPC64_PLT32;
2100
      break;
2101
    case BFD_RELOC_32_PLT_PCREL:                r = R_PPC64_PLTREL32;
2102
      break;
2103
    case BFD_RELOC_LO16_PLTOFF:                 r = R_PPC64_PLT16_LO;
2104
      break;
2105
    case BFD_RELOC_HI16_PLTOFF:                 r = R_PPC64_PLT16_HI;
2106
      break;
2107
    case BFD_RELOC_HI16_S_PLTOFF:               r = R_PPC64_PLT16_HA;
2108
      break;
2109
    case BFD_RELOC_16_BASEREL:                  r = R_PPC64_SECTOFF;
2110
      break;
2111
    case BFD_RELOC_LO16_BASEREL:                r = R_PPC64_SECTOFF_LO;
2112
      break;
2113
    case BFD_RELOC_HI16_BASEREL:                r = R_PPC64_SECTOFF_HI;
2114
      break;
2115
    case BFD_RELOC_HI16_S_BASEREL:              r = R_PPC64_SECTOFF_HA;
2116
      break;
2117
    case BFD_RELOC_CTOR:                        r = R_PPC64_ADDR64;
2118
      break;
2119
    case BFD_RELOC_64:                          r = R_PPC64_ADDR64;
2120
      break;
2121
    case BFD_RELOC_PPC64_HIGHER:                r = R_PPC64_ADDR16_HIGHER;
2122
      break;
2123
    case BFD_RELOC_PPC64_HIGHER_S:              r = R_PPC64_ADDR16_HIGHERA;
2124
      break;
2125
    case BFD_RELOC_PPC64_HIGHEST:               r = R_PPC64_ADDR16_HIGHEST;
2126
      break;
2127
    case BFD_RELOC_PPC64_HIGHEST_S:             r = R_PPC64_ADDR16_HIGHESTA;
2128
      break;
2129
    case BFD_RELOC_64_PCREL:                    r = R_PPC64_REL64;
2130
      break;
2131
    case BFD_RELOC_64_PLTOFF:                   r = R_PPC64_PLT64;
2132
      break;
2133
    case BFD_RELOC_64_PLT_PCREL:                r = R_PPC64_PLTREL64;
2134
      break;
2135
    case BFD_RELOC_PPC_TOC16:                   r = R_PPC64_TOC16;
2136
      break;
2137
    case BFD_RELOC_PPC64_TOC16_LO:              r = R_PPC64_TOC16_LO;
2138
      break;
2139
    case BFD_RELOC_PPC64_TOC16_HI:              r = R_PPC64_TOC16_HI;
2140
      break;
2141
    case BFD_RELOC_PPC64_TOC16_HA:              r = R_PPC64_TOC16_HA;
2142
      break;
2143
    case BFD_RELOC_PPC64_TOC:                   r = R_PPC64_TOC;
2144
      break;
2145
    case BFD_RELOC_PPC64_PLTGOT16:              r = R_PPC64_PLTGOT16;
2146
      break;
2147
    case BFD_RELOC_PPC64_PLTGOT16_LO:           r = R_PPC64_PLTGOT16_LO;
2148
      break;
2149
    case BFD_RELOC_PPC64_PLTGOT16_HI:           r = R_PPC64_PLTGOT16_HI;
2150
      break;
2151
    case BFD_RELOC_PPC64_PLTGOT16_HA:           r = R_PPC64_PLTGOT16_HA;
2152
      break;
2153
    case BFD_RELOC_PPC64_ADDR16_DS:             r = R_PPC64_ADDR16_DS;
2154
      break;
2155
    case BFD_RELOC_PPC64_ADDR16_LO_DS:          r = R_PPC64_ADDR16_LO_DS;
2156
      break;
2157
    case BFD_RELOC_PPC64_GOT16_DS:              r = R_PPC64_GOT16_DS;
2158
      break;
2159
    case BFD_RELOC_PPC64_GOT16_LO_DS:           r = R_PPC64_GOT16_LO_DS;
2160
      break;
2161
    case BFD_RELOC_PPC64_PLT16_LO_DS:           r = R_PPC64_PLT16_LO_DS;
2162
      break;
2163
    case BFD_RELOC_PPC64_SECTOFF_DS:            r = R_PPC64_SECTOFF_DS;
2164
      break;
2165
    case BFD_RELOC_PPC64_SECTOFF_LO_DS:         r = R_PPC64_SECTOFF_LO_DS;
2166
      break;
2167
    case BFD_RELOC_PPC64_TOC16_DS:              r = R_PPC64_TOC16_DS;
2168
      break;
2169
    case BFD_RELOC_PPC64_TOC16_LO_DS:           r = R_PPC64_TOC16_LO_DS;
2170
      break;
2171
    case BFD_RELOC_PPC64_PLTGOT16_DS:           r = R_PPC64_PLTGOT16_DS;
2172
      break;
2173
    case BFD_RELOC_PPC64_PLTGOT16_LO_DS:        r = R_PPC64_PLTGOT16_LO_DS;
2174
      break;
2175
    case BFD_RELOC_PPC_TLS:                     r = R_PPC64_TLS;
2176
      break;
2177
    case BFD_RELOC_PPC_TLSGD:                   r = R_PPC64_TLSGD;
2178
      break;
2179
    case BFD_RELOC_PPC_TLSLD:                   r = R_PPC64_TLSLD;
2180
      break;
2181
    case BFD_RELOC_PPC_DTPMOD:                  r = R_PPC64_DTPMOD64;
2182
      break;
2183
    case BFD_RELOC_PPC_TPREL16:                 r = R_PPC64_TPREL16;
2184
      break;
2185
    case BFD_RELOC_PPC_TPREL16_LO:              r = R_PPC64_TPREL16_LO;
2186
      break;
2187
    case BFD_RELOC_PPC_TPREL16_HI:              r = R_PPC64_TPREL16_HI;
2188
      break;
2189
    case BFD_RELOC_PPC_TPREL16_HA:              r = R_PPC64_TPREL16_HA;
2190
      break;
2191
    case BFD_RELOC_PPC_TPREL:                   r = R_PPC64_TPREL64;
2192
      break;
2193
    case BFD_RELOC_PPC_DTPREL16:                r = R_PPC64_DTPREL16;
2194
      break;
2195
    case BFD_RELOC_PPC_DTPREL16_LO:             r = R_PPC64_DTPREL16_LO;
2196
      break;
2197
    case BFD_RELOC_PPC_DTPREL16_HI:             r = R_PPC64_DTPREL16_HI;
2198
      break;
2199
    case BFD_RELOC_PPC_DTPREL16_HA:             r = R_PPC64_DTPREL16_HA;
2200
      break;
2201
    case BFD_RELOC_PPC_DTPREL:                  r = R_PPC64_DTPREL64;
2202
      break;
2203
    case BFD_RELOC_PPC_GOT_TLSGD16:             r = R_PPC64_GOT_TLSGD16;
2204
      break;
2205
    case BFD_RELOC_PPC_GOT_TLSGD16_LO:          r = R_PPC64_GOT_TLSGD16_LO;
2206
      break;
2207
    case BFD_RELOC_PPC_GOT_TLSGD16_HI:          r = R_PPC64_GOT_TLSGD16_HI;
2208
      break;
2209
    case BFD_RELOC_PPC_GOT_TLSGD16_HA:          r = R_PPC64_GOT_TLSGD16_HA;
2210
      break;
2211
    case BFD_RELOC_PPC_GOT_TLSLD16:             r = R_PPC64_GOT_TLSLD16;
2212
      break;
2213
    case BFD_RELOC_PPC_GOT_TLSLD16_LO:          r = R_PPC64_GOT_TLSLD16_LO;
2214
      break;
2215
    case BFD_RELOC_PPC_GOT_TLSLD16_HI:          r = R_PPC64_GOT_TLSLD16_HI;
2216
      break;
2217
    case BFD_RELOC_PPC_GOT_TLSLD16_HA:          r = R_PPC64_GOT_TLSLD16_HA;
2218
      break;
2219
    case BFD_RELOC_PPC_GOT_TPREL16:             r = R_PPC64_GOT_TPREL16_DS;
2220
      break;
2221
    case BFD_RELOC_PPC_GOT_TPREL16_LO:          r = R_PPC64_GOT_TPREL16_LO_DS;
2222
      break;
2223
    case BFD_RELOC_PPC_GOT_TPREL16_HI:          r = R_PPC64_GOT_TPREL16_HI;
2224
      break;
2225
    case BFD_RELOC_PPC_GOT_TPREL16_HA:          r = R_PPC64_GOT_TPREL16_HA;
2226
      break;
2227
    case BFD_RELOC_PPC_GOT_DTPREL16:            r = R_PPC64_GOT_DTPREL16_DS;
2228
      break;
2229
    case BFD_RELOC_PPC_GOT_DTPREL16_LO:         r = R_PPC64_GOT_DTPREL16_LO_DS;
2230
      break;
2231
    case BFD_RELOC_PPC_GOT_DTPREL16_HI:         r = R_PPC64_GOT_DTPREL16_HI;
2232
      break;
2233
    case BFD_RELOC_PPC_GOT_DTPREL16_HA:         r = R_PPC64_GOT_DTPREL16_HA;
2234
      break;
2235
    case BFD_RELOC_PPC64_TPREL16_DS:            r = R_PPC64_TPREL16_DS;
2236
      break;
2237
    case BFD_RELOC_PPC64_TPREL16_LO_DS:         r = R_PPC64_TPREL16_LO_DS;
2238
      break;
2239
    case BFD_RELOC_PPC64_TPREL16_HIGHER:        r = R_PPC64_TPREL16_HIGHER;
2240
      break;
2241
    case BFD_RELOC_PPC64_TPREL16_HIGHERA:       r = R_PPC64_TPREL16_HIGHERA;
2242
      break;
2243
    case BFD_RELOC_PPC64_TPREL16_HIGHEST:       r = R_PPC64_TPREL16_HIGHEST;
2244
      break;
2245
    case BFD_RELOC_PPC64_TPREL16_HIGHESTA:      r = R_PPC64_TPREL16_HIGHESTA;
2246
      break;
2247
    case BFD_RELOC_PPC64_DTPREL16_DS:           r = R_PPC64_DTPREL16_DS;
2248
      break;
2249
    case BFD_RELOC_PPC64_DTPREL16_LO_DS:        r = R_PPC64_DTPREL16_LO_DS;
2250
      break;
2251
    case BFD_RELOC_PPC64_DTPREL16_HIGHER:       r = R_PPC64_DTPREL16_HIGHER;
2252
      break;
2253
    case BFD_RELOC_PPC64_DTPREL16_HIGHERA:      r = R_PPC64_DTPREL16_HIGHERA;
2254
      break;
2255
    case BFD_RELOC_PPC64_DTPREL16_HIGHEST:      r = R_PPC64_DTPREL16_HIGHEST;
2256
      break;
2257
    case BFD_RELOC_PPC64_DTPREL16_HIGHESTA:     r = R_PPC64_DTPREL16_HIGHESTA;
2258
      break;
2259
    case BFD_RELOC_16_PCREL:                    r = R_PPC64_REL16;
2260
      break;
2261
    case BFD_RELOC_LO16_PCREL:                  r = R_PPC64_REL16_LO;
2262
      break;
2263
    case BFD_RELOC_HI16_PCREL:                  r = R_PPC64_REL16_HI;
2264
      break;
2265
    case BFD_RELOC_HI16_S_PCREL:                r = R_PPC64_REL16_HA;
2266
      break;
2267
    case BFD_RELOC_VTABLE_INHERIT:              r = R_PPC64_GNU_VTINHERIT;
2268
      break;
2269
    case BFD_RELOC_VTABLE_ENTRY:                r = R_PPC64_GNU_VTENTRY;
2270
      break;
2271
    }
2272
 
2273
  return ppc64_elf_howto_table[r];
2274
};
2275
 
2276
static reloc_howto_type *
2277
ppc64_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2278
                             const char *r_name)
2279
{
2280
  unsigned int i;
2281
 
2282
  for (i = 0;
2283
       i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
2284
       i++)
2285
    if (ppc64_elf_howto_raw[i].name != NULL
2286
        && strcasecmp (ppc64_elf_howto_raw[i].name, r_name) == 0)
2287
      return &ppc64_elf_howto_raw[i];
2288
 
2289
  return NULL;
2290
}
2291
 
2292
/* Set the howto pointer for a PowerPC ELF reloc.  */
2293
 
2294
static void
2295
ppc64_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2296
                         Elf_Internal_Rela *dst)
2297
{
2298
  unsigned int type;
2299
 
2300
  /* Initialize howto table if needed.  */
2301
  if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2302
    ppc_howto_init ();
2303
 
2304
  type = ELF64_R_TYPE (dst->r_info);
2305
  if (type >= (sizeof (ppc64_elf_howto_table)
2306
               / sizeof (ppc64_elf_howto_table[0])))
2307
    {
2308
      (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
2309
                             abfd, (int) type);
2310
      type = R_PPC64_NONE;
2311
    }
2312
  cache_ptr->howto = ppc64_elf_howto_table[type];
2313
}
2314
 
2315
/* Handle the R_PPC64_ADDR16_HA and similar relocs.  */
2316
 
2317
static bfd_reloc_status_type
2318
ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2319
                    void *data, asection *input_section,
2320
                    bfd *output_bfd, char **error_message)
2321
{
2322
  /* If this is a relocatable link (output_bfd test tells us), just
2323
     call the generic function.  Any adjustment will be done at final
2324
     link time.  */
2325
  if (output_bfd != NULL)
2326
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2327
                                  input_section, output_bfd, error_message);
2328
 
2329
  /* Adjust the addend for sign extension of the low 16 bits.
2330
     We won't actually be using the low 16 bits, so trashing them
2331
     doesn't matter.  */
2332
  reloc_entry->addend += 0x8000;
2333
  return bfd_reloc_continue;
2334
}
2335
 
2336
static bfd_reloc_status_type
2337
ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2338
                        void *data, asection *input_section,
2339
                        bfd *output_bfd, char **error_message)
2340
{
2341
  if (output_bfd != NULL)
2342
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2343
                                  input_section, output_bfd, error_message);
2344
 
2345
  if (strcmp (symbol->section->name, ".opd") == 0
2346
      && (symbol->section->owner->flags & DYNAMIC) == 0)
2347
    {
2348
      bfd_vma dest = opd_entry_value (symbol->section,
2349
                                      symbol->value + reloc_entry->addend,
2350
                                      NULL, NULL);
2351
      if (dest != (bfd_vma) -1)
2352
        reloc_entry->addend = dest - (symbol->value
2353
                                      + symbol->section->output_section->vma
2354
                                      + symbol->section->output_offset);
2355
    }
2356
  return bfd_reloc_continue;
2357
}
2358
 
2359
static bfd_reloc_status_type
2360
ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2361
                         void *data, asection *input_section,
2362
                         bfd *output_bfd, char **error_message)
2363
{
2364
  long insn;
2365
  enum elf_ppc64_reloc_type r_type;
2366
  bfd_size_type octets;
2367 166 khays
  /* Assume 'at' branch hints.  */
2368
  bfd_boolean is_isa_v2 = TRUE;
2369 14 khays
 
2370
  /* If this is a relocatable link (output_bfd test tells us), just
2371
     call the generic function.  Any adjustment will be done at final
2372
     link time.  */
2373
  if (output_bfd != NULL)
2374
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2375
                                  input_section, output_bfd, error_message);
2376
 
2377
  octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2378
  insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2379
  insn &= ~(0x01 << 21);
2380
  r_type = reloc_entry->howto->type;
2381
  if (r_type == R_PPC64_ADDR14_BRTAKEN
2382
      || r_type == R_PPC64_REL14_BRTAKEN)
2383
    insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field.  */
2384
 
2385 166 khays
  if (is_isa_v2)
2386 14 khays
    {
2387
      /* Set 'a' bit.  This is 0b00010 in BO field for branch
2388
         on CR(BI) insns (BO == 001at or 011at), and 0b01000
2389
         for branch on CTR insns (BO == 1a00t or 1a01t).  */
2390
      if ((insn & (0x14 << 21)) == (0x04 << 21))
2391
        insn |= 0x02 << 21;
2392
      else if ((insn & (0x14 << 21)) == (0x10 << 21))
2393
        insn |= 0x08 << 21;
2394
      else
2395
        goto out;
2396
    }
2397
  else
2398
    {
2399
      bfd_vma target = 0;
2400
      bfd_vma from;
2401
 
2402
      if (!bfd_is_com_section (symbol->section))
2403
        target = symbol->value;
2404
      target += symbol->section->output_section->vma;
2405
      target += symbol->section->output_offset;
2406
      target += reloc_entry->addend;
2407
 
2408
      from = (reloc_entry->address
2409
              + input_section->output_offset
2410
              + input_section->output_section->vma);
2411
 
2412
      /* Invert 'y' bit if not the default.  */
2413
      if ((bfd_signed_vma) (target - from) < 0)
2414
        insn ^= 0x01 << 21;
2415
    }
2416
  bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2417
 out:
2418
  return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
2419
                                 input_section, output_bfd, error_message);
2420
}
2421
 
2422
static bfd_reloc_status_type
2423
ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2424
                         void *data, asection *input_section,
2425
                         bfd *output_bfd, char **error_message)
2426
{
2427
  /* If this is a relocatable link (output_bfd test tells us), just
2428
     call the generic function.  Any adjustment will be done at final
2429
     link time.  */
2430
  if (output_bfd != NULL)
2431
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2432
                                  input_section, output_bfd, error_message);
2433
 
2434
  /* Subtract the symbol section base address.  */
2435
  reloc_entry->addend -= symbol->section->output_section->vma;
2436
  return bfd_reloc_continue;
2437
}
2438
 
2439
static bfd_reloc_status_type
2440
ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2441
                            void *data, asection *input_section,
2442
                            bfd *output_bfd, char **error_message)
2443
{
2444
  /* If this is a relocatable link (output_bfd test tells us), just
2445
     call the generic function.  Any adjustment will be done at final
2446
     link time.  */
2447
  if (output_bfd != NULL)
2448
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2449
                                  input_section, output_bfd, error_message);
2450
 
2451
  /* Subtract the symbol section base address.  */
2452
  reloc_entry->addend -= symbol->section->output_section->vma;
2453
 
2454
  /* Adjust the addend for sign extension of the low 16 bits.  */
2455
  reloc_entry->addend += 0x8000;
2456
  return bfd_reloc_continue;
2457
}
2458
 
2459
static bfd_reloc_status_type
2460
ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2461
                     void *data, asection *input_section,
2462
                     bfd *output_bfd, char **error_message)
2463
{
2464
  bfd_vma TOCstart;
2465
 
2466
  /* If this is a relocatable link (output_bfd test tells us), just
2467
     call the generic function.  Any adjustment will be done at final
2468
     link time.  */
2469
  if (output_bfd != NULL)
2470
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2471
                                  input_section, output_bfd, error_message);
2472
 
2473
  TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2474
  if (TOCstart == 0)
2475
    TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2476
 
2477
  /* Subtract the TOC base address.  */
2478
  reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2479
  return bfd_reloc_continue;
2480
}
2481
 
2482
static bfd_reloc_status_type
2483
ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2484
                        void *data, asection *input_section,
2485
                        bfd *output_bfd, char **error_message)
2486
{
2487
  bfd_vma TOCstart;
2488
 
2489
  /* If this is a relocatable link (output_bfd test tells us), just
2490
     call the generic function.  Any adjustment will be done at final
2491
     link time.  */
2492
  if (output_bfd != NULL)
2493
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2494
                                  input_section, output_bfd, error_message);
2495
 
2496
  TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2497
  if (TOCstart == 0)
2498
    TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2499
 
2500
  /* Subtract the TOC base address.  */
2501
  reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2502
 
2503
  /* Adjust the addend for sign extension of the low 16 bits.  */
2504
  reloc_entry->addend += 0x8000;
2505
  return bfd_reloc_continue;
2506
}
2507
 
2508
static bfd_reloc_status_type
2509
ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2510
                       void *data, asection *input_section,
2511
                       bfd *output_bfd, char **error_message)
2512
{
2513
  bfd_vma TOCstart;
2514
  bfd_size_type octets;
2515
 
2516
  /* If this is a relocatable link (output_bfd test tells us), just
2517
     call the generic function.  Any adjustment will be done at final
2518
     link time.  */
2519
  if (output_bfd != NULL)
2520
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2521
                                  input_section, output_bfd, error_message);
2522
 
2523
  TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2524
  if (TOCstart == 0)
2525
    TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2526
 
2527
  octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2528
  bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
2529
  return bfd_reloc_ok;
2530
}
2531
 
2532
static bfd_reloc_status_type
2533
ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2534
                           void *data, asection *input_section,
2535
                           bfd *output_bfd, char **error_message)
2536
{
2537
  /* If this is a relocatable link (output_bfd test tells us), just
2538
     call the generic function.  Any adjustment will be done at final
2539
     link time.  */
2540
  if (output_bfd != NULL)
2541
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2542
                                  input_section, output_bfd, error_message);
2543
 
2544
  if (error_message != NULL)
2545
    {
2546
      static char buf[60];
2547
      sprintf (buf, "generic linker can't handle %s",
2548
               reloc_entry->howto->name);
2549
      *error_message = buf;
2550
    }
2551
  return bfd_reloc_dangerous;
2552
}
2553
 
2554
/* Track GOT entries needed for a given symbol.  We might need more
2555
   than one got entry per symbol.  */
2556
struct got_entry
2557
{
2558
  struct got_entry *next;
2559
 
2560
  /* The symbol addend that we'll be placing in the GOT.  */
2561
  bfd_vma addend;
2562
 
2563
  /* Unlike other ELF targets, we use separate GOT entries for the same
2564
     symbol referenced from different input files.  This is to support
2565
     automatic multiple TOC/GOT sections, where the TOC base can vary
2566
     from one input file to another.  After partitioning into TOC groups
2567
     we merge entries within the group.
2568
 
2569
     Point to the BFD owning this GOT entry.  */
2570
  bfd *owner;
2571
 
2572
  /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
2573
     TLS_TPREL or TLS_DTPREL for tls entries.  */
2574
  unsigned char tls_type;
2575
 
2576
  /* Non-zero if got.ent points to real entry.  */
2577
  unsigned char is_indirect;
2578
 
2579
  /* Reference count until size_dynamic_sections, GOT offset thereafter.  */
2580
  union
2581
    {
2582
      bfd_signed_vma refcount;
2583
      bfd_vma offset;
2584
      struct got_entry *ent;
2585
    } got;
2586
};
2587
 
2588
/* The same for PLT.  */
2589
struct plt_entry
2590
{
2591
  struct plt_entry *next;
2592
 
2593
  bfd_vma addend;
2594
 
2595
  union
2596
    {
2597
      bfd_signed_vma refcount;
2598
      bfd_vma offset;
2599
    } plt;
2600
};
2601
 
2602
struct ppc64_elf_obj_tdata
2603
{
2604
  struct elf_obj_tdata elf;
2605
 
2606
  /* Shortcuts to dynamic linker sections.  */
2607
  asection *got;
2608
  asection *relgot;
2609
 
2610
  /* Used during garbage collection.  We attach global symbols defined
2611
     on removed .opd entries to this section so that the sym is removed.  */
2612
  asection *deleted_section;
2613
 
2614
  /* TLS local dynamic got entry handling.  Support for multiple GOT
2615
     sections means we potentially need one of these for each input bfd.  */
2616
  struct got_entry tlsld_got;
2617
 
2618
  /* A copy of relocs before they are modified for --emit-relocs.  */
2619
  Elf_Internal_Rela *opd_relocs;
2620
 
2621
  /* Nonzero if this bfd has small toc/got relocs, ie. that expect
2622
     the reloc to be in the range -32768 to 32767.  */
2623 163 khays
  unsigned int has_small_toc_reloc : 1;
2624
 
2625
  /* Set if toc/got ha relocs detected not using r2, or lo reloc
2626
     instruction not one we handle.  */
2627
  unsigned int unexpected_toc_insn : 1;
2628 14 khays
};
2629
 
2630
#define ppc64_elf_tdata(bfd) \
2631
  ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
2632
 
2633
#define ppc64_tlsld_got(bfd) \
2634
  (&ppc64_elf_tdata (bfd)->tlsld_got)
2635
 
2636
#define is_ppc64_elf(bfd) \
2637
  (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2638
   && elf_object_id (bfd) == PPC64_ELF_DATA)
2639
 
2640
/* Override the generic function because we store some extras.  */
2641
 
2642
static bfd_boolean
2643
ppc64_elf_mkobject (bfd *abfd)
2644
{
2645
  return bfd_elf_allocate_object (abfd, sizeof (struct ppc64_elf_obj_tdata),
2646
                                  PPC64_ELF_DATA);
2647
}
2648
 
2649
/* Fix bad default arch selected for a 64 bit input bfd when the
2650
   default is 32 bit.  */
2651
 
2652
static bfd_boolean
2653
ppc64_elf_object_p (bfd *abfd)
2654
{
2655
  if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 32)
2656
    {
2657
      Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2658
 
2659
      if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
2660
        {
2661
          /* Relies on arch after 32 bit default being 64 bit default.  */
2662
          abfd->arch_info = abfd->arch_info->next;
2663
          BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
2664
        }
2665
    }
2666
  return TRUE;
2667
}
2668
 
2669
/* Support for core dump NOTE sections.  */
2670
 
2671
static bfd_boolean
2672
ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2673
{
2674
  size_t offset, size;
2675
 
2676
  if (note->descsz != 504)
2677
    return FALSE;
2678
 
2679
  /* pr_cursig */
2680
  elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2681
 
2682
  /* pr_pid */
2683
  elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 32);
2684
 
2685
  /* pr_reg */
2686
  offset = 112;
2687
  size = 384;
2688
 
2689
  /* Make a ".reg/999" section.  */
2690
  return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2691
                                          size, note->descpos + offset);
2692
}
2693
 
2694
static bfd_boolean
2695
ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2696
{
2697
  if (note->descsz != 136)
2698
    return FALSE;
2699
 
2700
  elf_tdata (abfd)->core_pid
2701
    = bfd_get_32 (abfd, note->descdata + 24);
2702
  elf_tdata (abfd)->core_program
2703
    = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
2704
  elf_tdata (abfd)->core_command
2705
    = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
2706
 
2707
  return TRUE;
2708
}
2709
 
2710
static char *
2711
ppc64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
2712
                           ...)
2713
{
2714
  switch (note_type)
2715
    {
2716
    default:
2717
      return NULL;
2718
 
2719
    case NT_PRPSINFO:
2720
      {
2721
        char data[136];
2722
        va_list ap;
2723
 
2724
        va_start (ap, note_type);
2725 166 khays
        memset (data, 0, sizeof (data));
2726 14 khays
        strncpy (data + 40, va_arg (ap, const char *), 16);
2727
        strncpy (data + 56, va_arg (ap, const char *), 80);
2728
        va_end (ap);
2729
        return elfcore_write_note (abfd, buf, bufsiz,
2730
                                   "CORE", note_type, data, sizeof (data));
2731
      }
2732
 
2733
    case NT_PRSTATUS:
2734
      {
2735
        char data[504];
2736
        va_list ap;
2737
        long pid;
2738
        int cursig;
2739
        const void *greg;
2740
 
2741
        va_start (ap, note_type);
2742
        memset (data, 0, 112);
2743
        pid = va_arg (ap, long);
2744
        bfd_put_32 (abfd, pid, data + 32);
2745
        cursig = va_arg (ap, int);
2746
        bfd_put_16 (abfd, cursig, data + 12);
2747
        greg = va_arg (ap, const void *);
2748
        memcpy (data + 112, greg, 384);
2749
        memset (data + 496, 0, 8);
2750
        va_end (ap);
2751
        return elfcore_write_note (abfd, buf, bufsiz,
2752
                                   "CORE", note_type, data, sizeof (data));
2753
      }
2754
    }
2755
}
2756
 
2757
/* Add extra PPC sections.  */
2758
 
2759
static const struct bfd_elf_special_section ppc64_elf_special_sections[]=
2760
{
2761
  { STRING_COMMA_LEN (".plt"),    0, SHT_NOBITS,   0 },
2762
  { STRING_COMMA_LEN (".sbss"),  -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
2763
  { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2764
  { STRING_COMMA_LEN (".toc"),    0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2765
  { STRING_COMMA_LEN (".toc1"),   0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2766
  { STRING_COMMA_LEN (".tocbss"), 0, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
2767
  { NULL,                     0,  0, 0,            0 }
2768
};
2769
 
2770
enum _ppc64_sec_type {
2771
  sec_normal = 0,
2772
  sec_opd = 1,
2773
  sec_toc = 2
2774
};
2775
 
2776
struct _ppc64_elf_section_data
2777
{
2778
  struct bfd_elf_section_data elf;
2779
 
2780
  union
2781
  {
2782
    /* An array with one entry for each opd function descriptor.  */
2783
    struct _opd_sec_data
2784
    {
2785
      /* Points to the function code section for local opd entries.  */
2786
      asection **func_sec;
2787
 
2788
      /* After editing .opd, adjust references to opd local syms.  */
2789
      long *adjust;
2790
    } opd;
2791
 
2792
    /* An array for toc sections, indexed by offset/8.  */
2793
    struct _toc_sec_data
2794
    {
2795
      /* Specifies the relocation symbol index used at a given toc offset.  */
2796
      unsigned *symndx;
2797
 
2798
      /* And the relocation addend.  */
2799
      bfd_vma *add;
2800
    } toc;
2801
  } u;
2802
 
2803
  enum _ppc64_sec_type sec_type:2;
2804
 
2805
  /* Flag set when small branches are detected.  Used to
2806
     select suitable defaults for the stub group size.  */
2807
  unsigned int has_14bit_branch:1;
2808
};
2809
 
2810
#define ppc64_elf_section_data(sec) \
2811
  ((struct _ppc64_elf_section_data *) elf_section_data (sec))
2812
 
2813
static bfd_boolean
2814
ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
2815
{
2816
  if (!sec->used_by_bfd)
2817
    {
2818
      struct _ppc64_elf_section_data *sdata;
2819
      bfd_size_type amt = sizeof (*sdata);
2820
 
2821
      sdata = bfd_zalloc (abfd, amt);
2822
      if (sdata == NULL)
2823
        return FALSE;
2824
      sec->used_by_bfd = sdata;
2825
    }
2826
 
2827
  return _bfd_elf_new_section_hook (abfd, sec);
2828
}
2829
 
2830
static struct _opd_sec_data *
2831
get_opd_info (asection * sec)
2832
{
2833
  if (sec != NULL
2834
      && ppc64_elf_section_data (sec) != NULL
2835
      && ppc64_elf_section_data (sec)->sec_type == sec_opd)
2836
    return &ppc64_elf_section_data (sec)->u.opd;
2837
  return NULL;
2838
}
2839
 
2840
/* Parameters for the qsort hook.  */
2841
static bfd_boolean synthetic_relocatable;
2842
 
2843
/* qsort comparison function for ppc64_elf_get_synthetic_symtab.  */
2844
 
2845
static int
2846
compare_symbols (const void *ap, const void *bp)
2847
{
2848
  const asymbol *a = * (const asymbol **) ap;
2849
  const asymbol *b = * (const asymbol **) bp;
2850
 
2851
  /* Section symbols first.  */
2852
  if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
2853
    return -1;
2854
  if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
2855
    return 1;
2856
 
2857
  /* then .opd symbols.  */
2858
  if (strcmp (a->section->name, ".opd") == 0
2859
      && strcmp (b->section->name, ".opd") != 0)
2860
    return -1;
2861
  if (strcmp (a->section->name, ".opd") != 0
2862
      && strcmp (b->section->name, ".opd") == 0)
2863
    return 1;
2864
 
2865
  /* then other code symbols.  */
2866
  if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2867
      == (SEC_CODE | SEC_ALLOC)
2868
      && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2869
         != (SEC_CODE | SEC_ALLOC))
2870
    return -1;
2871
 
2872
  if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2873
      != (SEC_CODE | SEC_ALLOC)
2874
      && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2875
         == (SEC_CODE | SEC_ALLOC))
2876
    return 1;
2877
 
2878
  if (synthetic_relocatable)
2879
    {
2880
      if (a->section->id < b->section->id)
2881
        return -1;
2882
 
2883
      if (a->section->id > b->section->id)
2884
        return 1;
2885
    }
2886
 
2887
  if (a->value + a->section->vma < b->value + b->section->vma)
2888
    return -1;
2889
 
2890
  if (a->value + a->section->vma > b->value + b->section->vma)
2891
    return 1;
2892
 
2893
  /* For syms with the same value, prefer strong dynamic global function
2894
     syms over other syms.  */
2895
  if ((a->flags & BSF_GLOBAL) != 0 && (b->flags & BSF_GLOBAL) == 0)
2896
    return -1;
2897
 
2898
  if ((a->flags & BSF_GLOBAL) == 0 && (b->flags & BSF_GLOBAL) != 0)
2899
    return 1;
2900
 
2901
  if ((a->flags & BSF_FUNCTION) != 0 && (b->flags & BSF_FUNCTION) == 0)
2902
    return -1;
2903
 
2904
  if ((a->flags & BSF_FUNCTION) == 0 && (b->flags & BSF_FUNCTION) != 0)
2905
    return 1;
2906
 
2907
  if ((a->flags & BSF_WEAK) == 0 && (b->flags & BSF_WEAK) != 0)
2908
    return -1;
2909
 
2910
  if ((a->flags & BSF_WEAK) != 0 && (b->flags & BSF_WEAK) == 0)
2911
    return 1;
2912
 
2913
  if ((a->flags & BSF_DYNAMIC) != 0 && (b->flags & BSF_DYNAMIC) == 0)
2914
    return -1;
2915
 
2916
  if ((a->flags & BSF_DYNAMIC) == 0 && (b->flags & BSF_DYNAMIC) != 0)
2917
    return 1;
2918
 
2919
  return 0;
2920
}
2921
 
2922
/* Search SYMS for a symbol of the given VALUE.  */
2923
 
2924
static asymbol *
2925
sym_exists_at (asymbol **syms, long lo, long hi, int id, bfd_vma value)
2926
{
2927
  long mid;
2928
 
2929
  if (id == -1)
2930
    {
2931
      while (lo < hi)
2932
        {
2933
          mid = (lo + hi) >> 1;
2934
          if (syms[mid]->value + syms[mid]->section->vma < value)
2935
            lo = mid + 1;
2936
          else if (syms[mid]->value + syms[mid]->section->vma > value)
2937
            hi = mid;
2938
          else
2939
            return syms[mid];
2940
        }
2941
    }
2942
  else
2943
    {
2944
      while (lo < hi)
2945
        {
2946
          mid = (lo + hi) >> 1;
2947
          if (syms[mid]->section->id < id)
2948
            lo = mid + 1;
2949
          else if (syms[mid]->section->id > id)
2950
            hi = mid;
2951
          else if (syms[mid]->value < value)
2952
            lo = mid + 1;
2953
          else if (syms[mid]->value > value)
2954
            hi = mid;
2955
          else
2956
            return syms[mid];
2957
        }
2958
    }
2959
  return NULL;
2960
}
2961
 
2962
static bfd_boolean
2963
section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
2964
{
2965
  bfd_vma vma = *(bfd_vma *) ptr;
2966
  return ((section->flags & SEC_ALLOC) != 0
2967
          && section->vma <= vma
2968
          && vma < section->vma + section->size);
2969
}
2970
 
2971
/* Create synthetic symbols, effectively restoring "dot-symbol" function
2972
   entry syms.  Also generate @plt symbols for the glink branch table.  */
2973
 
2974
static long
2975
ppc64_elf_get_synthetic_symtab (bfd *abfd,
2976
                                long static_count, asymbol **static_syms,
2977
                                long dyn_count, asymbol **dyn_syms,
2978
                                asymbol **ret)
2979
{
2980
  asymbol *s;
2981
  long i;
2982
  long count;
2983
  char *names;
2984
  long symcount, codesecsym, codesecsymend, secsymend, opdsymend;
2985
  asection *opd;
2986
  bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
2987
  asymbol **syms;
2988
 
2989
  *ret = NULL;
2990
 
2991
  opd = bfd_get_section_by_name (abfd, ".opd");
2992
  if (opd == NULL)
2993
    return 0;
2994
 
2995
  symcount = static_count;
2996
  if (!relocatable)
2997
    symcount += dyn_count;
2998
  if (symcount == 0)
2999
    return 0;
3000
 
3001
  syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
3002
  if (syms == NULL)
3003
    return -1;
3004
 
3005
  if (!relocatable && static_count != 0 && dyn_count != 0)
3006
    {
3007
      /* Use both symbol tables.  */
3008
      memcpy (syms, static_syms, static_count * sizeof (*syms));
3009
      memcpy (syms + static_count, dyn_syms, (dyn_count + 1) * sizeof (*syms));
3010
    }
3011
  else if (!relocatable && static_count == 0)
3012
    memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
3013
  else
3014
    memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
3015
 
3016
  synthetic_relocatable = relocatable;
3017
  qsort (syms, symcount, sizeof (*syms), compare_symbols);
3018
 
3019
  if (!relocatable && symcount > 1)
3020
    {
3021
      long j;
3022
      /* Trim duplicate syms, since we may have merged the normal and
3023
         dynamic symbols.  Actually, we only care about syms that have
3024
         different values, so trim any with the same value.  */
3025
      for (i = 1, j = 1; i < symcount; ++i)
3026
        if (syms[i - 1]->value + syms[i - 1]->section->vma
3027
            != syms[i]->value + syms[i]->section->vma)
3028
          syms[j++] = syms[i];
3029
      symcount = j;
3030
    }
3031
 
3032
  i = 0;
3033
  if (strcmp (syms[i]->section->name, ".opd") == 0)
3034
    ++i;
3035
  codesecsym = i;
3036
 
3037
  for (; i < symcount; ++i)
3038
    if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3039
         != (SEC_CODE | SEC_ALLOC))
3040
        || (syms[i]->flags & BSF_SECTION_SYM) == 0)
3041
      break;
3042
  codesecsymend = i;
3043
 
3044
  for (; i < symcount; ++i)
3045
    if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
3046
      break;
3047
  secsymend = i;
3048
 
3049
  for (; i < symcount; ++i)
3050
    if (strcmp (syms[i]->section->name, ".opd") != 0)
3051
      break;
3052
  opdsymend = i;
3053
 
3054
  for (; i < symcount; ++i)
3055
    if ((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3056
        != (SEC_CODE | SEC_ALLOC))
3057
      break;
3058
  symcount = i;
3059
 
3060
  count = 0;
3061
 
3062
  if (relocatable)
3063
    {
3064
      bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3065
      arelent *r;
3066
      size_t size;
3067
      long relcount;
3068
 
3069
      if (opdsymend == secsymend)
3070
        goto done;
3071
 
3072
      slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3073
      relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
3074
      if (relcount == 0)
3075
        goto done;
3076
 
3077
      if (!(*slurp_relocs) (abfd, opd, static_syms, FALSE))
3078
        {
3079
          count = -1;
3080
          goto done;
3081
        }
3082
 
3083
      size = 0;
3084
      for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
3085
        {
3086
          asymbol *sym;
3087
 
3088
          while (r < opd->relocation + relcount
3089
                 && r->address < syms[i]->value + opd->vma)
3090
            ++r;
3091
 
3092
          if (r == opd->relocation + relcount)
3093
            break;
3094
 
3095
          if (r->address != syms[i]->value + opd->vma)
3096
            continue;
3097
 
3098
          if (r->howto->type != R_PPC64_ADDR64)
3099
            continue;
3100
 
3101
          sym = *r->sym_ptr_ptr;
3102
          if (!sym_exists_at (syms, opdsymend, symcount,
3103
                              sym->section->id, sym->value + r->addend))
3104
            {
3105
              ++count;
3106
              size += sizeof (asymbol);
3107
              size += strlen (syms[i]->name) + 2;
3108
            }
3109
        }
3110
 
3111
      s = *ret = bfd_malloc (size);
3112
      if (s == NULL)
3113
        {
3114
          count = -1;
3115
          goto done;
3116
        }
3117
 
3118
      names = (char *) (s + count);
3119
 
3120
      for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
3121
        {
3122
          asymbol *sym;
3123
 
3124
          while (r < opd->relocation + relcount
3125
                 && r->address < syms[i]->value + opd->vma)
3126
            ++r;
3127
 
3128
          if (r == opd->relocation + relcount)
3129
            break;
3130
 
3131
          if (r->address != syms[i]->value + opd->vma)
3132
            continue;
3133
 
3134
          if (r->howto->type != R_PPC64_ADDR64)
3135
            continue;
3136
 
3137
          sym = *r->sym_ptr_ptr;
3138
          if (!sym_exists_at (syms, opdsymend, symcount,
3139
                              sym->section->id, sym->value + r->addend))
3140
            {
3141
              size_t len;
3142
 
3143
              *s = *syms[i];
3144
              s->flags |= BSF_SYNTHETIC;
3145
              s->section = sym->section;
3146
              s->value = sym->value + r->addend;
3147
              s->name = names;
3148
              *names++ = '.';
3149
              len = strlen (syms[i]->name);
3150
              memcpy (names, syms[i]->name, len + 1);
3151
              names += len + 1;
3152
              /* Have udata.p point back to the original symbol this
3153
                 synthetic symbol was derived from.  */
3154
              s->udata.p = syms[i];
3155
              s++;
3156
            }
3157
        }
3158
    }
3159
  else
3160
    {
3161
      bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3162
      bfd_byte *contents;
3163
      size_t size;
3164
      long plt_count = 0;
3165
      bfd_vma glink_vma = 0, resolv_vma = 0;
3166
      asection *dynamic, *glink = NULL, *relplt = NULL;
3167
      arelent *p;
3168
 
3169
      if (!bfd_malloc_and_get_section (abfd, opd, &contents))
3170
        {
3171
          if (contents)
3172
            {
3173
            free_contents_and_exit:
3174
              free (contents);
3175
            }
3176
          count = -1;
3177
          goto done;
3178
        }
3179
 
3180
      size = 0;
3181
      for (i = secsymend; i < opdsymend; ++i)
3182
        {
3183
          bfd_vma ent;
3184
 
3185
          /* Ignore bogus symbols.  */
3186
          if (syms[i]->value > opd->size - 8)
3187
            continue;
3188
 
3189
          ent = bfd_get_64 (abfd, contents + syms[i]->value);
3190
          if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3191
            {
3192
              ++count;
3193
              size += sizeof (asymbol);
3194
              size += strlen (syms[i]->name) + 2;
3195
            }
3196
        }
3197
 
3198
      /* Get start of .glink stubs from DT_PPC64_GLINK.  */
3199
      if (dyn_count != 0
3200
          && (dynamic = bfd_get_section_by_name (abfd, ".dynamic")) != NULL)
3201
        {
3202
          bfd_byte *dynbuf, *extdyn, *extdynend;
3203
          size_t extdynsize;
3204
          void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
3205
 
3206
          if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
3207
            goto free_contents_and_exit;
3208
 
3209
          extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
3210
          swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
3211
 
3212
          extdyn = dynbuf;
3213
          extdynend = extdyn + dynamic->size;
3214
          for (; extdyn < extdynend; extdyn += extdynsize)
3215
            {
3216
              Elf_Internal_Dyn dyn;
3217
              (*swap_dyn_in) (abfd, extdyn, &dyn);
3218
 
3219
              if (dyn.d_tag == DT_NULL)
3220
                break;
3221
 
3222
              if (dyn.d_tag == DT_PPC64_GLINK)
3223
                {
3224
                  /* The first glink stub starts at offset 32; see comment in
3225
                     ppc64_elf_finish_dynamic_sections. */
3226
                  glink_vma = dyn.d_un.d_val + 32;
3227
                  /* The .glink section usually does not survive the final
3228
                     link; search for the section (usually .text) where the
3229
                     glink stubs now reside.  */
3230
                  glink = bfd_sections_find_if (abfd, section_covers_vma,
3231
                                                &glink_vma);
3232
                  break;
3233
                }
3234
            }
3235
 
3236
          free (dynbuf);
3237
        }
3238
 
3239
      if (glink != NULL)
3240
        {
3241
          /* Determine __glink trampoline by reading the relative branch
3242
             from the first glink stub.  */
3243
          bfd_byte buf[4];
3244
          if (bfd_get_section_contents (abfd, glink, buf,
3245
                                        glink_vma + 4 - glink->vma, 4))
3246
            {
3247
              unsigned int insn = bfd_get_32 (abfd, buf);
3248
              insn ^= B_DOT;
3249
              if ((insn & ~0x3fffffc) == 0)
3250
                resolv_vma = glink_vma + 4 + (insn ^ 0x2000000) - 0x2000000;
3251
            }
3252
 
3253
          if (resolv_vma)
3254
            size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
3255
 
3256
          relplt = bfd_get_section_by_name (abfd, ".rela.plt");
3257
          if (relplt != NULL)
3258
            {
3259
              slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3260
              if (! (*slurp_relocs) (abfd, relplt, dyn_syms, TRUE))
3261
                goto free_contents_and_exit;
3262
 
3263
              plt_count = relplt->size / sizeof (Elf64_External_Rela);
3264
              size += plt_count * sizeof (asymbol);
3265
 
3266
              p = relplt->relocation;
3267
              for (i = 0; i < plt_count; i++, p++)
3268
                {
3269
                  size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
3270
                  if (p->addend != 0)
3271
                    size += sizeof ("+0x") - 1 + 16;
3272
                }
3273
            }
3274
        }
3275
 
3276
      s = *ret = bfd_malloc (size);
3277
      if (s == NULL)
3278
        goto free_contents_and_exit;
3279
 
3280
      names = (char *) (s + count + plt_count + (resolv_vma != 0));
3281
 
3282
      for (i = secsymend; i < opdsymend; ++i)
3283
        {
3284
          bfd_vma ent;
3285
 
3286
          if (syms[i]->value > opd->size - 8)
3287
            continue;
3288
 
3289
          ent = bfd_get_64 (abfd, contents + syms[i]->value);
3290
          if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3291
            {
3292
              long lo, hi;
3293
              size_t len;
3294
              asection *sec = abfd->sections;
3295
 
3296
              *s = *syms[i];
3297
              lo = codesecsym;
3298
              hi = codesecsymend;
3299
              while (lo < hi)
3300
                {
3301
                  long mid = (lo + hi) >> 1;
3302
                  if (syms[mid]->section->vma < ent)
3303
                    lo = mid + 1;
3304
                  else if (syms[mid]->section->vma > ent)
3305
                    hi = mid;
3306
                  else
3307
                    {
3308
                      sec = syms[mid]->section;
3309
                      break;
3310
                    }
3311
                }
3312
 
3313
              if (lo >= hi && lo > codesecsym)
3314
                sec = syms[lo - 1]->section;
3315
 
3316
              for (; sec != NULL; sec = sec->next)
3317
                {
3318
                  if (sec->vma > ent)
3319
                    break;
3320
                  /* SEC_LOAD may not be set if SEC is from a separate debug
3321
                     info file.  */
3322
                  if ((sec->flags & SEC_ALLOC) == 0)
3323
                    break;
3324
                  if ((sec->flags & SEC_CODE) != 0)
3325
                    s->section = sec;
3326
                }
3327
              s->flags |= BSF_SYNTHETIC;
3328
              s->value = ent - s->section->vma;
3329
              s->name = names;
3330
              *names++ = '.';
3331
              len = strlen (syms[i]->name);
3332
              memcpy (names, syms[i]->name, len + 1);
3333
              names += len + 1;
3334
              /* Have udata.p point back to the original symbol this
3335
                 synthetic symbol was derived from.  */
3336
              s->udata.p = syms[i];
3337
              s++;
3338
            }
3339
        }
3340
      free (contents);
3341
 
3342
      if (glink != NULL && relplt != NULL)
3343
        {
3344
          if (resolv_vma)
3345
            {
3346
              /* Add a symbol for the main glink trampoline.  */
3347
              memset (s, 0, sizeof *s);
3348
              s->the_bfd = abfd;
3349
              s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
3350
              s->section = glink;
3351
              s->value = resolv_vma - glink->vma;
3352
              s->name = names;
3353
              memcpy (names, "__glink_PLTresolve", sizeof ("__glink_PLTresolve"));
3354
              names += sizeof ("__glink_PLTresolve");
3355
              s++;
3356
              count++;
3357
            }
3358
 
3359
          /* FIXME: It would be very much nicer to put sym@plt on the
3360
             stub rather than on the glink branch table entry.  The
3361
             objdump disassembler would then use a sensible symbol
3362
             name on plt calls.  The difficulty in doing so is
3363
             a) finding the stubs, and,
3364
             b) matching stubs against plt entries, and,
3365
             c) there can be multiple stubs for a given plt entry.
3366
 
3367
             Solving (a) could be done by code scanning, but older
3368
             ppc64 binaries used different stubs to current code.
3369
             (b) is the tricky one since you need to known the toc
3370
             pointer for at least one function that uses a pic stub to
3371
             be able to calculate the plt address referenced.
3372
             (c) means gdb would need to set multiple breakpoints (or
3373
             find the glink branch itself) when setting breakpoints
3374
             for pending shared library loads.  */
3375
          p = relplt->relocation;
3376
          for (i = 0; i < plt_count; i++, p++)
3377
            {
3378
              size_t len;
3379
 
3380
              *s = **p->sym_ptr_ptr;
3381
              /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set.  Since
3382
                 we are defining a symbol, ensure one of them is set.  */
3383
              if ((s->flags & BSF_LOCAL) == 0)
3384
                s->flags |= BSF_GLOBAL;
3385
              s->flags |= BSF_SYNTHETIC;
3386
              s->section = glink;
3387
              s->value = glink_vma - glink->vma;
3388
              s->name = names;
3389
              s->udata.p = NULL;
3390
              len = strlen ((*p->sym_ptr_ptr)->name);
3391
              memcpy (names, (*p->sym_ptr_ptr)->name, len);
3392
              names += len;
3393
              if (p->addend != 0)
3394
                {
3395
                  memcpy (names, "+0x", sizeof ("+0x") - 1);
3396
                  names += sizeof ("+0x") - 1;
3397
                  bfd_sprintf_vma (abfd, names, p->addend);
3398
                  names += strlen (names);
3399
                }
3400
              memcpy (names, "@plt", sizeof ("@plt"));
3401
              names += sizeof ("@plt");
3402
              s++;
3403
              glink_vma += 8;
3404
              if (i >= 0x8000)
3405
                glink_vma += 4;
3406
            }
3407
          count += plt_count;
3408
        }
3409
    }
3410
 
3411
 done:
3412
  free (syms);
3413
  return count;
3414
}
3415
 
3416
/* The following functions are specific to the ELF linker, while
3417
   functions above are used generally.  Those named ppc64_elf_* are
3418
   called by the main ELF linker code.  They appear in this file more
3419
   or less in the order in which they are called.  eg.
3420
   ppc64_elf_check_relocs is called early in the link process,
3421
   ppc64_elf_finish_dynamic_sections is one of the last functions
3422
   called.
3423
 
3424
   PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
3425
   functions have both a function code symbol and a function descriptor
3426
   symbol.  A call to foo in a relocatable object file looks like:
3427
 
3428
   .            .text
3429
   .    x:
3430
   .            bl      .foo
3431
   .            nop
3432
 
3433
   The function definition in another object file might be:
3434
 
3435
   .            .section .opd
3436
   .    foo:    .quad   .foo
3437
   .            .quad   .TOC.@tocbase
3438
   .            .quad   0
3439
   .
3440
   .            .text
3441
   .    .foo:   blr
3442
 
3443
   When the linker resolves the call during a static link, the branch
3444
   unsurprisingly just goes to .foo and the .opd information is unused.
3445
   If the function definition is in a shared library, things are a little
3446
   different:  The call goes via a plt call stub, the opd information gets
3447
   copied to the plt, and the linker patches the nop.
3448
 
3449
   .    x:
3450
   .            bl      .foo_stub
3451
   .            ld      2,40(1)
3452
   .
3453
   .
3454
   .    .foo_stub:
3455
   .            addis   12,2,Lfoo@toc@ha        # in practice, the call stub
3456
   .            addi    12,12,Lfoo@toc@l        # is slightly optimized, but
3457
   .            std     2,40(1)                 # this is the general idea
3458
   .            ld      11,0(12)
3459
   .            ld      2,8(12)
3460
   .            mtctr   11
3461
   .            ld      11,16(12)
3462
   .            bctr
3463
   .
3464
   .            .section .plt
3465
   .    Lfoo:   reloc (R_PPC64_JMP_SLOT, foo)
3466
 
3467
   The "reloc ()" notation is supposed to indicate that the linker emits
3468
   an R_PPC64_JMP_SLOT reloc against foo.  The dynamic linker does the opd
3469
   copying.
3470
 
3471
   What are the difficulties here?  Well, firstly, the relocations
3472
   examined by the linker in check_relocs are against the function code
3473
   sym .foo, while the dynamic relocation in the plt is emitted against
3474
   the function descriptor symbol, foo.  Somewhere along the line, we need
3475
   to carefully copy dynamic link information from one symbol to the other.
3476
   Secondly, the generic part of the elf linker will make .foo a dynamic
3477
   symbol as is normal for most other backends.  We need foo dynamic
3478
   instead, at least for an application final link.  However, when
3479
   creating a shared library containing foo, we need to have both symbols
3480
   dynamic so that references to .foo are satisfied during the early
3481
   stages of linking.  Otherwise the linker might decide to pull in a
3482
   definition from some other object, eg. a static library.
3483
 
3484
   Update: As of August 2004, we support a new convention.  Function
3485
   calls may use the function descriptor symbol, ie. "bl foo".  This
3486
   behaves exactly as "bl .foo".  */
3487
 
3488
/* Of those relocs that might be copied as dynamic relocs, this function
3489
   selects those that must be copied when linking a shared library,
3490
   even when the symbol is local.  */
3491
 
3492
static int
3493
must_be_dyn_reloc (struct bfd_link_info *info,
3494
                   enum elf_ppc64_reloc_type r_type)
3495
{
3496
  switch (r_type)
3497
    {
3498
    default:
3499
      return 1;
3500
 
3501
    case R_PPC64_REL32:
3502
    case R_PPC64_REL64:
3503
    case R_PPC64_REL30:
3504
      return 0;
3505
 
3506
    case R_PPC64_TPREL16:
3507
    case R_PPC64_TPREL16_LO:
3508
    case R_PPC64_TPREL16_HI:
3509
    case R_PPC64_TPREL16_HA:
3510
    case R_PPC64_TPREL16_DS:
3511
    case R_PPC64_TPREL16_LO_DS:
3512
    case R_PPC64_TPREL16_HIGHER:
3513
    case R_PPC64_TPREL16_HIGHERA:
3514
    case R_PPC64_TPREL16_HIGHEST:
3515
    case R_PPC64_TPREL16_HIGHESTA:
3516
    case R_PPC64_TPREL64:
3517
      return !info->executable;
3518
    }
3519
}
3520
 
3521
/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
3522
   copying dynamic variables from a shared lib into an app's dynbss
3523
   section, and instead use a dynamic relocation to point into the
3524
   shared lib.  With code that gcc generates, it's vital that this be
3525
   enabled;  In the PowerPC64 ABI, the address of a function is actually
3526
   the address of a function descriptor, which resides in the .opd
3527
   section.  gcc uses the descriptor directly rather than going via the
3528
   GOT as some other ABI's do, which means that initialized function
3529
   pointers must reference the descriptor.  Thus, a function pointer
3530
   initialized to the address of a function in a shared library will
3531
   either require a copy reloc, or a dynamic reloc.  Using a copy reloc
3532
   redefines the function descriptor symbol to point to the copy.  This
3533
   presents a problem as a plt entry for that function is also
3534
   initialized from the function descriptor symbol and the copy reloc
3535
   may not be initialized first.  */
3536
#define ELIMINATE_COPY_RELOCS 1
3537
 
3538
/* Section name for stubs is the associated section name plus this
3539
   string.  */
3540
#define STUB_SUFFIX ".stub"
3541
 
3542
/* Linker stubs.
3543
   ppc_stub_long_branch:
3544
   Used when a 14 bit branch (or even a 24 bit branch) can't reach its
3545
   destination, but a 24 bit branch in a stub section will reach.
3546
   .    b       dest
3547
 
3548
   ppc_stub_plt_branch:
3549
   Similar to the above, but a 24 bit branch in the stub section won't
3550
   reach its destination.
3551
   .    addis   %r12,%r2,xxx@toc@ha
3552
   .    ld      %r11,xxx@toc@l(%r12)
3553
   .    mtctr   %r11
3554
   .    bctr
3555
 
3556
   ppc_stub_plt_call:
3557
   Used to call a function in a shared library.  If it so happens that
3558
   the plt entry referenced crosses a 64k boundary, then an extra
3559
   "addi %r12,%r12,xxx@toc@l" will be inserted before the "mtctr".
3560
   .    addis   %r12,%r2,xxx@toc@ha
3561
   .    std     %r2,40(%r1)
3562
   .    ld      %r11,xxx+0@toc@l(%r12)
3563
   .    mtctr   %r11
3564
   .    ld      %r2,xxx+8@toc@l(%r12)
3565
   .    ld      %r11,xxx+16@toc@l(%r12)
3566
   .    bctr
3567
 
3568
   ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
3569
   code to adjust the value and save r2 to support multiple toc sections.
3570
   A ppc_stub_long_branch with an r2 offset looks like:
3571
   .    std     %r2,40(%r1)
3572
   .    addis   %r2,%r2,off@ha
3573
   .    addi    %r2,%r2,off@l
3574
   .    b       dest
3575
 
3576
   A ppc_stub_plt_branch with an r2 offset looks like:
3577
   .    std     %r2,40(%r1)
3578
   .    addis   %r12,%r2,xxx@toc@ha
3579
   .    ld      %r11,xxx@toc@l(%r12)
3580
   .    addis   %r2,%r2,off@ha
3581
   .    addi    %r2,%r2,off@l
3582
   .    mtctr   %r11
3583
   .    bctr
3584
 
3585
   In cases where the "addis" instruction would add zero, the "addis" is
3586
   omitted and following instructions modified slightly in some cases.
3587
*/
3588
 
3589
enum ppc_stub_type {
3590
  ppc_stub_none,
3591
  ppc_stub_long_branch,
3592
  ppc_stub_long_branch_r2off,
3593
  ppc_stub_plt_branch,
3594
  ppc_stub_plt_branch_r2off,
3595 166 khays
  ppc_stub_plt_call,
3596
  ppc_stub_plt_call_r2save
3597 14 khays
};
3598
 
3599
struct ppc_stub_hash_entry {
3600
 
3601
  /* Base hash table entry structure.  */
3602
  struct bfd_hash_entry root;
3603
 
3604
  enum ppc_stub_type stub_type;
3605
 
3606
  /* The stub section.  */
3607
  asection *stub_sec;
3608
 
3609
  /* Offset within stub_sec of the beginning of this stub.  */
3610
  bfd_vma stub_offset;
3611
 
3612
  /* Given the symbol's value and its section we can determine its final
3613
     value when building the stubs (so the stub knows where to jump.  */
3614
  bfd_vma target_value;
3615
  asection *target_section;
3616
 
3617
  /* The symbol table entry, if any, that this was derived from.  */
3618
  struct ppc_link_hash_entry *h;
3619
  struct plt_entry *plt_ent;
3620
 
3621
  /* And the reloc addend that this was derived from.  */
3622
  bfd_vma addend;
3623
 
3624
  /* Where this stub is being called from, or, in the case of combined
3625
     stub sections, the first input section in the group.  */
3626
  asection *id_sec;
3627
};
3628
 
3629
struct ppc_branch_hash_entry {
3630
 
3631
  /* Base hash table entry structure.  */
3632
  struct bfd_hash_entry root;
3633
 
3634
  /* Offset within branch lookup table.  */
3635
  unsigned int offset;
3636
 
3637
  /* Generation marker.  */
3638
  unsigned int iter;
3639
};
3640
 
3641
struct ppc_link_hash_entry
3642
{
3643
  struct elf_link_hash_entry elf;
3644
 
3645
  union {
3646
    /* A pointer to the most recently used stub hash entry against this
3647
       symbol.  */
3648
    struct ppc_stub_hash_entry *stub_cache;
3649
 
3650
    /* A pointer to the next symbol starting with a '.'  */
3651
    struct ppc_link_hash_entry *next_dot_sym;
3652
  } u;
3653
 
3654
  /* Track dynamic relocs copied for this symbol.  */
3655
  struct elf_dyn_relocs *dyn_relocs;
3656
 
3657
  /* Link between function code and descriptor symbols.  */
3658
  struct ppc_link_hash_entry *oh;
3659
 
3660
  /* Flag function code and descriptor symbols.  */
3661
  unsigned int is_func:1;
3662
  unsigned int is_func_descriptor:1;
3663
  unsigned int fake:1;
3664
 
3665
  /* Whether global opd/toc sym has been adjusted or not.
3666
     After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
3667
     should be set for all globals defined in any opd/toc section.  */
3668
  unsigned int adjust_done:1;
3669
 
3670
  /* Set if we twiddled this symbol to weak at some stage.  */
3671
  unsigned int was_undefined:1;
3672
 
3673
  /* Contexts in which symbol is used in the GOT (or TOC).
3674
     TLS_GD .. TLS_EXPLICIT bits are or'd into the mask as the
3675
     corresponding relocs are encountered during check_relocs.
3676
     tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
3677
     indicate the corresponding GOT entry type is not needed.
3678
     tls_optimize may also set TLS_TPRELGD when a GD reloc turns into
3679
     a TPREL one.  We use a separate flag rather than setting TPREL
3680
     just for convenience in distinguishing the two cases.  */
3681
#define TLS_GD           1      /* GD reloc. */
3682
#define TLS_LD           2      /* LD reloc. */
3683
#define TLS_TPREL        4      /* TPREL reloc, => IE. */
3684
#define TLS_DTPREL       8      /* DTPREL reloc, => LD. */
3685
#define TLS_TLS         16      /* Any TLS reloc.  */
3686
#define TLS_EXPLICIT    32      /* Marks TOC section TLS relocs. */
3687
#define TLS_TPRELGD     64      /* TPREL reloc resulting from GD->IE. */
3688
#define PLT_IFUNC      128      /* STT_GNU_IFUNC.  */
3689
  unsigned char tls_mask;
3690
};
3691
 
3692
/* ppc64 ELF linker hash table.  */
3693
 
3694
struct ppc_link_hash_table
3695
{
3696
  struct elf_link_hash_table elf;
3697
 
3698
  /* The stub hash table.  */
3699
  struct bfd_hash_table stub_hash_table;
3700
 
3701
  /* Another hash table for plt_branch stubs.  */
3702
  struct bfd_hash_table branch_hash_table;
3703
 
3704 163 khays
  /* Hash table for function prologue tocsave.  */
3705
  htab_t tocsave_htab;
3706
 
3707 14 khays
  /* Linker stub bfd.  */
3708
  bfd *stub_bfd;
3709
 
3710
  /* Linker call-backs.  */
3711
  asection * (*add_stub_section) (const char *, asection *);
3712
  void (*layout_sections_again) (void);
3713
 
3714
  /* Array to keep track of which stub sections have been created, and
3715
     information on stub grouping.  */
3716
  struct map_stub {
3717
    /* This is the section to which stubs in the group will be attached.  */
3718
    asection *link_sec;
3719
    /* The stub section.  */
3720
    asection *stub_sec;
3721
    /* Along with elf_gp, specifies the TOC pointer used in this group.  */
3722
    bfd_vma toc_off;
3723
  } *stub_group;
3724
 
3725
  /* Temp used when calculating TOC pointers.  */
3726
  bfd_vma toc_curr;
3727
  bfd *toc_bfd;
3728
  asection *toc_first_sec;
3729
 
3730
  /* Highest input section id.  */
3731
  int top_id;
3732
 
3733
  /* Highest output section index.  */
3734
  int top_index;
3735
 
3736
  /* Used when adding symbols.  */
3737
  struct ppc_link_hash_entry *dot_syms;
3738
 
3739
  /* List of input sections for each output section.  */
3740
  asection **input_list;
3741
 
3742
  /* Short-cuts to get to dynamic linker sections.  */
3743
  asection *got;
3744
  asection *plt;
3745
  asection *relplt;
3746
  asection *iplt;
3747
  asection *reliplt;
3748
  asection *dynbss;
3749
  asection *relbss;
3750
  asection *glink;
3751
  asection *sfpr;
3752
  asection *brlt;
3753
  asection *relbrlt;
3754 161 khays
  asection *glink_eh_frame;
3755 14 khays
 
3756
  /* Shortcut to .__tls_get_addr and __tls_get_addr.  */
3757
  struct ppc_link_hash_entry *tls_get_addr;
3758
  struct ppc_link_hash_entry *tls_get_addr_fd;
3759
 
3760
  /* The size of reliplt used by got entry relocs.  */
3761
  bfd_size_type got_reli_size;
3762
 
3763
  /* Statistics.  */
3764 166 khays
  unsigned long stub_count[ppc_stub_plt_call_r2save];
3765 14 khays
 
3766
  /* Number of stubs against global syms.  */
3767
  unsigned long stub_globals;
3768
 
3769 166 khays
  /* Alignment of PLT call stubs.  */
3770
  unsigned int plt_stub_align:4;
3771
 
3772 161 khays
  /* Set if PLT call stubs should load r11.  */
3773
  unsigned int plt_static_chain:1;
3774
 
3775 166 khays
  /* Set if PLT call stubs need a read-read barrier.  */
3776
  unsigned int plt_thread_safe:1;
3777
 
3778 14 khays
  /* Set if we should emit symbols for stubs.  */
3779
  unsigned int emit_stub_syms:1;
3780
 
3781
  /* Set if __tls_get_addr optimization should not be done.  */
3782
  unsigned int no_tls_get_addr_opt:1;
3783
 
3784
  /* Support for multiple toc sections.  */
3785
  unsigned int do_multi_toc:1;
3786
  unsigned int multi_toc_needed:1;
3787
  unsigned int second_toc_pass:1;
3788
  unsigned int do_toc_opt:1;
3789
 
3790
  /* Set on error.  */
3791
  unsigned int stub_error:1;
3792
 
3793
  /* Temp used by ppc64_elf_process_dot_syms.  */
3794
  unsigned int twiddled_syms:1;
3795
 
3796
  /* Incremented every time we size stubs.  */
3797
  unsigned int stub_iteration;
3798
 
3799
  /* Small local sym cache.  */
3800
  struct sym_cache sym_cache;
3801
};
3802
 
3803
/* Rename some of the generic section flags to better document how they
3804
   are used here.  */
3805
 
3806
/* Nonzero if this section has TLS related relocations.  */
3807
#define has_tls_reloc sec_flg0
3808
 
3809
/* Nonzero if this section has a call to __tls_get_addr.  */
3810
#define has_tls_get_addr_call sec_flg1
3811
 
3812
/* Nonzero if this section has any toc or got relocs.  */
3813
#define has_toc_reloc sec_flg2
3814
 
3815
/* Nonzero if this section has a call to another section that uses
3816
   the toc or got.  */
3817
#define makes_toc_func_call sec_flg3
3818
 
3819
/* Recursion protection when determining above flag.  */
3820
#define call_check_in_progress sec_flg4
3821
#define call_check_done sec_flg5
3822
 
3823
/* Get the ppc64 ELF linker hash table from a link_info structure.  */
3824
 
3825
#define ppc_hash_table(p) \
3826
  (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
3827
  == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL)
3828
 
3829
#define ppc_stub_hash_lookup(table, string, create, copy) \
3830
  ((struct ppc_stub_hash_entry *) \
3831
   bfd_hash_lookup ((table), (string), (create), (copy)))
3832
 
3833
#define ppc_branch_hash_lookup(table, string, create, copy) \
3834
  ((struct ppc_branch_hash_entry *) \
3835
   bfd_hash_lookup ((table), (string), (create), (copy)))
3836
 
3837
/* Create an entry in the stub hash table.  */
3838
 
3839
static struct bfd_hash_entry *
3840
stub_hash_newfunc (struct bfd_hash_entry *entry,
3841
                   struct bfd_hash_table *table,
3842
                   const char *string)
3843
{
3844
  /* Allocate the structure if it has not already been allocated by a
3845
     subclass.  */
3846
  if (entry == NULL)
3847
    {
3848
      entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
3849
      if (entry == NULL)
3850
        return entry;
3851
    }
3852
 
3853
  /* Call the allocation method of the superclass.  */
3854
  entry = bfd_hash_newfunc (entry, table, string);
3855
  if (entry != NULL)
3856
    {
3857
      struct ppc_stub_hash_entry *eh;
3858
 
3859
      /* Initialize the local fields.  */
3860
      eh = (struct ppc_stub_hash_entry *) entry;
3861
      eh->stub_type = ppc_stub_none;
3862
      eh->stub_sec = NULL;
3863
      eh->stub_offset = 0;
3864
      eh->target_value = 0;
3865
      eh->target_section = NULL;
3866
      eh->h = NULL;
3867
      eh->id_sec = NULL;
3868
    }
3869
 
3870
  return entry;
3871
}
3872
 
3873
/* Create an entry in the branch hash table.  */
3874
 
3875
static struct bfd_hash_entry *
3876
branch_hash_newfunc (struct bfd_hash_entry *entry,
3877
                     struct bfd_hash_table *table,
3878
                     const char *string)
3879
{
3880
  /* Allocate the structure if it has not already been allocated by a
3881
     subclass.  */
3882
  if (entry == NULL)
3883
    {
3884
      entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
3885
      if (entry == NULL)
3886
        return entry;
3887
    }
3888
 
3889
  /* Call the allocation method of the superclass.  */
3890
  entry = bfd_hash_newfunc (entry, table, string);
3891
  if (entry != NULL)
3892
    {
3893
      struct ppc_branch_hash_entry *eh;
3894
 
3895
      /* Initialize the local fields.  */
3896
      eh = (struct ppc_branch_hash_entry *) entry;
3897
      eh->offset = 0;
3898
      eh->iter = 0;
3899
    }
3900
 
3901
  return entry;
3902
}
3903
 
3904
/* Create an entry in a ppc64 ELF linker hash table.  */
3905
 
3906
static struct bfd_hash_entry *
3907
link_hash_newfunc (struct bfd_hash_entry *entry,
3908
                   struct bfd_hash_table *table,
3909
                   const char *string)
3910
{
3911
  /* Allocate the structure if it has not already been allocated by a
3912
     subclass.  */
3913
  if (entry == NULL)
3914
    {
3915
      entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
3916
      if (entry == NULL)
3917
        return entry;
3918
    }
3919
 
3920
  /* Call the allocation method of the superclass.  */
3921
  entry = _bfd_elf_link_hash_newfunc (entry, table, string);
3922
  if (entry != NULL)
3923
    {
3924
      struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
3925
 
3926
      memset (&eh->u.stub_cache, 0,
3927
              (sizeof (struct ppc_link_hash_entry)
3928
               - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
3929
 
3930
      /* When making function calls, old ABI code references function entry
3931
         points (dot symbols), while new ABI code references the function
3932
         descriptor symbol.  We need to make any combination of reference and
3933
         definition work together, without breaking archive linking.
3934
 
3935
         For a defined function "foo" and an undefined call to "bar":
3936
         An old object defines "foo" and ".foo", references ".bar" (possibly
3937
         "bar" too).
3938
         A new object defines "foo" and references "bar".
3939
 
3940
         A new object thus has no problem with its undefined symbols being
3941
         satisfied by definitions in an old object.  On the other hand, the
3942
         old object won't have ".bar" satisfied by a new object.
3943
 
3944
         Keep a list of newly added dot-symbols.  */
3945
 
3946
      if (string[0] == '.')
3947
        {
3948
          struct ppc_link_hash_table *htab;
3949
 
3950
          htab = (struct ppc_link_hash_table *) table;
3951
          eh->u.next_dot_sym = htab->dot_syms;
3952
          htab->dot_syms = eh;
3953
        }
3954
    }
3955
 
3956
  return entry;
3957
}
3958
 
3959 163 khays
struct tocsave_entry {
3960
  asection *sec;
3961
  bfd_vma offset;
3962
};
3963
 
3964
static hashval_t
3965
tocsave_htab_hash (const void *p)
3966
{
3967
  const struct tocsave_entry *e = (const struct tocsave_entry *) p;
3968
  return ((bfd_vma)(intptr_t) e->sec ^ e->offset) >> 3;
3969
}
3970
 
3971
static int
3972
tocsave_htab_eq (const void *p1, const void *p2)
3973
{
3974
  const struct tocsave_entry *e1 = (const struct tocsave_entry *) p1;
3975
  const struct tocsave_entry *e2 = (const struct tocsave_entry *) p2;
3976
  return e1->sec == e2->sec && e1->offset == e2->offset;
3977
}
3978
 
3979 14 khays
/* Create a ppc64 ELF linker hash table.  */
3980
 
3981
static struct bfd_link_hash_table *
3982
ppc64_elf_link_hash_table_create (bfd *abfd)
3983
{
3984
  struct ppc_link_hash_table *htab;
3985
  bfd_size_type amt = sizeof (struct ppc_link_hash_table);
3986
 
3987
  htab = bfd_zmalloc (amt);
3988
  if (htab == NULL)
3989
    return NULL;
3990
 
3991
  if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
3992
                                      sizeof (struct ppc_link_hash_entry),
3993
                                      PPC64_ELF_DATA))
3994
    {
3995
      free (htab);
3996
      return NULL;
3997
    }
3998
 
3999
  /* Init the stub hash table too.  */
4000
  if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
4001
                            sizeof (struct ppc_stub_hash_entry)))
4002
    return NULL;
4003
 
4004
  /* And the branch hash table.  */
4005
  if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
4006
                            sizeof (struct ppc_branch_hash_entry)))
4007
    return NULL;
4008
 
4009 163 khays
  htab->tocsave_htab = htab_try_create (1024,
4010
                                        tocsave_htab_hash,
4011
                                        tocsave_htab_eq,
4012
                                        NULL);
4013
  if (htab->tocsave_htab == NULL)
4014
    return NULL;
4015
 
4016 14 khays
  /* Initializing two fields of the union is just cosmetic.  We really
4017
     only care about glist, but when compiled on a 32-bit host the
4018
     bfd_vma fields are larger.  Setting the bfd_vma to zero makes
4019
     debugger inspection of these fields look nicer.  */
4020
  htab->elf.init_got_refcount.refcount = 0;
4021
  htab->elf.init_got_refcount.glist = NULL;
4022
  htab->elf.init_plt_refcount.refcount = 0;
4023
  htab->elf.init_plt_refcount.glist = NULL;
4024
  htab->elf.init_got_offset.offset = 0;
4025
  htab->elf.init_got_offset.glist = NULL;
4026
  htab->elf.init_plt_offset.offset = 0;
4027
  htab->elf.init_plt_offset.glist = NULL;
4028
 
4029
  return &htab->elf.root;
4030
}
4031
 
4032
/* Free the derived linker hash table.  */
4033
 
4034
static void
4035
ppc64_elf_link_hash_table_free (struct bfd_link_hash_table *hash)
4036
{
4037 163 khays
  struct ppc_link_hash_table *htab = (struct ppc_link_hash_table *) hash;
4038 14 khays
 
4039 163 khays
  bfd_hash_table_free (&htab->stub_hash_table);
4040
  bfd_hash_table_free (&htab->branch_hash_table);
4041
  if (htab->tocsave_htab)
4042
    htab_delete (htab->tocsave_htab);
4043 14 khays
  _bfd_generic_link_hash_table_free (hash);
4044
}
4045
 
4046
/* Satisfy the ELF linker by filling in some fields in our fake bfd.  */
4047
 
4048
void
4049
ppc64_elf_init_stub_bfd (bfd *abfd, struct bfd_link_info *info)
4050
{
4051
  struct ppc_link_hash_table *htab;
4052
 
4053
  elf_elfheader (abfd)->e_ident[EI_CLASS] = ELFCLASS64;
4054
 
4055
/* Always hook our dynamic sections into the first bfd, which is the
4056
   linker created stub bfd.  This ensures that the GOT header is at
4057
   the start of the output TOC section.  */
4058
  htab = ppc_hash_table (info);
4059
  if (htab == NULL)
4060
    return;
4061
  htab->stub_bfd = abfd;
4062
  htab->elf.dynobj = abfd;
4063
}
4064
 
4065
/* Build a name for an entry in the stub hash table.  */
4066
 
4067
static char *
4068
ppc_stub_name (const asection *input_section,
4069
               const asection *sym_sec,
4070
               const struct ppc_link_hash_entry *h,
4071
               const Elf_Internal_Rela *rel)
4072
{
4073
  char *stub_name;
4074
  bfd_size_type len;
4075
 
4076
  /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
4077
     offsets from a sym as a branch target?  In fact, we could
4078
     probably assume the addend is always zero.  */
4079
  BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
4080
 
4081
  if (h)
4082
    {
4083
      len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
4084
      stub_name = bfd_malloc (len);
4085
      if (stub_name == NULL)
4086
        return stub_name;
4087
 
4088
      sprintf (stub_name, "%08x.%s+%x",
4089
               input_section->id & 0xffffffff,
4090
               h->elf.root.root.string,
4091
               (int) rel->r_addend & 0xffffffff);
4092
    }
4093
  else
4094
    {
4095
      len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
4096
      stub_name = bfd_malloc (len);
4097
      if (stub_name == NULL)
4098
        return stub_name;
4099
 
4100
      sprintf (stub_name, "%08x.%x:%x+%x",
4101
               input_section->id & 0xffffffff,
4102
               sym_sec->id & 0xffffffff,
4103
               (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
4104
               (int) rel->r_addend & 0xffffffff);
4105
    }
4106
  if (stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
4107
    stub_name[len - 2] = 0;
4108
  return stub_name;
4109
}
4110
 
4111
/* Look up an entry in the stub hash.  Stub entries are cached because
4112
   creating the stub name takes a bit of time.  */
4113
 
4114
static struct ppc_stub_hash_entry *
4115
ppc_get_stub_entry (const asection *input_section,
4116
                    const asection *sym_sec,
4117
                    struct ppc_link_hash_entry *h,
4118
                    const Elf_Internal_Rela *rel,
4119
                    struct ppc_link_hash_table *htab)
4120
{
4121
  struct ppc_stub_hash_entry *stub_entry;
4122
  const asection *id_sec;
4123
 
4124
  /* If this input section is part of a group of sections sharing one
4125
     stub section, then use the id of the first section in the group.
4126
     Stub names need to include a section id, as there may well be
4127
     more than one stub used to reach say, printf, and we need to
4128
     distinguish between them.  */
4129
  id_sec = htab->stub_group[input_section->id].link_sec;
4130
 
4131
  if (h != NULL && h->u.stub_cache != NULL
4132
      && h->u.stub_cache->h == h
4133
      && h->u.stub_cache->id_sec == id_sec)
4134
    {
4135
      stub_entry = h->u.stub_cache;
4136
    }
4137
  else
4138
    {
4139
      char *stub_name;
4140
 
4141
      stub_name = ppc_stub_name (id_sec, sym_sec, h, rel);
4142
      if (stub_name == NULL)
4143
        return NULL;
4144
 
4145
      stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
4146
                                         stub_name, FALSE, FALSE);
4147
      if (h != NULL)
4148
        h->u.stub_cache = stub_entry;
4149
 
4150
      free (stub_name);
4151
    }
4152
 
4153
  return stub_entry;
4154
}
4155
 
4156
/* Add a new stub entry to the stub hash.  Not all fields of the new
4157
   stub entry are initialised.  */
4158
 
4159
static struct ppc_stub_hash_entry *
4160
ppc_add_stub (const char *stub_name,
4161
              asection *section,
4162
              struct bfd_link_info *info)
4163
{
4164
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
4165
  asection *link_sec;
4166
  asection *stub_sec;
4167
  struct ppc_stub_hash_entry *stub_entry;
4168
 
4169
  link_sec = htab->stub_group[section->id].link_sec;
4170
  stub_sec = htab->stub_group[section->id].stub_sec;
4171
  if (stub_sec == NULL)
4172
    {
4173
      stub_sec = htab->stub_group[link_sec->id].stub_sec;
4174
      if (stub_sec == NULL)
4175
        {
4176
          size_t namelen;
4177
          bfd_size_type len;
4178
          char *s_name;
4179
 
4180
          namelen = strlen (link_sec->name);
4181
          len = namelen + sizeof (STUB_SUFFIX);
4182
          s_name = bfd_alloc (htab->stub_bfd, len);
4183
          if (s_name == NULL)
4184
            return NULL;
4185
 
4186
          memcpy (s_name, link_sec->name, namelen);
4187
          memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
4188
          stub_sec = (*htab->add_stub_section) (s_name, link_sec);
4189
          if (stub_sec == NULL)
4190
            return NULL;
4191
          htab->stub_group[link_sec->id].stub_sec = stub_sec;
4192
        }
4193
      htab->stub_group[section->id].stub_sec = stub_sec;
4194
    }
4195
 
4196
  /* Enter this entry into the linker stub hash table.  */
4197
  stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
4198
                                     TRUE, FALSE);
4199
  if (stub_entry == NULL)
4200
    {
4201 161 khays
      info->callbacks->einfo (_("%P: %B: cannot create stub entry %s\n"),
4202 14 khays
                              section->owner, stub_name);
4203
      return NULL;
4204
    }
4205
 
4206
  stub_entry->stub_sec = stub_sec;
4207
  stub_entry->stub_offset = 0;
4208
  stub_entry->id_sec = link_sec;
4209
  return stub_entry;
4210
}
4211
 
4212
/* Create sections for linker generated code.  */
4213
 
4214
static bfd_boolean
4215
create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
4216
{
4217
  struct ppc_link_hash_table *htab;
4218
  flagword flags;
4219
 
4220
  htab = ppc_hash_table (info);
4221
  if (htab == NULL)
4222
    return FALSE;
4223
 
4224
  /* Create .sfpr for code to save and restore fp regs.  */
4225
  flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
4226
           | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4227
  htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
4228
                                                   flags);
4229
  if (htab->sfpr == NULL
4230
      || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
4231
    return FALSE;
4232
 
4233
  /* Create .glink for lazy dynamic linking support.  */
4234
  htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
4235
                                                    flags);
4236
  if (htab->glink == NULL
4237
      || ! bfd_set_section_alignment (dynobj, htab->glink, 3))
4238
    return FALSE;
4239
 
4240 161 khays
  if (!info->no_ld_generated_unwind_info)
4241
    {
4242
      flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
4243
               | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4244
      htab->glink_eh_frame = bfd_make_section_anyway_with_flags (dynobj,
4245
                                                                 ".eh_frame",
4246
                                                                 flags);
4247
      if (htab->glink_eh_frame == NULL
4248
          || !bfd_set_section_alignment (abfd, htab->glink_eh_frame, 2))
4249
        return FALSE;
4250
    }
4251
 
4252 14 khays
  flags = SEC_ALLOC | SEC_LINKER_CREATED;
4253
  htab->iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags);
4254
  if (htab->iplt == NULL
4255
      || ! bfd_set_section_alignment (dynobj, htab->iplt, 3))
4256
    return FALSE;
4257
 
4258
  flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4259
           | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4260
  htab->reliplt = bfd_make_section_anyway_with_flags (dynobj,
4261
                                                      ".rela.iplt",
4262
                                                      flags);
4263
  if (htab->reliplt == NULL
4264
      || ! bfd_set_section_alignment (dynobj, htab->reliplt, 3))
4265
    return FALSE;
4266
 
4267
  /* Create branch lookup table for plt_branch stubs.  */
4268
  flags = (SEC_ALLOC | SEC_LOAD
4269
           | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4270
  htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
4271
                                                   flags);
4272
  if (htab->brlt == NULL
4273
      || ! bfd_set_section_alignment (dynobj, htab->brlt, 3))
4274
    return FALSE;
4275
 
4276
  if (!info->shared)
4277
    return TRUE;
4278
 
4279
  flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4280
           | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4281
  htab->relbrlt = bfd_make_section_anyway_with_flags (dynobj,
4282
                                                      ".rela.branch_lt",
4283
                                                      flags);
4284
  if (htab->relbrlt == NULL
4285
      || ! bfd_set_section_alignment (dynobj, htab->relbrlt, 3))
4286
    return FALSE;
4287
 
4288
  return TRUE;
4289
}
4290
 
4291
/* Create .got and .rela.got sections in ABFD, and .got in dynobj if
4292
   not already done.  */
4293
 
4294
static bfd_boolean
4295
create_got_section (bfd *abfd, struct bfd_link_info *info)
4296
{
4297
  asection *got, *relgot;
4298
  flagword flags;
4299
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
4300
 
4301
  if (!is_ppc64_elf (abfd))
4302
    return FALSE;
4303
  if (htab == NULL)
4304
    return FALSE;
4305
 
4306
  if (!htab->got)
4307
    {
4308
      if (! _bfd_elf_create_got_section (htab->elf.dynobj, info))
4309
        return FALSE;
4310
 
4311
      htab->got = bfd_get_section_by_name (htab->elf.dynobj, ".got");
4312
      if (!htab->got)
4313
        abort ();
4314
    }
4315
 
4316
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4317
           | SEC_LINKER_CREATED);
4318
 
4319
  got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
4320
  if (!got
4321
      || !bfd_set_section_alignment (abfd, got, 3))
4322
    return FALSE;
4323
 
4324
  relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
4325
                                               flags | SEC_READONLY);
4326
  if (!relgot
4327
      || ! bfd_set_section_alignment (abfd, relgot, 3))
4328
    return FALSE;
4329
 
4330
  ppc64_elf_tdata (abfd)->got = got;
4331
  ppc64_elf_tdata (abfd)->relgot = relgot;
4332
  return TRUE;
4333
}
4334
 
4335
/* Create the dynamic sections, and set up shortcuts.  */
4336
 
4337
static bfd_boolean
4338
ppc64_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
4339
{
4340
  struct ppc_link_hash_table *htab;
4341
 
4342
  if (!_bfd_elf_create_dynamic_sections (dynobj, info))
4343
    return FALSE;
4344
 
4345
  htab = ppc_hash_table (info);
4346
  if (htab == NULL)
4347
    return FALSE;
4348
 
4349
  if (!htab->got)
4350
    htab->got = bfd_get_section_by_name (dynobj, ".got");
4351
  htab->plt = bfd_get_section_by_name (dynobj, ".plt");
4352
  htab->relplt = bfd_get_section_by_name (dynobj, ".rela.plt");
4353
  htab->dynbss = bfd_get_section_by_name (dynobj, ".dynbss");
4354
  if (!info->shared)
4355
    htab->relbss = bfd_get_section_by_name (dynobj, ".rela.bss");
4356
 
4357
  if (!htab->got || !htab->plt || !htab->relplt || !htab->dynbss
4358
      || (!info->shared && !htab->relbss))
4359
    abort ();
4360
 
4361
  return TRUE;
4362
}
4363
 
4364
/* Follow indirect and warning symbol links.  */
4365
 
4366
static inline struct bfd_link_hash_entry *
4367
follow_link (struct bfd_link_hash_entry *h)
4368
{
4369
  while (h->type == bfd_link_hash_indirect
4370
         || h->type == bfd_link_hash_warning)
4371
    h = h->u.i.link;
4372
  return h;
4373
}
4374
 
4375
static inline struct elf_link_hash_entry *
4376
elf_follow_link (struct elf_link_hash_entry *h)
4377
{
4378
  return (struct elf_link_hash_entry *) follow_link (&h->root);
4379
}
4380
 
4381
static inline struct ppc_link_hash_entry *
4382
ppc_follow_link (struct ppc_link_hash_entry *h)
4383
{
4384
  return (struct ppc_link_hash_entry *) follow_link (&h->elf.root);
4385
}
4386
 
4387
/* Merge PLT info on FROM with that on TO.  */
4388
 
4389
static void
4390
move_plt_plist (struct ppc_link_hash_entry *from,
4391
                struct ppc_link_hash_entry *to)
4392
{
4393
  if (from->elf.plt.plist != NULL)
4394
    {
4395
      if (to->elf.plt.plist != NULL)
4396
        {
4397
          struct plt_entry **entp;
4398
          struct plt_entry *ent;
4399
 
4400
          for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
4401
            {
4402
              struct plt_entry *dent;
4403
 
4404
              for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
4405
                if (dent->addend == ent->addend)
4406
                  {
4407
                    dent->plt.refcount += ent->plt.refcount;
4408
                    *entp = ent->next;
4409
                    break;
4410
                  }
4411
              if (dent == NULL)
4412
                entp = &ent->next;
4413
            }
4414
          *entp = to->elf.plt.plist;
4415
        }
4416
 
4417
      to->elf.plt.plist = from->elf.plt.plist;
4418
      from->elf.plt.plist = NULL;
4419
    }
4420
}
4421
 
4422
/* Copy the extra info we tack onto an elf_link_hash_entry.  */
4423
 
4424
static void
4425
ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
4426
                                struct elf_link_hash_entry *dir,
4427
                                struct elf_link_hash_entry *ind)
4428
{
4429
  struct ppc_link_hash_entry *edir, *eind;
4430
 
4431
  edir = (struct ppc_link_hash_entry *) dir;
4432
  eind = (struct ppc_link_hash_entry *) ind;
4433
 
4434 161 khays
  edir->is_func |= eind->is_func;
4435
  edir->is_func_descriptor |= eind->is_func_descriptor;
4436
  edir->tls_mask |= eind->tls_mask;
4437
  if (eind->oh != NULL)
4438
    edir->oh = ppc_follow_link (eind->oh);
4439
 
4440
  /* If called to transfer flags for a weakdef during processing
4441
     of elf_adjust_dynamic_symbol, don't copy NON_GOT_REF.
4442
     We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
4443
  if (!(ELIMINATE_COPY_RELOCS
4444
        && eind->elf.root.type != bfd_link_hash_indirect
4445
        && edir->elf.dynamic_adjusted))
4446
    edir->elf.non_got_ref |= eind->elf.non_got_ref;
4447
 
4448
  edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
4449
  edir->elf.ref_regular |= eind->elf.ref_regular;
4450
  edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4451
  edir->elf.needs_plt |= eind->elf.needs_plt;
4452
 
4453 14 khays
  /* Copy over any dynamic relocs we may have on the indirect sym.  */
4454
  if (eind->dyn_relocs != NULL)
4455
    {
4456
      if (edir->dyn_relocs != NULL)
4457
        {
4458
          struct elf_dyn_relocs **pp;
4459
          struct elf_dyn_relocs *p;
4460
 
4461
          /* Add reloc counts against the indirect sym to the direct sym
4462
             list.  Merge any entries against the same section.  */
4463
          for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
4464
            {
4465
              struct elf_dyn_relocs *q;
4466
 
4467
              for (q = edir->dyn_relocs; q != NULL; q = q->next)
4468
                if (q->sec == p->sec)
4469
                  {
4470
                    q->pc_count += p->pc_count;
4471
                    q->count += p->count;
4472
                    *pp = p->next;
4473
                    break;
4474
                  }
4475
              if (q == NULL)
4476
                pp = &p->next;
4477
            }
4478
          *pp = edir->dyn_relocs;
4479
        }
4480
 
4481
      edir->dyn_relocs = eind->dyn_relocs;
4482
      eind->dyn_relocs = NULL;
4483
    }
4484
 
4485 166 khays
  /* If we were called to copy over info for a weak sym, that's all.
4486
     You might think dyn_relocs need not be copied over;  After all,
4487
     both syms will be dynamic or both non-dynamic so we're just
4488
     moving reloc accounting around.  However, ELIMINATE_COPY_RELOCS
4489
     code in ppc64_elf_adjust_dynamic_symbol needs to check for
4490
     dyn_relocs in read-only sections, and it does so on what is the
4491
     DIR sym here.  */
4492
  if (eind->elf.root.type != bfd_link_hash_indirect)
4493
    return;
4494
 
4495 14 khays
  /* Copy over got entries that we may have already seen to the
4496
     symbol which just became indirect.  */
4497
  if (eind->elf.got.glist != NULL)
4498
    {
4499
      if (edir->elf.got.glist != NULL)
4500
        {
4501
          struct got_entry **entp;
4502
          struct got_entry *ent;
4503
 
4504
          for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
4505
            {
4506
              struct got_entry *dent;
4507
 
4508
              for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
4509
                if (dent->addend == ent->addend
4510
                    && dent->owner == ent->owner
4511
                    && dent->tls_type == ent->tls_type)
4512
                  {
4513
                    dent->got.refcount += ent->got.refcount;
4514
                    *entp = ent->next;
4515
                    break;
4516
                  }
4517
              if (dent == NULL)
4518
                entp = &ent->next;
4519
            }
4520
          *entp = edir->elf.got.glist;
4521
        }
4522
 
4523
      edir->elf.got.glist = eind->elf.got.glist;
4524
      eind->elf.got.glist = NULL;
4525
    }
4526
 
4527
  /* And plt entries.  */
4528
  move_plt_plist (eind, edir);
4529
 
4530
  if (eind->elf.dynindx != -1)
4531
    {
4532
      if (edir->elf.dynindx != -1)
4533
        _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
4534
                                edir->elf.dynstr_index);
4535
      edir->elf.dynindx = eind->elf.dynindx;
4536
      edir->elf.dynstr_index = eind->elf.dynstr_index;
4537
      eind->elf.dynindx = -1;
4538
      eind->elf.dynstr_index = 0;
4539
    }
4540
}
4541
 
4542
/* Find the function descriptor hash entry from the given function code
4543
   hash entry FH.  Link the entries via their OH fields.  */
4544
 
4545
static struct ppc_link_hash_entry *
4546
lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
4547
{
4548
  struct ppc_link_hash_entry *fdh = fh->oh;
4549
 
4550
  if (fdh == NULL)
4551
    {
4552
      const char *fd_name = fh->elf.root.root.string + 1;
4553
 
4554
      fdh = (struct ppc_link_hash_entry *)
4555
        elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
4556
      if (fdh == NULL)
4557
        return fdh;
4558
 
4559
      fdh->is_func_descriptor = 1;
4560
      fdh->oh = fh;
4561
      fh->is_func = 1;
4562
      fh->oh = fdh;
4563
    }
4564
 
4565
  return ppc_follow_link (fdh);
4566
}
4567
 
4568
/* Make a fake function descriptor sym for the code sym FH.  */
4569
 
4570
static struct ppc_link_hash_entry *
4571
make_fdh (struct bfd_link_info *info,
4572
          struct ppc_link_hash_entry *fh)
4573
{
4574
  bfd *abfd;
4575
  asymbol *newsym;
4576
  struct bfd_link_hash_entry *bh;
4577
  struct ppc_link_hash_entry *fdh;
4578
 
4579
  abfd = fh->elf.root.u.undef.abfd;
4580
  newsym = bfd_make_empty_symbol (abfd);
4581
  newsym->name = fh->elf.root.root.string + 1;
4582
  newsym->section = bfd_und_section_ptr;
4583
  newsym->value = 0;
4584
  newsym->flags = BSF_WEAK;
4585
 
4586
  bh = NULL;
4587
  if (!_bfd_generic_link_add_one_symbol (info, abfd, newsym->name,
4588
                                         newsym->flags, newsym->section,
4589
                                         newsym->value, NULL, FALSE, FALSE,
4590
                                         &bh))
4591
    return NULL;
4592
 
4593
  fdh = (struct ppc_link_hash_entry *) bh;
4594
  fdh->elf.non_elf = 0;
4595
  fdh->fake = 1;
4596
  fdh->is_func_descriptor = 1;
4597
  fdh->oh = fh;
4598
  fh->is_func = 1;
4599
  fh->oh = fdh;
4600
  return fdh;
4601
}
4602
 
4603
/* Fix function descriptor symbols defined in .opd sections to be
4604
   function type.  */
4605
 
4606
static bfd_boolean
4607
ppc64_elf_add_symbol_hook (bfd *ibfd,
4608
                           struct bfd_link_info *info,
4609
                           Elf_Internal_Sym *isym,
4610
                           const char **name ATTRIBUTE_UNUSED,
4611
                           flagword *flags ATTRIBUTE_UNUSED,
4612
                           asection **sec,
4613
                           bfd_vma *value ATTRIBUTE_UNUSED)
4614
{
4615
  if ((ibfd->flags & DYNAMIC) == 0
4616
      && ELF_ST_BIND (isym->st_info) == STB_GNU_UNIQUE)
4617
    elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
4618
 
4619
  if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
4620
    {
4621
      if ((ibfd->flags & DYNAMIC) == 0)
4622
        elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
4623
    }
4624
  else if (ELF_ST_TYPE (isym->st_info) == STT_FUNC)
4625
    ;
4626
  else if (*sec != NULL
4627
           && strcmp ((*sec)->name, ".opd") == 0)
4628
    isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
4629
 
4630
  return TRUE;
4631
}
4632
 
4633
/* This function makes an old ABI object reference to ".bar" cause the
4634
   inclusion of a new ABI object archive that defines "bar".
4635
   NAME is a symbol defined in an archive.  Return a symbol in the hash
4636
   table that might be satisfied by the archive symbols.  */
4637
 
4638
static struct elf_link_hash_entry *
4639
ppc64_elf_archive_symbol_lookup (bfd *abfd,
4640
                                 struct bfd_link_info *info,
4641
                                 const char *name)
4642
{
4643
  struct elf_link_hash_entry *h;
4644
  char *dot_name;
4645
  size_t len;
4646
 
4647
  h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
4648
  if (h != NULL
4649
      /* Don't return this sym if it is a fake function descriptor
4650
         created by add_symbol_adjust.  */
4651
      && !(h->root.type == bfd_link_hash_undefweak
4652
           && ((struct ppc_link_hash_entry *) h)->fake))
4653
    return h;
4654
 
4655
  if (name[0] == '.')
4656
    return h;
4657
 
4658
  len = strlen (name);
4659
  dot_name = bfd_alloc (abfd, len + 2);
4660
  if (dot_name == NULL)
4661
    return (struct elf_link_hash_entry *) 0 - 1;
4662
  dot_name[0] = '.';
4663
  memcpy (dot_name + 1, name, len + 1);
4664
  h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
4665
  bfd_release (abfd, dot_name);
4666
  return h;
4667
}
4668
 
4669
/* This function satisfies all old ABI object references to ".bar" if a
4670
   new ABI object defines "bar".  Well, at least, undefined dot symbols
4671
   are made weak.  This stops later archive searches from including an
4672
   object if we already have a function descriptor definition.  It also
4673
   prevents the linker complaining about undefined symbols.
4674
   We also check and correct mismatched symbol visibility here.  The
4675
   most restrictive visibility of the function descriptor and the
4676
   function entry symbol is used.  */
4677
 
4678
static bfd_boolean
4679
add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
4680
{
4681
  struct ppc_link_hash_table *htab;
4682
  struct ppc_link_hash_entry *fdh;
4683
 
4684
  if (eh->elf.root.type == bfd_link_hash_indirect)
4685
    return TRUE;
4686
 
4687
  if (eh->elf.root.type == bfd_link_hash_warning)
4688
    eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
4689
 
4690
  if (eh->elf.root.root.string[0] != '.')
4691
    abort ();
4692
 
4693
  htab = ppc_hash_table (info);
4694
  if (htab == NULL)
4695
    return FALSE;
4696
 
4697
  fdh = lookup_fdh (eh, htab);
4698
  if (fdh == NULL)
4699
    {
4700
      if (!info->relocatable
4701
          && (eh->elf.root.type == bfd_link_hash_undefined
4702
              || eh->elf.root.type == bfd_link_hash_undefweak)
4703
          && eh->elf.ref_regular)
4704
        {
4705
          /* Make an undefweak function descriptor sym, which is enough to
4706
             pull in an --as-needed shared lib, but won't cause link
4707
             errors.  Archives are handled elsewhere.  */
4708
          fdh = make_fdh (info, eh);
4709
          if (fdh == NULL)
4710
            return FALSE;
4711
          fdh->elf.ref_regular = 1;
4712
        }
4713
    }
4714
  else
4715
    {
4716
      unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
4717
      unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
4718
      if (entry_vis < descr_vis)
4719
        fdh->elf.other += entry_vis - descr_vis;
4720
      else if (entry_vis > descr_vis)
4721
        eh->elf.other += descr_vis - entry_vis;
4722
 
4723
      if ((fdh->elf.root.type == bfd_link_hash_defined
4724
           || fdh->elf.root.type == bfd_link_hash_defweak)
4725
          && eh->elf.root.type == bfd_link_hash_undefined)
4726
        {
4727
          eh->elf.root.type = bfd_link_hash_undefweak;
4728
          eh->was_undefined = 1;
4729
          htab->twiddled_syms = 1;
4730
        }
4731
    }
4732
 
4733
  return TRUE;
4734
}
4735
 
4736
/* Process list of dot-symbols we made in link_hash_newfunc.  */
4737
 
4738
static bfd_boolean
4739
ppc64_elf_process_dot_syms (bfd *ibfd, struct bfd_link_info *info)
4740
{
4741
  struct ppc_link_hash_table *htab;
4742
  struct ppc_link_hash_entry **p, *eh;
4743
 
4744
  if (!is_ppc64_elf (info->output_bfd))
4745
    return TRUE;
4746
  htab = ppc_hash_table (info);
4747
  if (htab == NULL)
4748
    return FALSE;
4749
 
4750
  if (is_ppc64_elf (ibfd))
4751
    {
4752
      p = &htab->dot_syms;
4753
      while ((eh = *p) != NULL)
4754
        {
4755
          *p = NULL;
4756
          if (!add_symbol_adjust (eh, info))
4757
            return FALSE;
4758
          p = &eh->u.next_dot_sym;
4759
        }
4760
    }
4761
 
4762
  /* Clear the list for non-ppc64 input files.  */
4763
  p = &htab->dot_syms;
4764
  while ((eh = *p) != NULL)
4765
    {
4766
      *p = NULL;
4767
      p = &eh->u.next_dot_sym;
4768
    }
4769
 
4770
  /* We need to fix the undefs list for any syms we have twiddled to
4771
     undef_weak.  */
4772
  if (htab->twiddled_syms)
4773
    {
4774
      bfd_link_repair_undef_list (&htab->elf.root);
4775
      htab->twiddled_syms = 0;
4776
    }
4777
  return TRUE;
4778
}
4779
 
4780
/* Undo hash table changes when an --as-needed input file is determined
4781
   not to be needed.  */
4782
 
4783
static bfd_boolean
4784
ppc64_elf_as_needed_cleanup (bfd *ibfd ATTRIBUTE_UNUSED,
4785
                             struct bfd_link_info *info)
4786
{
4787
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
4788
 
4789
  if (htab == NULL)
4790
    return FALSE;
4791
 
4792
  htab->dot_syms = NULL;
4793
  return TRUE;
4794
}
4795
 
4796
/* If --just-symbols against a final linked binary, then assume we need
4797
   toc adjusting stubs when calling functions defined there.  */
4798
 
4799
static void
4800
ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
4801
{
4802
  if ((sec->flags & SEC_CODE) != 0
4803
      && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0
4804
      && is_ppc64_elf (sec->owner))
4805
    {
4806
      asection *got = bfd_get_section_by_name (sec->owner, ".got");
4807
      if (got != NULL
4808
          && got->size >= elf_backend_got_header_size
4809
          && bfd_get_section_by_name (sec->owner, ".opd") != NULL)
4810
        sec->has_toc_reloc = 1;
4811
    }
4812
  _bfd_elf_link_just_syms (sec, info);
4813
}
4814
 
4815
static struct plt_entry **
4816
update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
4817
                       unsigned long r_symndx, bfd_vma r_addend, int tls_type)
4818
{
4819
  struct got_entry **local_got_ents = elf_local_got_ents (abfd);
4820
  struct plt_entry **local_plt;
4821
  unsigned char *local_got_tls_masks;
4822
 
4823
  if (local_got_ents == NULL)
4824
    {
4825
      bfd_size_type size = symtab_hdr->sh_info;
4826
 
4827
      size *= (sizeof (*local_got_ents)
4828
               + sizeof (*local_plt)
4829
               + sizeof (*local_got_tls_masks));
4830
      local_got_ents = bfd_zalloc (abfd, size);
4831
      if (local_got_ents == NULL)
4832
        return NULL;
4833
      elf_local_got_ents (abfd) = local_got_ents;
4834
    }
4835
 
4836
  if ((tls_type & (PLT_IFUNC | TLS_EXPLICIT)) == 0)
4837
    {
4838
      struct got_entry *ent;
4839
 
4840
      for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
4841
        if (ent->addend == r_addend
4842
            && ent->owner == abfd
4843
            && ent->tls_type == tls_type)
4844
          break;
4845
      if (ent == NULL)
4846
        {
4847
          bfd_size_type amt = sizeof (*ent);
4848
          ent = bfd_alloc (abfd, amt);
4849
          if (ent == NULL)
4850
            return FALSE;
4851
          ent->next = local_got_ents[r_symndx];
4852
          ent->addend = r_addend;
4853
          ent->owner = abfd;
4854
          ent->tls_type = tls_type;
4855
          ent->is_indirect = FALSE;
4856
          ent->got.refcount = 0;
4857
          local_got_ents[r_symndx] = ent;
4858
        }
4859
      ent->got.refcount += 1;
4860
    }
4861
 
4862
  local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info);
4863
  local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
4864
  local_got_tls_masks[r_symndx] |= tls_type;
4865
 
4866
  return local_plt + r_symndx;
4867
}
4868
 
4869
static bfd_boolean
4870
update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend)
4871
{
4872
  struct plt_entry *ent;
4873
 
4874
  for (ent = *plist; ent != NULL; ent = ent->next)
4875
    if (ent->addend == addend)
4876
      break;
4877
  if (ent == NULL)
4878
    {
4879
      bfd_size_type amt = sizeof (*ent);
4880
      ent = bfd_alloc (abfd, amt);
4881
      if (ent == NULL)
4882
        return FALSE;
4883
      ent->next = *plist;
4884
      ent->addend = addend;
4885
      ent->plt.refcount = 0;
4886
      *plist = ent;
4887
    }
4888
  ent->plt.refcount += 1;
4889
  return TRUE;
4890
}
4891
 
4892
static bfd_boolean
4893
is_branch_reloc (enum elf_ppc64_reloc_type r_type)
4894
{
4895
  return (r_type == R_PPC64_REL24
4896
          || r_type == R_PPC64_REL14
4897
          || r_type == R_PPC64_REL14_BRTAKEN
4898
          || r_type == R_PPC64_REL14_BRNTAKEN
4899
          || r_type == R_PPC64_ADDR24
4900
          || r_type == R_PPC64_ADDR14
4901
          || r_type == R_PPC64_ADDR14_BRTAKEN
4902
          || r_type == R_PPC64_ADDR14_BRNTAKEN);
4903
}
4904
 
4905
/* Look through the relocs for a section during the first phase, and
4906
   calculate needed space in the global offset table, procedure
4907
   linkage table, and dynamic reloc sections.  */
4908
 
4909
static bfd_boolean
4910
ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
4911
                        asection *sec, const Elf_Internal_Rela *relocs)
4912
{
4913
  struct ppc_link_hash_table *htab;
4914
  Elf_Internal_Shdr *symtab_hdr;
4915
  struct elf_link_hash_entry **sym_hashes;
4916
  const Elf_Internal_Rela *rel;
4917
  const Elf_Internal_Rela *rel_end;
4918
  asection *sreloc;
4919
  asection **opd_sym_map;
4920
  struct elf_link_hash_entry *tga, *dottga;
4921
 
4922
  if (info->relocatable)
4923
    return TRUE;
4924
 
4925
  /* Don't do anything special with non-loaded, non-alloced sections.
4926
     In particular, any relocs in such sections should not affect GOT
4927
     and PLT reference counting (ie. we don't allow them to create GOT
4928
     or PLT entries), there's no possibility or desire to optimize TLS
4929
     relocs, and there's not much point in propagating relocs to shared
4930
     libs that the dynamic linker won't relocate.  */
4931
  if ((sec->flags & SEC_ALLOC) == 0)
4932
    return TRUE;
4933
 
4934
  BFD_ASSERT (is_ppc64_elf (abfd));
4935
 
4936
  htab = ppc_hash_table (info);
4937
  if (htab == NULL)
4938
    return FALSE;
4939
 
4940
  tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
4941
                              FALSE, FALSE, TRUE);
4942
  dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
4943
                                 FALSE, FALSE, TRUE);
4944
  symtab_hdr = &elf_symtab_hdr (abfd);
4945
  sym_hashes = elf_sym_hashes (abfd);
4946
  sreloc = NULL;
4947
  opd_sym_map = NULL;
4948
  if (strcmp (sec->name, ".opd") == 0)
4949
    {
4950
      /* Garbage collection needs some extra help with .opd sections.
4951
         We don't want to necessarily keep everything referenced by
4952
         relocs in .opd, as that would keep all functions.  Instead,
4953
         if we reference an .opd symbol (a function descriptor), we
4954
         want to keep the function code symbol's section.  This is
4955
         easy for global symbols, but for local syms we need to keep
4956
         information about the associated function section.  */
4957
      bfd_size_type amt;
4958
 
4959
      amt = sec->size * sizeof (*opd_sym_map) / 8;
4960
      opd_sym_map = bfd_zalloc (abfd, amt);
4961
      if (opd_sym_map == NULL)
4962
        return FALSE;
4963
      ppc64_elf_section_data (sec)->u.opd.func_sec = opd_sym_map;
4964
      BFD_ASSERT (ppc64_elf_section_data (sec)->sec_type == sec_normal);
4965
      ppc64_elf_section_data (sec)->sec_type = sec_opd;
4966
    }
4967
 
4968
  if (htab->sfpr == NULL
4969
      && !create_linkage_sections (htab->elf.dynobj, info))
4970
    return FALSE;
4971
 
4972
  rel_end = relocs + sec->reloc_count;
4973
  for (rel = relocs; rel < rel_end; rel++)
4974
    {
4975
      unsigned long r_symndx;
4976
      struct elf_link_hash_entry *h;
4977
      enum elf_ppc64_reloc_type r_type;
4978
      int tls_type;
4979
      struct _ppc64_elf_section_data *ppc64_sec;
4980
      struct plt_entry **ifunc;
4981
 
4982
      r_symndx = ELF64_R_SYM (rel->r_info);
4983
      if (r_symndx < symtab_hdr->sh_info)
4984
        h = NULL;
4985
      else
4986
        {
4987
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4988
          h = elf_follow_link (h);
4989
        }
4990
 
4991
      tls_type = 0;
4992
      ifunc = NULL;
4993
      if (h != NULL)
4994
        {
4995
          if (h->type == STT_GNU_IFUNC)
4996
            {
4997
              h->needs_plt = 1;
4998
              ifunc = &h->plt.plist;
4999
            }
5000
        }
5001
      else
5002
        {
5003
          Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5004
                                                          abfd, r_symndx);
5005
          if (isym == NULL)
5006
            return FALSE;
5007
 
5008
          if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
5009
            {
5010
              ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
5011
                                             rel->r_addend, PLT_IFUNC);
5012
              if (ifunc == NULL)
5013
                return FALSE;
5014
            }
5015
        }
5016
      r_type = ELF64_R_TYPE (rel->r_info);
5017
      if (is_branch_reloc (r_type))
5018
        {
5019
          if (h != NULL && (h == tga || h == dottga))
5020
            {
5021
              if (rel != relocs
5022
                  && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD
5023
                      || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD))
5024
                /* We have a new-style __tls_get_addr call with a marker
5025
                   reloc.  */
5026
                ;
5027
              else
5028
                /* Mark this section as having an old-style call.  */
5029
                sec->has_tls_get_addr_call = 1;
5030
            }
5031
 
5032
          /* STT_GNU_IFUNC symbols must have a PLT entry.  */
5033
          if (ifunc != NULL
5034
              && !update_plt_info (abfd, ifunc, rel->r_addend))
5035
            return FALSE;
5036
        }
5037
 
5038
      switch (r_type)
5039
        {
5040
        case R_PPC64_TLSGD:
5041
        case R_PPC64_TLSLD:
5042
          /* These special tls relocs tie a call to __tls_get_addr with
5043
             its parameter symbol.  */
5044
          break;
5045
 
5046
        case R_PPC64_GOT_TLSLD16:
5047
        case R_PPC64_GOT_TLSLD16_LO:
5048
        case R_PPC64_GOT_TLSLD16_HI:
5049
        case R_PPC64_GOT_TLSLD16_HA:
5050
          tls_type = TLS_TLS | TLS_LD;
5051
          goto dogottls;
5052
 
5053
        case R_PPC64_GOT_TLSGD16:
5054
        case R_PPC64_GOT_TLSGD16_LO:
5055
        case R_PPC64_GOT_TLSGD16_HI:
5056
        case R_PPC64_GOT_TLSGD16_HA:
5057
          tls_type = TLS_TLS | TLS_GD;
5058
          goto dogottls;
5059
 
5060
        case R_PPC64_GOT_TPREL16_DS:
5061
        case R_PPC64_GOT_TPREL16_LO_DS:
5062
        case R_PPC64_GOT_TPREL16_HI:
5063
        case R_PPC64_GOT_TPREL16_HA:
5064
          if (!info->executable)
5065
            info->flags |= DF_STATIC_TLS;
5066
          tls_type = TLS_TLS | TLS_TPREL;
5067
          goto dogottls;
5068
 
5069
        case R_PPC64_GOT_DTPREL16_DS:
5070
        case R_PPC64_GOT_DTPREL16_LO_DS:
5071
        case R_PPC64_GOT_DTPREL16_HI:
5072
        case R_PPC64_GOT_DTPREL16_HA:
5073
          tls_type = TLS_TLS | TLS_DTPREL;
5074
        dogottls:
5075
          sec->has_tls_reloc = 1;
5076
          /* Fall thru */
5077
 
5078
        case R_PPC64_GOT16:
5079
        case R_PPC64_GOT16_DS:
5080
        case R_PPC64_GOT16_HA:
5081
        case R_PPC64_GOT16_HI:
5082
        case R_PPC64_GOT16_LO:
5083
        case R_PPC64_GOT16_LO_DS:
5084
          /* This symbol requires a global offset table entry.  */
5085
          sec->has_toc_reloc = 1;
5086
          if (r_type == R_PPC64_GOT_TLSLD16
5087
              || r_type == R_PPC64_GOT_TLSGD16
5088
              || r_type == R_PPC64_GOT_TPREL16_DS
5089
              || r_type == R_PPC64_GOT_DTPREL16_DS
5090
              || r_type == R_PPC64_GOT16
5091
              || r_type == R_PPC64_GOT16_DS)
5092
            {
5093
              htab->do_multi_toc = 1;
5094
              ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
5095
            }
5096
 
5097
          if (ppc64_elf_tdata (abfd)->got == NULL
5098
              && !create_got_section (abfd, info))
5099
            return FALSE;
5100
 
5101
          if (h != NULL)
5102
            {
5103
              struct ppc_link_hash_entry *eh;
5104
              struct got_entry *ent;
5105
 
5106
              eh = (struct ppc_link_hash_entry *) h;
5107
              for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
5108
                if (ent->addend == rel->r_addend
5109
                    && ent->owner == abfd
5110
                    && ent->tls_type == tls_type)
5111
                  break;
5112
              if (ent == NULL)
5113
                {
5114
                  bfd_size_type amt = sizeof (*ent);
5115
                  ent = bfd_alloc (abfd, amt);
5116
                  if (ent == NULL)
5117
                    return FALSE;
5118
                  ent->next = eh->elf.got.glist;
5119
                  ent->addend = rel->r_addend;
5120
                  ent->owner = abfd;
5121
                  ent->tls_type = tls_type;
5122
                  ent->is_indirect = FALSE;
5123
                  ent->got.refcount = 0;
5124
                  eh->elf.got.glist = ent;
5125
                }
5126
              ent->got.refcount += 1;
5127
              eh->tls_mask |= tls_type;
5128
            }
5129
          else
5130
            /* This is a global offset table entry for a local symbol.  */
5131
            if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5132
                                        rel->r_addend, tls_type))
5133
              return FALSE;
5134
          break;
5135
 
5136
        case R_PPC64_PLT16_HA:
5137
        case R_PPC64_PLT16_HI:
5138
        case R_PPC64_PLT16_LO:
5139
        case R_PPC64_PLT32:
5140
        case R_PPC64_PLT64:
5141
          /* This symbol requires a procedure linkage table entry.  We
5142
             actually build the entry in adjust_dynamic_symbol,
5143
             because this might be a case of linking PIC code without
5144
             linking in any dynamic objects, in which case we don't
5145
             need to generate a procedure linkage table after all.  */
5146
          if (h == NULL)
5147
            {
5148
              /* It does not make sense to have a procedure linkage
5149
                 table entry for a local symbol.  */
5150
              bfd_set_error (bfd_error_bad_value);
5151
              return FALSE;
5152
            }
5153
          else
5154
            {
5155
              if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5156
                return FALSE;
5157
              h->needs_plt = 1;
5158
              if (h->root.root.string[0] == '.'
5159
                  && h->root.root.string[1] != '\0')
5160
                ((struct ppc_link_hash_entry *) h)->is_func = 1;
5161
            }
5162
          break;
5163
 
5164
          /* The following relocations don't need to propagate the
5165
             relocation if linking a shared object since they are
5166
             section relative.  */
5167
        case R_PPC64_SECTOFF:
5168
        case R_PPC64_SECTOFF_LO:
5169
        case R_PPC64_SECTOFF_HI:
5170
        case R_PPC64_SECTOFF_HA:
5171
        case R_PPC64_SECTOFF_DS:
5172
        case R_PPC64_SECTOFF_LO_DS:
5173
        case R_PPC64_DTPREL16:
5174
        case R_PPC64_DTPREL16_LO:
5175
        case R_PPC64_DTPREL16_HI:
5176
        case R_PPC64_DTPREL16_HA:
5177
        case R_PPC64_DTPREL16_DS:
5178
        case R_PPC64_DTPREL16_LO_DS:
5179
        case R_PPC64_DTPREL16_HIGHER:
5180
        case R_PPC64_DTPREL16_HIGHERA:
5181
        case R_PPC64_DTPREL16_HIGHEST:
5182
        case R_PPC64_DTPREL16_HIGHESTA:
5183
          break;
5184
 
5185
          /* Nor do these.  */
5186
        case R_PPC64_REL16:
5187
        case R_PPC64_REL16_LO:
5188
        case R_PPC64_REL16_HI:
5189
        case R_PPC64_REL16_HA:
5190
          break;
5191
 
5192
        case R_PPC64_TOC16:
5193
        case R_PPC64_TOC16_DS:
5194
          htab->do_multi_toc = 1;
5195
          ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
5196
        case R_PPC64_TOC16_LO:
5197
        case R_PPC64_TOC16_HI:
5198
        case R_PPC64_TOC16_HA:
5199
        case R_PPC64_TOC16_LO_DS:
5200
          sec->has_toc_reloc = 1;
5201
          break;
5202
 
5203
          /* This relocation describes the C++ object vtable hierarchy.
5204
             Reconstruct it for later use during GC.  */
5205
        case R_PPC64_GNU_VTINHERIT:
5206
          if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
5207
            return FALSE;
5208
          break;
5209
 
5210
          /* This relocation describes which C++ vtable entries are actually
5211
             used.  Record for later use during GC.  */
5212
        case R_PPC64_GNU_VTENTRY:
5213
          BFD_ASSERT (h != NULL);
5214
          if (h != NULL
5215
              && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
5216
            return FALSE;
5217
          break;
5218
 
5219
        case R_PPC64_REL14:
5220
        case R_PPC64_REL14_BRTAKEN:
5221
        case R_PPC64_REL14_BRNTAKEN:
5222
          {
5223
            asection *dest = NULL;
5224
 
5225
            /* Heuristic: If jumping outside our section, chances are
5226
               we are going to need a stub.  */
5227
            if (h != NULL)
5228
              {
5229
                /* If the sym is weak it may be overridden later, so
5230
                   don't assume we know where a weak sym lives.  */
5231
                if (h->root.type == bfd_link_hash_defined)
5232
                  dest = h->root.u.def.section;
5233
              }
5234
            else
5235
              {
5236
                Elf_Internal_Sym *isym;
5237
 
5238
                isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5239
                                              abfd, r_symndx);
5240
                if (isym == NULL)
5241
                  return FALSE;
5242
 
5243
                dest = bfd_section_from_elf_index (abfd, isym->st_shndx);
5244
              }
5245
 
5246
            if (dest != sec)
5247
              ppc64_elf_section_data (sec)->has_14bit_branch = 1;
5248
          }
5249
          /* Fall through.  */
5250
 
5251
        case R_PPC64_REL24:
5252
          if (h != NULL && ifunc == NULL)
5253
            {
5254
              /* We may need a .plt entry if the function this reloc
5255
                 refers to is in a shared lib.  */
5256
              if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5257
                return FALSE;
5258
              h->needs_plt = 1;
5259
              if (h->root.root.string[0] == '.'
5260
                  && h->root.root.string[1] != '\0')
5261
                ((struct ppc_link_hash_entry *) h)->is_func = 1;
5262
              if (h == tga || h == dottga)
5263
                sec->has_tls_reloc = 1;
5264
            }
5265
          break;
5266
 
5267
        case R_PPC64_TPREL64:
5268
          tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
5269
          if (!info->executable)
5270
            info->flags |= DF_STATIC_TLS;
5271
          goto dotlstoc;
5272
 
5273
        case R_PPC64_DTPMOD64:
5274
          if (rel + 1 < rel_end
5275
              && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
5276
              && rel[1].r_offset == rel->r_offset + 8)
5277
            tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
5278
          else
5279
            tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
5280
          goto dotlstoc;
5281
 
5282
        case R_PPC64_DTPREL64:
5283
          tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
5284
          if (rel != relocs
5285
              && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
5286
              && rel[-1].r_offset == rel->r_offset - 8)
5287
            /* This is the second reloc of a dtpmod, dtprel pair.
5288
               Don't mark with TLS_DTPREL.  */
5289
            goto dodyn;
5290
 
5291
        dotlstoc:
5292
          sec->has_tls_reloc = 1;
5293
          if (h != NULL)
5294
            {
5295
              struct ppc_link_hash_entry *eh;
5296
              eh = (struct ppc_link_hash_entry *) h;
5297
              eh->tls_mask |= tls_type;
5298
            }
5299
          else
5300
            if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5301
                                        rel->r_addend, tls_type))
5302
              return FALSE;
5303
 
5304
          ppc64_sec = ppc64_elf_section_data (sec);
5305
          if (ppc64_sec->sec_type != sec_toc)
5306
            {
5307
              bfd_size_type amt;
5308
 
5309
              /* One extra to simplify get_tls_mask.  */
5310
              amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
5311
              ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
5312
              if (ppc64_sec->u.toc.symndx == NULL)
5313
                return FALSE;
5314
              amt = sec->size * sizeof (bfd_vma) / 8;
5315
              ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
5316
              if (ppc64_sec->u.toc.add == NULL)
5317
                return FALSE;
5318
              BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
5319
              ppc64_sec->sec_type = sec_toc;
5320
            }
5321
          BFD_ASSERT (rel->r_offset % 8 == 0);
5322
          ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
5323
          ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
5324
 
5325
          /* Mark the second slot of a GD or LD entry.
5326
             -1 to indicate GD and -2 to indicate LD.  */
5327
          if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
5328
            ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
5329
          else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
5330
            ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
5331
          goto dodyn;
5332
 
5333
        case R_PPC64_TPREL16:
5334
        case R_PPC64_TPREL16_LO:
5335
        case R_PPC64_TPREL16_HI:
5336
        case R_PPC64_TPREL16_HA:
5337
        case R_PPC64_TPREL16_DS:
5338
        case R_PPC64_TPREL16_LO_DS:
5339
        case R_PPC64_TPREL16_HIGHER:
5340
        case R_PPC64_TPREL16_HIGHERA:
5341
        case R_PPC64_TPREL16_HIGHEST:
5342
        case R_PPC64_TPREL16_HIGHESTA:
5343
          if (info->shared)
5344
            {
5345
              if (!info->executable)
5346
                info->flags |= DF_STATIC_TLS;
5347
              goto dodyn;
5348
            }
5349
          break;
5350
 
5351
        case R_PPC64_ADDR64:
5352
          if (opd_sym_map != NULL
5353
              && rel + 1 < rel_end
5354
              && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
5355
            {
5356
              if (h != NULL)
5357
                {
5358
                  if (h->root.root.string[0] == '.'
5359
                      && h->root.root.string[1] != 0
5360
                      && lookup_fdh ((struct ppc_link_hash_entry *) h, htab))
5361
                    ;
5362
                  else
5363
                    ((struct ppc_link_hash_entry *) h)->is_func = 1;
5364
                }
5365
              else
5366
                {
5367
                  asection *s;
5368
                  Elf_Internal_Sym *isym;
5369
 
5370
                  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5371
                                                abfd, r_symndx);
5372
                  if (isym == NULL)
5373
                    return FALSE;
5374
 
5375
                  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5376
                  if (s != NULL && s != sec)
5377
                    opd_sym_map[rel->r_offset / 8] = s;
5378
                }
5379
            }
5380
          /* Fall through.  */
5381
 
5382
        case R_PPC64_REL30:
5383
        case R_PPC64_REL32:
5384
        case R_PPC64_REL64:
5385
        case R_PPC64_ADDR14:
5386
        case R_PPC64_ADDR14_BRNTAKEN:
5387
        case R_PPC64_ADDR14_BRTAKEN:
5388
        case R_PPC64_ADDR16:
5389
        case R_PPC64_ADDR16_DS:
5390
        case R_PPC64_ADDR16_HA:
5391
        case R_PPC64_ADDR16_HI:
5392
        case R_PPC64_ADDR16_HIGHER:
5393
        case R_PPC64_ADDR16_HIGHERA:
5394
        case R_PPC64_ADDR16_HIGHEST:
5395
        case R_PPC64_ADDR16_HIGHESTA:
5396
        case R_PPC64_ADDR16_LO:
5397
        case R_PPC64_ADDR16_LO_DS:
5398
        case R_PPC64_ADDR24:
5399
        case R_PPC64_ADDR32:
5400
        case R_PPC64_UADDR16:
5401
        case R_PPC64_UADDR32:
5402
        case R_PPC64_UADDR64:
5403
        case R_PPC64_TOC:
5404
          if (h != NULL && !info->shared)
5405
            /* We may need a copy reloc.  */
5406
            h->non_got_ref = 1;
5407
 
5408
          /* Don't propagate .opd relocs.  */
5409
          if (NO_OPD_RELOCS && opd_sym_map != NULL)
5410
            break;
5411
 
5412
          /* If we are creating a shared library, and this is a reloc
5413
             against a global symbol, or a non PC relative reloc
5414
             against a local symbol, then we need to copy the reloc
5415
             into the shared library.  However, if we are linking with
5416
             -Bsymbolic, we do not need to copy a reloc against a
5417
             global symbol which is defined in an object we are
5418
             including in the link (i.e., DEF_REGULAR is set).  At
5419
             this point we have not seen all the input files, so it is
5420
             possible that DEF_REGULAR is not set now but will be set
5421
             later (it is never cleared).  In case of a weak definition,
5422
             DEF_REGULAR may be cleared later by a strong definition in
5423
             a shared library.  We account for that possibility below by
5424
             storing information in the dyn_relocs field of the hash
5425
             table entry.  A similar situation occurs when creating
5426
             shared libraries and symbol visibility changes render the
5427
             symbol local.
5428
 
5429
             If on the other hand, we are creating an executable, we
5430
             may need to keep relocations for symbols satisfied by a
5431
             dynamic library if we manage to avoid copy relocs for the
5432
             symbol.  */
5433
        dodyn:
5434
          if ((info->shared
5435
               && (must_be_dyn_reloc (info, r_type)
5436
                   || (h != NULL
5437
                       && (! info->symbolic
5438
                           || h->root.type == bfd_link_hash_defweak
5439
                           || !h->def_regular))))
5440
              || (ELIMINATE_COPY_RELOCS
5441
                  && !info->shared
5442
                  && h != NULL
5443
                  && (h->root.type == bfd_link_hash_defweak
5444
                      || !h->def_regular))
5445
              || (!info->shared
5446
                  && ifunc != NULL))
5447
            {
5448
              struct elf_dyn_relocs *p;
5449
              struct elf_dyn_relocs **head;
5450
 
5451
              /* We must copy these reloc types into the output file.
5452
                 Create a reloc section in dynobj and make room for
5453
                 this reloc.  */
5454
              if (sreloc == NULL)
5455
                {
5456
                  sreloc = _bfd_elf_make_dynamic_reloc_section
5457
                    (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
5458
 
5459
                  if (sreloc == NULL)
5460
                    return FALSE;
5461
                }
5462
 
5463
              /* If this is a global symbol, we count the number of
5464
                 relocations we need for this symbol.  */
5465
              if (h != NULL)
5466
                {
5467
                  head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
5468
                }
5469
              else
5470
                {
5471
                  /* Track dynamic relocs needed for local syms too.
5472
                     We really need local syms available to do this
5473
                     easily.  Oh well.  */
5474
                  asection *s;
5475
                  void *vpp;
5476
                  Elf_Internal_Sym *isym;
5477
 
5478
                  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5479
                                                abfd, r_symndx);
5480
                  if (isym == NULL)
5481
                    return FALSE;
5482
 
5483
                  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5484
                  if (s == NULL)
5485
                    s = sec;
5486
 
5487
                  vpp = &elf_section_data (s)->local_dynrel;
5488
                  head = (struct elf_dyn_relocs **) vpp;
5489
                }
5490
 
5491
              p = *head;
5492
              if (p == NULL || p->sec != sec)
5493
                {
5494
                  p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5495
                  if (p == NULL)
5496
                    return FALSE;
5497
                  p->next = *head;
5498
                  *head = p;
5499
                  p->sec = sec;
5500
                  p->count = 0;
5501
                  p->pc_count = 0;
5502
                }
5503
 
5504
              p->count += 1;
5505
              if (!must_be_dyn_reloc (info, r_type))
5506
                p->pc_count += 1;
5507
            }
5508
          break;
5509
 
5510
        default:
5511
          break;
5512
        }
5513
    }
5514
 
5515
  return TRUE;
5516
}
5517
 
5518
/* OFFSET in OPD_SEC specifies a function descriptor.  Return the address
5519
   of the code entry point, and its section.  */
5520
 
5521
static bfd_vma
5522
opd_entry_value (asection *opd_sec,
5523
                 bfd_vma offset,
5524
                 asection **code_sec,
5525
                 bfd_vma *code_off)
5526
{
5527
  bfd *opd_bfd = opd_sec->owner;
5528
  Elf_Internal_Rela *relocs;
5529
  Elf_Internal_Rela *lo, *hi, *look;
5530
  bfd_vma val;
5531
 
5532 166 khays
  /* No relocs implies we are linking a --just-symbols object, or looking
5533
     at a final linked executable with addr2line or somesuch.  */
5534 14 khays
  if (opd_sec->reloc_count == 0)
5535
    {
5536
      char buf[8];
5537
 
5538
      if (!bfd_get_section_contents (opd_bfd, opd_sec, buf, offset, 8))
5539
        return (bfd_vma) -1;
5540
 
5541
      val = bfd_get_64 (opd_bfd, buf);
5542
      if (code_sec != NULL)
5543
        {
5544
          asection *sec, *likely = NULL;
5545
          for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
5546
            if (sec->vma <= val
5547
                && (sec->flags & SEC_LOAD) != 0
5548
                && (sec->flags & SEC_ALLOC) != 0)
5549
              likely = sec;
5550
          if (likely != NULL)
5551
            {
5552
              *code_sec = likely;
5553
              if (code_off != NULL)
5554
                *code_off = val - likely->vma;
5555
            }
5556
        }
5557
      return val;
5558
    }
5559
 
5560
  BFD_ASSERT (is_ppc64_elf (opd_bfd));
5561
 
5562
  relocs = ppc64_elf_tdata (opd_bfd)->opd_relocs;
5563
  if (relocs == NULL)
5564
    relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
5565
 
5566
  /* Go find the opd reloc at the sym address.  */
5567
  lo = relocs;
5568
  BFD_ASSERT (lo != NULL);
5569
  hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
5570
  val = (bfd_vma) -1;
5571
  while (lo < hi)
5572
    {
5573
      look = lo + (hi - lo) / 2;
5574
      if (look->r_offset < offset)
5575
        lo = look + 1;
5576
      else if (look->r_offset > offset)
5577
        hi = look;
5578
      else
5579
        {
5580
          Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd);
5581
 
5582
          if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
5583
              && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
5584
            {
5585
              unsigned long symndx = ELF64_R_SYM (look->r_info);
5586
              asection *sec;
5587
 
5588
              if (symndx < symtab_hdr->sh_info)
5589
                {
5590
                  Elf_Internal_Sym *sym;
5591
 
5592
                  sym = (Elf_Internal_Sym *) symtab_hdr->contents;
5593
                  if (sym == NULL)
5594
                    {
5595
                      sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
5596
                                                  symtab_hdr->sh_info,
5597
                                                  0, NULL, NULL, NULL);
5598
                      if (sym == NULL)
5599
                        break;
5600
                      symtab_hdr->contents = (bfd_byte *) sym;
5601
                    }
5602
 
5603
                  sym += symndx;
5604
                  val = sym->st_value;
5605
                  sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
5606
                  BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
5607
                }
5608
              else
5609
                {
5610
                  struct elf_link_hash_entry **sym_hashes;
5611
                  struct elf_link_hash_entry *rh;
5612
 
5613
                  sym_hashes = elf_sym_hashes (opd_bfd);
5614
                  rh = sym_hashes[symndx - symtab_hdr->sh_info];
5615
                  rh = elf_follow_link (rh);
5616
                  BFD_ASSERT (rh->root.type == bfd_link_hash_defined
5617
                              || rh->root.type == bfd_link_hash_defweak);
5618
                  val = rh->root.u.def.value;
5619
                  sec = rh->root.u.def.section;
5620
                }
5621
              val += look->r_addend;
5622
              if (code_off != NULL)
5623
                *code_off = val;
5624
              if (code_sec != NULL)
5625
                *code_sec = sec;
5626
              if (sec != NULL && sec->output_section != NULL)
5627
                val += sec->output_section->vma + sec->output_offset;
5628
            }
5629
          break;
5630
        }
5631
    }
5632
 
5633
  return val;
5634
}
5635
 
5636 166 khays
/* Return TRUE iff the ELF symbol SYM might be a function.  Set *CODE_SEC
5637
   and *CODE_OFF to the function's entry point.  */
5638
 
5639
static bfd_boolean
5640
ppc64_elf_maybe_function_sym (const asymbol *sym,
5641
                              asection **code_sec, bfd_vma *code_off)
5642
{
5643
  if (_bfd_elf_maybe_function_sym (sym, code_sec, code_off))
5644
    {
5645
      if (strcmp (sym->section->name, ".opd") == 0)
5646
        opd_entry_value (sym->section, sym->value, code_sec, code_off);
5647
      return TRUE;
5648
    }
5649
  return FALSE;
5650
}
5651
 
5652 14 khays
/* Return true if symbol is defined in a regular object file.  */
5653
 
5654
static bfd_boolean
5655
is_static_defined (struct elf_link_hash_entry *h)
5656
{
5657
  return ((h->root.type == bfd_link_hash_defined
5658
           || h->root.type == bfd_link_hash_defweak)
5659
          && h->root.u.def.section != NULL
5660
          && h->root.u.def.section->output_section != NULL);
5661
}
5662
 
5663
/* If FDH is a function descriptor symbol, return the associated code
5664
   entry symbol if it is defined.  Return NULL otherwise.  */
5665
 
5666
static struct ppc_link_hash_entry *
5667
defined_code_entry (struct ppc_link_hash_entry *fdh)
5668
{
5669
  if (fdh->is_func_descriptor)
5670
    {
5671
      struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
5672
      if (fh->elf.root.type == bfd_link_hash_defined
5673
          || fh->elf.root.type == bfd_link_hash_defweak)
5674
        return fh;
5675
    }
5676
  return NULL;
5677
}
5678
 
5679
/* If FH is a function code entry symbol, return the associated
5680
   function descriptor symbol if it is defined.  Return NULL otherwise.  */
5681
 
5682
static struct ppc_link_hash_entry *
5683
defined_func_desc (struct ppc_link_hash_entry *fh)
5684
{
5685
  if (fh->oh != NULL
5686
      && fh->oh->is_func_descriptor)
5687
    {
5688
      struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
5689
      if (fdh->elf.root.type == bfd_link_hash_defined
5690
          || fdh->elf.root.type == bfd_link_hash_defweak)
5691
        return fdh;
5692
    }
5693
  return NULL;
5694
}
5695
 
5696
/* Mark all our entry sym sections, both opd and code section.  */
5697
 
5698
static void
5699
ppc64_elf_gc_keep (struct bfd_link_info *info)
5700
{
5701
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
5702
  struct bfd_sym_chain *sym;
5703
 
5704
  if (htab == NULL)
5705
    return;
5706
 
5707
  for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
5708
    {
5709
      struct ppc_link_hash_entry *eh, *fh;
5710
      asection *sec;
5711
 
5712
      eh = (struct ppc_link_hash_entry *)
5713
        elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, TRUE);
5714
      if (eh == NULL)
5715
        continue;
5716
      if (eh->elf.root.type != bfd_link_hash_defined
5717
          && eh->elf.root.type != bfd_link_hash_defweak)
5718
        continue;
5719
 
5720
      fh = defined_code_entry (eh);
5721
      if (fh != NULL)
5722
        {
5723
          sec = fh->elf.root.u.def.section;
5724
          sec->flags |= SEC_KEEP;
5725
        }
5726
      else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5727
               && opd_entry_value (eh->elf.root.u.def.section,
5728
                                   eh->elf.root.u.def.value,
5729
                                   &sec, NULL) != (bfd_vma) -1)
5730
        sec->flags |= SEC_KEEP;
5731
 
5732
      sec = eh->elf.root.u.def.section;
5733
      sec->flags |= SEC_KEEP;
5734
    }
5735
}
5736
 
5737
/* Mark sections containing dynamically referenced symbols.  When
5738
   building shared libraries, we must assume that any visible symbol is
5739
   referenced.  */
5740
 
5741
static bfd_boolean
5742
ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
5743
{
5744
  struct bfd_link_info *info = (struct bfd_link_info *) inf;
5745
  struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
5746
  struct ppc_link_hash_entry *fdh;
5747
 
5748
  /* Dynamic linking info is on the func descriptor sym.  */
5749
  fdh = defined_func_desc (eh);
5750
  if (fdh != NULL)
5751
    eh = fdh;
5752
 
5753
  if ((eh->elf.root.type == bfd_link_hash_defined
5754
       || eh->elf.root.type == bfd_link_hash_defweak)
5755
      && (eh->elf.ref_dynamic
5756
          || (!info->executable
5757
              && eh->elf.def_regular
5758
              && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
5759 163 khays
              && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN
5760
              && (strchr (eh->elf.root.root.string, ELF_VER_CHR) != NULL
5761
                  || !bfd_hide_sym_by_version (info->version_info,
5762
                                               eh->elf.root.root.string)))))
5763 14 khays
    {
5764
      asection *code_sec;
5765
      struct ppc_link_hash_entry *fh;
5766
 
5767
      eh->elf.root.u.def.section->flags |= SEC_KEEP;
5768
 
5769
      /* Function descriptor syms cause the associated
5770
         function code sym section to be marked.  */
5771
      fh = defined_code_entry (eh);
5772
      if (fh != NULL)
5773
        {
5774
          code_sec = fh->elf.root.u.def.section;
5775
          code_sec->flags |= SEC_KEEP;
5776
        }
5777
      else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5778
               && opd_entry_value (eh->elf.root.u.def.section,
5779
                                   eh->elf.root.u.def.value,
5780
                                   &code_sec, NULL) != (bfd_vma) -1)
5781
        code_sec->flags |= SEC_KEEP;
5782
    }
5783
 
5784
  return TRUE;
5785
}
5786
 
5787
/* Return the section that should be marked against GC for a given
5788
   relocation.  */
5789
 
5790
static asection *
5791
ppc64_elf_gc_mark_hook (asection *sec,
5792
                        struct bfd_link_info *info,
5793
                        Elf_Internal_Rela *rel,
5794
                        struct elf_link_hash_entry *h,
5795
                        Elf_Internal_Sym *sym)
5796
{
5797
  asection *rsec;
5798
 
5799
  /* Syms return NULL if we're marking .opd, so we avoid marking all
5800
     function sections, as all functions are referenced in .opd.  */
5801
  rsec = NULL;
5802
  if (get_opd_info (sec) != NULL)
5803
    return rsec;
5804
 
5805
  if (h != NULL)
5806
    {
5807
      enum elf_ppc64_reloc_type r_type;
5808
      struct ppc_link_hash_entry *eh, *fh, *fdh;
5809
 
5810
      r_type = ELF64_R_TYPE (rel->r_info);
5811
      switch (r_type)
5812
        {
5813
        case R_PPC64_GNU_VTINHERIT:
5814
        case R_PPC64_GNU_VTENTRY:
5815
          break;
5816
 
5817
        default:
5818
          switch (h->root.type)
5819
            {
5820
            case bfd_link_hash_defined:
5821
            case bfd_link_hash_defweak:
5822
              eh = (struct ppc_link_hash_entry *) h;
5823
              fdh = defined_func_desc (eh);
5824
              if (fdh != NULL)
5825
                eh = fdh;
5826
 
5827
              /* Function descriptor syms cause the associated
5828
                 function code sym section to be marked.  */
5829
              fh = defined_code_entry (eh);
5830
              if (fh != NULL)
5831
                {
5832
                  /* They also mark their opd section.  */
5833
                  eh->elf.root.u.def.section->gc_mark = 1;
5834
 
5835
                  rsec = fh->elf.root.u.def.section;
5836
                }
5837
              else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5838
                       && opd_entry_value (eh->elf.root.u.def.section,
5839
                                           eh->elf.root.u.def.value,
5840
                                           &rsec, NULL) != (bfd_vma) -1)
5841
                eh->elf.root.u.def.section->gc_mark = 1;
5842
              else
5843
                rsec = h->root.u.def.section;
5844
              break;
5845
 
5846
            case bfd_link_hash_common:
5847
              rsec = h->root.u.c.p->section;
5848
              break;
5849
 
5850
            default:
5851
              return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
5852
            }
5853
        }
5854
    }
5855
  else
5856
    {
5857
      struct _opd_sec_data *opd;
5858
 
5859
      rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
5860
      opd = get_opd_info (rsec);
5861
      if (opd != NULL && opd->func_sec != NULL)
5862
        {
5863
          rsec->gc_mark = 1;
5864
 
5865
          rsec = opd->func_sec[(sym->st_value + rel->r_addend) / 8];
5866
        }
5867
    }
5868
 
5869
  return rsec;
5870
}
5871
 
5872
/* Update the .got, .plt. and dynamic reloc reference counts for the
5873
   section being removed.  */
5874
 
5875
static bfd_boolean
5876
ppc64_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
5877
                         asection *sec, const Elf_Internal_Rela *relocs)
5878
{
5879
  struct ppc_link_hash_table *htab;
5880
  Elf_Internal_Shdr *symtab_hdr;
5881
  struct elf_link_hash_entry **sym_hashes;
5882
  struct got_entry **local_got_ents;
5883
  const Elf_Internal_Rela *rel, *relend;
5884
 
5885
  if (info->relocatable)
5886
    return TRUE;
5887
 
5888
  if ((sec->flags & SEC_ALLOC) == 0)
5889
    return TRUE;
5890
 
5891
  elf_section_data (sec)->local_dynrel = NULL;
5892
 
5893
  htab = ppc_hash_table (info);
5894
  if (htab == NULL)
5895
    return FALSE;
5896
 
5897
  symtab_hdr = &elf_symtab_hdr (abfd);
5898
  sym_hashes = elf_sym_hashes (abfd);
5899
  local_got_ents = elf_local_got_ents (abfd);
5900
 
5901
  relend = relocs + sec->reloc_count;
5902
  for (rel = relocs; rel < relend; rel++)
5903
    {
5904
      unsigned long r_symndx;
5905
      enum elf_ppc64_reloc_type r_type;
5906
      struct elf_link_hash_entry *h = NULL;
5907
      unsigned char tls_type = 0;
5908
 
5909
      r_symndx = ELF64_R_SYM (rel->r_info);
5910
      r_type = ELF64_R_TYPE (rel->r_info);
5911
      if (r_symndx >= symtab_hdr->sh_info)
5912
        {
5913
          struct ppc_link_hash_entry *eh;
5914
          struct elf_dyn_relocs **pp;
5915
          struct elf_dyn_relocs *p;
5916
 
5917
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5918
          h = elf_follow_link (h);
5919
          eh = (struct ppc_link_hash_entry *) h;
5920
 
5921
          for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
5922
            if (p->sec == sec)
5923
              {
5924
                /* Everything must go for SEC.  */
5925
                *pp = p->next;
5926
                break;
5927
              }
5928
        }
5929
 
5930
      if (is_branch_reloc (r_type))
5931
        {
5932
          struct plt_entry **ifunc = NULL;
5933
          if (h != NULL)
5934
            {
5935
              if (h->type == STT_GNU_IFUNC)
5936
                ifunc = &h->plt.plist;
5937
            }
5938
          else if (local_got_ents != NULL)
5939
            {
5940
              struct plt_entry **local_plt = (struct plt_entry **)
5941
                (local_got_ents + symtab_hdr->sh_info);
5942
              unsigned char *local_got_tls_masks = (unsigned char *)
5943
                (local_plt + symtab_hdr->sh_info);
5944
              if ((local_got_tls_masks[r_symndx] & PLT_IFUNC) != 0)
5945
                ifunc = local_plt + r_symndx;
5946
            }
5947
          if (ifunc != NULL)
5948
            {
5949
              struct plt_entry *ent;
5950
 
5951
              for (ent = *ifunc; ent != NULL; ent = ent->next)
5952
                if (ent->addend == rel->r_addend)
5953
                  break;
5954
              if (ent == NULL)
5955
                abort ();
5956
              if (ent->plt.refcount > 0)
5957
                ent->plt.refcount -= 1;
5958
              continue;
5959
            }
5960
        }
5961
 
5962
      switch (r_type)
5963
        {
5964
        case R_PPC64_GOT_TLSLD16:
5965
        case R_PPC64_GOT_TLSLD16_LO:
5966
        case R_PPC64_GOT_TLSLD16_HI:
5967
        case R_PPC64_GOT_TLSLD16_HA:
5968
          tls_type = TLS_TLS | TLS_LD;
5969
          goto dogot;
5970
 
5971
        case R_PPC64_GOT_TLSGD16:
5972
        case R_PPC64_GOT_TLSGD16_LO:
5973
        case R_PPC64_GOT_TLSGD16_HI:
5974
        case R_PPC64_GOT_TLSGD16_HA:
5975
          tls_type = TLS_TLS | TLS_GD;
5976
          goto dogot;
5977
 
5978
        case R_PPC64_GOT_TPREL16_DS:
5979
        case R_PPC64_GOT_TPREL16_LO_DS:
5980
        case R_PPC64_GOT_TPREL16_HI:
5981
        case R_PPC64_GOT_TPREL16_HA:
5982
          tls_type = TLS_TLS | TLS_TPREL;
5983
          goto dogot;
5984
 
5985
        case R_PPC64_GOT_DTPREL16_DS:
5986
        case R_PPC64_GOT_DTPREL16_LO_DS:
5987
        case R_PPC64_GOT_DTPREL16_HI:
5988
        case R_PPC64_GOT_DTPREL16_HA:
5989
          tls_type = TLS_TLS | TLS_DTPREL;
5990
          goto dogot;
5991
 
5992
        case R_PPC64_GOT16:
5993
        case R_PPC64_GOT16_DS:
5994
        case R_PPC64_GOT16_HA:
5995
        case R_PPC64_GOT16_HI:
5996
        case R_PPC64_GOT16_LO:
5997
        case R_PPC64_GOT16_LO_DS:
5998
        dogot:
5999
          {
6000
            struct got_entry *ent;
6001
 
6002
            if (h != NULL)
6003
              ent = h->got.glist;
6004
            else
6005
              ent = local_got_ents[r_symndx];
6006
 
6007
            for (; ent != NULL; ent = ent->next)
6008
              if (ent->addend == rel->r_addend
6009
                  && ent->owner == abfd
6010
                  && ent->tls_type == tls_type)
6011
                break;
6012
            if (ent == NULL)
6013
              abort ();
6014
            if (ent->got.refcount > 0)
6015
              ent->got.refcount -= 1;
6016
          }
6017
          break;
6018
 
6019
        case R_PPC64_PLT16_HA:
6020
        case R_PPC64_PLT16_HI:
6021
        case R_PPC64_PLT16_LO:
6022
        case R_PPC64_PLT32:
6023
        case R_PPC64_PLT64:
6024
        case R_PPC64_REL14:
6025
        case R_PPC64_REL14_BRNTAKEN:
6026
        case R_PPC64_REL14_BRTAKEN:
6027
        case R_PPC64_REL24:
6028
          if (h != NULL)
6029
            {
6030
              struct plt_entry *ent;
6031
 
6032
              for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6033
                if (ent->addend == rel->r_addend)
6034
                  break;
6035
              if (ent != NULL && ent->plt.refcount > 0)
6036
                ent->plt.refcount -= 1;
6037
            }
6038
          break;
6039
 
6040
        default:
6041
          break;
6042
        }
6043
    }
6044
  return TRUE;
6045
}
6046
 
6047
/* The maximum size of .sfpr.  */
6048
#define SFPR_MAX (218*4)
6049
 
6050
struct sfpr_def_parms
6051
{
6052
  const char name[12];
6053
  unsigned char lo, hi;
6054
  bfd_byte * (*write_ent) (bfd *, bfd_byte *, int);
6055
  bfd_byte * (*write_tail) (bfd *, bfd_byte *, int);
6056
};
6057
 
6058
/* Auto-generate _save*, _rest* functions in .sfpr.  */
6059
 
6060
static bfd_boolean
6061
sfpr_define (struct bfd_link_info *info, const struct sfpr_def_parms *parm)
6062
{
6063
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
6064
  unsigned int i;
6065
  size_t len = strlen (parm->name);
6066
  bfd_boolean writing = FALSE;
6067
  char sym[16];
6068
 
6069
  if (htab == NULL)
6070
    return FALSE;
6071
 
6072
  memcpy (sym, parm->name, len);
6073
  sym[len + 2] = 0;
6074
 
6075
  for (i = parm->lo; i <= parm->hi; i++)
6076
    {
6077
      struct elf_link_hash_entry *h;
6078
 
6079
      sym[len + 0] = i / 10 + '0';
6080
      sym[len + 1] = i % 10 + '0';
6081
      h = elf_link_hash_lookup (&htab->elf, sym, FALSE, FALSE, TRUE);
6082
      if (h != NULL
6083
          && !h->def_regular)
6084
        {
6085
          h->root.type = bfd_link_hash_defined;
6086
          h->root.u.def.section = htab->sfpr;
6087
          h->root.u.def.value = htab->sfpr->size;
6088
          h->type = STT_FUNC;
6089
          h->def_regular = 1;
6090
          _bfd_elf_link_hash_hide_symbol (info, h, TRUE);
6091
          writing = TRUE;
6092
          if (htab->sfpr->contents == NULL)
6093
            {
6094
              htab->sfpr->contents = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
6095
              if (htab->sfpr->contents == NULL)
6096
                return FALSE;
6097
            }
6098
        }
6099
      if (writing)
6100
        {
6101
          bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
6102
          if (i != parm->hi)
6103
            p = (*parm->write_ent) (htab->elf.dynobj, p, i);
6104
          else
6105
            p = (*parm->write_tail) (htab->elf.dynobj, p, i);
6106
          htab->sfpr->size = p - htab->sfpr->contents;
6107
        }
6108
    }
6109
 
6110
  return TRUE;
6111
}
6112
 
6113
static bfd_byte *
6114
savegpr0 (bfd *abfd, bfd_byte *p, int r)
6115
{
6116
  bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6117
  return p + 4;
6118
}
6119
 
6120
static bfd_byte *
6121
savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
6122
{
6123
  p = savegpr0 (abfd, p, r);
6124
  bfd_put_32 (abfd, STD_R0_0R1 + 16, p);
6125
  p = p + 4;
6126
  bfd_put_32 (abfd, BLR, p);
6127
  return p + 4;
6128
}
6129
 
6130
static bfd_byte *
6131
restgpr0 (bfd *abfd, bfd_byte *p, int r)
6132
{
6133
  bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6134
  return p + 4;
6135
}
6136
 
6137
static bfd_byte *
6138
restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
6139
{
6140
  bfd_put_32 (abfd, LD_R0_0R1 + 16, p);
6141
  p = p + 4;
6142
  p = restgpr0 (abfd, p, r);
6143
  bfd_put_32 (abfd, MTLR_R0, p);
6144
  p = p + 4;
6145
  if (r == 29)
6146
    {
6147
      p = restgpr0 (abfd, p, 30);
6148
      p = restgpr0 (abfd, p, 31);
6149
    }
6150
  bfd_put_32 (abfd, BLR, p);
6151
  return p + 4;
6152
}
6153
 
6154
static bfd_byte *
6155
savegpr1 (bfd *abfd, bfd_byte *p, int r)
6156
{
6157
  bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6158
  return p + 4;
6159
}
6160
 
6161
static bfd_byte *
6162
savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
6163
{
6164
  p = savegpr1 (abfd, p, r);
6165
  bfd_put_32 (abfd, BLR, p);
6166
  return p + 4;
6167
}
6168
 
6169
static bfd_byte *
6170
restgpr1 (bfd *abfd, bfd_byte *p, int r)
6171
{
6172
  bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6173
  return p + 4;
6174
}
6175
 
6176
static bfd_byte *
6177
restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
6178
{
6179
  p = restgpr1 (abfd, p, r);
6180
  bfd_put_32 (abfd, BLR, p);
6181
  return p + 4;
6182
}
6183
 
6184
static bfd_byte *
6185
savefpr (bfd *abfd, bfd_byte *p, int r)
6186
{
6187
  bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6188
  return p + 4;
6189
}
6190
 
6191
static bfd_byte *
6192
savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
6193
{
6194
  p = savefpr (abfd, p, r);
6195
  bfd_put_32 (abfd, STD_R0_0R1 + 16, p);
6196
  p = p + 4;
6197
  bfd_put_32 (abfd, BLR, p);
6198
  return p + 4;
6199
}
6200
 
6201
static bfd_byte *
6202
restfpr (bfd *abfd, bfd_byte *p, int r)
6203
{
6204
  bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6205
  return p + 4;
6206
}
6207
 
6208
static bfd_byte *
6209
restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
6210
{
6211
  bfd_put_32 (abfd, LD_R0_0R1 + 16, p);
6212
  p = p + 4;
6213
  p = restfpr (abfd, p, r);
6214
  bfd_put_32 (abfd, MTLR_R0, p);
6215
  p = p + 4;
6216
  if (r == 29)
6217
    {
6218
      p = restfpr (abfd, p, 30);
6219
      p = restfpr (abfd, p, 31);
6220
    }
6221
  bfd_put_32 (abfd, BLR, p);
6222
  return p + 4;
6223
}
6224
 
6225
static bfd_byte *
6226
savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
6227
{
6228
  p = savefpr (abfd, p, r);
6229
  bfd_put_32 (abfd, BLR, p);
6230
  return p + 4;
6231
}
6232
 
6233
static bfd_byte *
6234
restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
6235
{
6236
  p = restfpr (abfd, p, r);
6237
  bfd_put_32 (abfd, BLR, p);
6238
  return p + 4;
6239
}
6240
 
6241
static bfd_byte *
6242
savevr (bfd *abfd, bfd_byte *p, int r)
6243
{
6244
  bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6245
  p = p + 4;
6246
  bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
6247
  return p + 4;
6248
}
6249
 
6250
static bfd_byte *
6251
savevr_tail (bfd *abfd, bfd_byte *p, int r)
6252
{
6253
  p = savevr (abfd, p, r);
6254
  bfd_put_32 (abfd, BLR, p);
6255
  return p + 4;
6256
}
6257
 
6258
static bfd_byte *
6259
restvr (bfd *abfd, bfd_byte *p, int r)
6260
{
6261
  bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6262
  p = p + 4;
6263
  bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
6264
  return p + 4;
6265
}
6266
 
6267
static bfd_byte *
6268
restvr_tail (bfd *abfd, bfd_byte *p, int r)
6269
{
6270
  p = restvr (abfd, p, r);
6271
  bfd_put_32 (abfd, BLR, p);
6272
  return p + 4;
6273
}
6274
 
6275
/* Called via elf_link_hash_traverse to transfer dynamic linking
6276
   information on function code symbol entries to their corresponding
6277
   function descriptor symbol entries.  */
6278
 
6279
static bfd_boolean
6280
func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
6281
{
6282
  struct bfd_link_info *info;
6283
  struct ppc_link_hash_table *htab;
6284
  struct plt_entry *ent;
6285
  struct ppc_link_hash_entry *fh;
6286
  struct ppc_link_hash_entry *fdh;
6287
  bfd_boolean force_local;
6288
 
6289
  fh = (struct ppc_link_hash_entry *) h;
6290
  if (fh->elf.root.type == bfd_link_hash_indirect)
6291
    return TRUE;
6292
 
6293
  info = inf;
6294
  htab = ppc_hash_table (info);
6295
  if (htab == NULL)
6296
    return FALSE;
6297
 
6298
  /* Resolve undefined references to dot-symbols as the value
6299
     in the function descriptor, if we have one in a regular object.
6300
     This is to satisfy cases like ".quad .foo".  Calls to functions
6301
     in dynamic objects are handled elsewhere.  */
6302
  if (fh->elf.root.type == bfd_link_hash_undefweak
6303
      && fh->was_undefined
6304
      && (fdh = defined_func_desc (fh)) != NULL
6305
      && get_opd_info (fdh->elf.root.u.def.section) != NULL
6306
      && opd_entry_value (fdh->elf.root.u.def.section,
6307
                          fdh->elf.root.u.def.value,
6308
                          &fh->elf.root.u.def.section,
6309
                          &fh->elf.root.u.def.value) != (bfd_vma) -1)
6310
    {
6311
      fh->elf.root.type = fdh->elf.root.type;
6312
      fh->elf.forced_local = 1;
6313
      fh->elf.def_regular = fdh->elf.def_regular;
6314
      fh->elf.def_dynamic = fdh->elf.def_dynamic;
6315
    }
6316
 
6317
  /* If this is a function code symbol, transfer dynamic linking
6318
     information to the function descriptor symbol.  */
6319
  if (!fh->is_func)
6320
    return TRUE;
6321
 
6322
  for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
6323
    if (ent->plt.refcount > 0)
6324
      break;
6325
  if (ent == NULL
6326
      || fh->elf.root.root.string[0] != '.'
6327
      || fh->elf.root.root.string[1] == '\0')
6328
    return TRUE;
6329
 
6330
  /* Find the corresponding function descriptor symbol.  Create it
6331
     as undefined if necessary.  */
6332
 
6333
  fdh = lookup_fdh (fh, htab);
6334
  if (fdh == NULL
6335
      && !info->executable
6336
      && (fh->elf.root.type == bfd_link_hash_undefined
6337
          || fh->elf.root.type == bfd_link_hash_undefweak))
6338
    {
6339
      fdh = make_fdh (info, fh);
6340
      if (fdh == NULL)
6341
        return FALSE;
6342
    }
6343
 
6344
  /* Fake function descriptors are made undefweak.  If the function
6345
     code symbol is strong undefined, make the fake sym the same.
6346
     If the function code symbol is defined, then force the fake
6347
     descriptor local;  We can't support overriding of symbols in a
6348
     shared library on a fake descriptor.  */
6349
 
6350
  if (fdh != NULL
6351
      && fdh->fake
6352
      && fdh->elf.root.type == bfd_link_hash_undefweak)
6353
    {
6354
      if (fh->elf.root.type == bfd_link_hash_undefined)
6355
        {
6356
          fdh->elf.root.type = bfd_link_hash_undefined;
6357
          bfd_link_add_undef (&htab->elf.root, &fdh->elf.root);
6358
        }
6359
      else if (fh->elf.root.type == bfd_link_hash_defined
6360
               || fh->elf.root.type == bfd_link_hash_defweak)
6361
        {
6362
          _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
6363
        }
6364
    }
6365
 
6366
  if (fdh != NULL
6367
      && !fdh->elf.forced_local
6368
      && (!info->executable
6369
          || fdh->elf.def_dynamic
6370
          || fdh->elf.ref_dynamic
6371
          || (fdh->elf.root.type == bfd_link_hash_undefweak
6372
              && ELF_ST_VISIBILITY (fdh->elf.other) == STV_DEFAULT)))
6373
    {
6374
      if (fdh->elf.dynindx == -1)
6375
        if (! bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
6376
          return FALSE;
6377
      fdh->elf.ref_regular |= fh->elf.ref_regular;
6378
      fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
6379
      fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
6380
      fdh->elf.non_got_ref |= fh->elf.non_got_ref;
6381
      if (ELF_ST_VISIBILITY (fh->elf.other) == STV_DEFAULT)
6382
        {
6383
          move_plt_plist (fh, fdh);
6384
          fdh->elf.needs_plt = 1;
6385
        }
6386
      fdh->is_func_descriptor = 1;
6387
      fdh->oh = fh;
6388
      fh->oh = fdh;
6389
    }
6390
 
6391
  /* Now that the info is on the function descriptor, clear the
6392
     function code sym info.  Any function code syms for which we
6393
     don't have a definition in a regular file, we force local.
6394
     This prevents a shared library from exporting syms that have
6395
     been imported from another library.  Function code syms that
6396
     are really in the library we must leave global to prevent the
6397
     linker dragging in a definition from a static library.  */
6398
  force_local = (!fh->elf.def_regular
6399
                 || fdh == NULL
6400
                 || !fdh->elf.def_regular
6401
                 || fdh->elf.forced_local);
6402
  _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
6403
 
6404
  return TRUE;
6405
}
6406
 
6407
/* Called near the start of bfd_elf_size_dynamic_sections.  We use
6408
   this hook to a) provide some gcc support functions, and b) transfer
6409
   dynamic linking information gathered so far on function code symbol
6410
   entries, to their corresponding function descriptor symbol entries.  */
6411
 
6412
static bfd_boolean
6413
ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
6414
                            struct bfd_link_info *info)
6415
{
6416
  struct ppc_link_hash_table *htab;
6417
  unsigned int i;
6418
  const struct sfpr_def_parms funcs[] =
6419
    {
6420
      { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
6421
      { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
6422
      { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
6423
      { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
6424
      { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
6425
      { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
6426
      { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
6427
      { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
6428
      { "._savef", 14, 31, savefpr, savefpr1_tail },
6429
      { "._restf", 14, 31, restfpr, restfpr1_tail },
6430
      { "_savevr_", 20, 31, savevr, savevr_tail },
6431
      { "_restvr_", 20, 31, restvr, restvr_tail }
6432
    };
6433
 
6434
  htab = ppc_hash_table (info);
6435
  if (htab == NULL)
6436
    return FALSE;
6437
 
6438
  if (htab->sfpr == NULL)
6439
    /* We don't have any relocs.  */
6440
    return TRUE;
6441
 
6442
  /* Provide any missing _save* and _rest* functions.  */
6443
  htab->sfpr->size = 0;
6444
  for (i = 0; i < sizeof (funcs) / sizeof (funcs[0]); i++)
6445
    if (!sfpr_define (info, &funcs[i]))
6446
      return FALSE;
6447
 
6448
  elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
6449
 
6450
  if (htab->sfpr->size == 0)
6451
    htab->sfpr->flags |= SEC_EXCLUDE;
6452
 
6453
  return TRUE;
6454
}
6455
 
6456
/* Adjust a symbol defined by a dynamic object and referenced by a
6457
   regular object.  The current definition is in some section of the
6458
   dynamic object, but we're not including those sections.  We have to
6459
   change the definition to something the rest of the link can
6460
   understand.  */
6461
 
6462
static bfd_boolean
6463
ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
6464
                                 struct elf_link_hash_entry *h)
6465
{
6466
  struct ppc_link_hash_table *htab;
6467
  asection *s;
6468
 
6469
  htab = ppc_hash_table (info);
6470
  if (htab == NULL)
6471
    return FALSE;
6472
 
6473
  /* Deal with function syms.  */
6474
  if (h->type == STT_FUNC
6475
      || h->type == STT_GNU_IFUNC
6476
      || h->needs_plt)
6477
    {
6478
      /* Clear procedure linkage table information for any symbol that
6479
         won't need a .plt entry.  */
6480
      struct plt_entry *ent;
6481
      for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6482
        if (ent->plt.refcount > 0)
6483
          break;
6484
      if (ent == NULL
6485
          || (h->type != STT_GNU_IFUNC
6486
              && (SYMBOL_CALLS_LOCAL (info, h)
6487
                  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
6488
                      && h->root.type == bfd_link_hash_undefweak))))
6489
        {
6490
          h->plt.plist = NULL;
6491
          h->needs_plt = 0;
6492
        }
6493
    }
6494
  else
6495
    h->plt.plist = NULL;
6496
 
6497
  /* If this is a weak symbol, and there is a real definition, the
6498
     processor independent code will have arranged for us to see the
6499
     real definition first, and we can just use the same value.  */
6500
  if (h->u.weakdef != NULL)
6501
    {
6502
      BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
6503
                  || h->u.weakdef->root.type == bfd_link_hash_defweak);
6504
      h->root.u.def.section = h->u.weakdef->root.u.def.section;
6505
      h->root.u.def.value = h->u.weakdef->root.u.def.value;
6506
      if (ELIMINATE_COPY_RELOCS)
6507
        h->non_got_ref = h->u.weakdef->non_got_ref;
6508
      return TRUE;
6509
    }
6510
 
6511
  /* If we are creating a shared library, we must presume that the
6512
     only references to the symbol are via the global offset table.
6513
     For such cases we need not do anything here; the relocations will
6514
     be handled correctly by relocate_section.  */
6515
  if (info->shared)
6516
    return TRUE;
6517
 
6518
  /* If there are no references to this symbol that do not use the
6519
     GOT, we don't need to generate a copy reloc.  */
6520
  if (!h->non_got_ref)
6521
    return TRUE;
6522
 
6523
  /* Don't generate a copy reloc for symbols defined in the executable.  */
6524
  if (!h->def_dynamic || !h->ref_regular || h->def_regular)
6525
    return TRUE;
6526
 
6527
  if (ELIMINATE_COPY_RELOCS)
6528
    {
6529
      struct ppc_link_hash_entry * eh;
6530
      struct elf_dyn_relocs *p;
6531
 
6532
      eh = (struct ppc_link_hash_entry *) h;
6533
      for (p = eh->dyn_relocs; p != NULL; p = p->next)
6534
        {
6535
          s = p->sec->output_section;
6536
          if (s != NULL && (s->flags & SEC_READONLY) != 0)
6537
            break;
6538
        }
6539
 
6540
      /* If we didn't find any dynamic relocs in read-only sections, then
6541
         we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
6542
      if (p == NULL)
6543
        {
6544
          h->non_got_ref = 0;
6545
          return TRUE;
6546
        }
6547
    }
6548
 
6549
  if (h->plt.plist != NULL)
6550
    {
6551
      /* We should never get here, but unfortunately there are versions
6552
         of gcc out there that improperly (for this ABI) put initialized
6553
         function pointers, vtable refs and suchlike in read-only
6554
         sections.  Allow them to proceed, but warn that this might
6555
         break at runtime.  */
6556
      info->callbacks->einfo
6557 161 khays
        (_("%P: copy reloc against `%s' requires lazy plt linking; "
6558 14 khays
           "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
6559
         h->root.root.string);
6560
    }
6561
 
6562
  /* This is a reference to a symbol defined by a dynamic object which
6563
     is not a function.  */
6564
 
6565
  if (h->size == 0)
6566
    {
6567 161 khays
      info->callbacks->einfo (_("%P: dynamic variable `%s' is zero size\n"),
6568 14 khays
                              h->root.root.string);
6569
      return TRUE;
6570
    }
6571
 
6572
  /* We must allocate the symbol in our .dynbss section, which will
6573
     become part of the .bss section of the executable.  There will be
6574
     an entry for this symbol in the .dynsym section.  The dynamic
6575
     object will contain position independent code, so all references
6576
     from the dynamic object to this symbol will go through the global
6577
     offset table.  The dynamic linker will use the .dynsym entry to
6578
     determine the address it must put in the global offset table, so
6579
     both the dynamic object and the regular object will refer to the
6580
     same memory location for the variable.  */
6581
 
6582
  /* We must generate a R_PPC64_COPY reloc to tell the dynamic linker
6583
     to copy the initial value out of the dynamic object and into the
6584
     runtime process image.  We need to remember the offset into the
6585
     .rela.bss section we are going to use.  */
6586
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
6587
    {
6588
      htab->relbss->size += sizeof (Elf64_External_Rela);
6589
      h->needs_copy = 1;
6590
    }
6591
 
6592
  s = htab->dynbss;
6593
 
6594
  return _bfd_elf_adjust_dynamic_copy (h, s);
6595
}
6596
 
6597
/* If given a function descriptor symbol, hide both the function code
6598
   sym and the descriptor.  */
6599
static void
6600
ppc64_elf_hide_symbol (struct bfd_link_info *info,
6601
                       struct elf_link_hash_entry *h,
6602
                       bfd_boolean force_local)
6603
{
6604
  struct ppc_link_hash_entry *eh;
6605
  _bfd_elf_link_hash_hide_symbol (info, h, force_local);
6606
 
6607
  eh = (struct ppc_link_hash_entry *) h;
6608
  if (eh->is_func_descriptor)
6609
    {
6610
      struct ppc_link_hash_entry *fh = eh->oh;
6611
 
6612
      if (fh == NULL)
6613
        {
6614
          const char *p, *q;
6615
          struct ppc_link_hash_table *htab;
6616
          char save;
6617
 
6618
          /* We aren't supposed to use alloca in BFD because on
6619
             systems which do not have alloca the version in libiberty
6620
             calls xmalloc, which might cause the program to crash
6621
             when it runs out of memory.  This function doesn't have a
6622
             return status, so there's no way to gracefully return an
6623
             error.  So cheat.  We know that string[-1] can be safely
6624
             accessed;  It's either a string in an ELF string table,
6625
             or allocated in an objalloc structure.  */
6626
 
6627
          p = eh->elf.root.root.string - 1;
6628
          save = *p;
6629
          *(char *) p = '.';
6630
          htab = ppc_hash_table (info);
6631
          if (htab == NULL)
6632
            return;
6633
 
6634
          fh = (struct ppc_link_hash_entry *)
6635
            elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
6636
          *(char *) p = save;
6637
 
6638
          /* Unfortunately, if it so happens that the string we were
6639
             looking for was allocated immediately before this string,
6640
             then we overwrote the string terminator.  That's the only
6641
             reason the lookup should fail.  */
6642
          if (fh == NULL)
6643
            {
6644
              q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
6645
              while (q >= eh->elf.root.root.string && *q == *p)
6646
                --q, --p;
6647
              if (q < eh->elf.root.root.string && *p == '.')
6648
                fh = (struct ppc_link_hash_entry *)
6649
                  elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
6650
            }
6651
          if (fh != NULL)
6652
            {
6653
              eh->oh = fh;
6654
              fh->oh = eh;
6655
            }
6656
        }
6657
      if (fh != NULL)
6658
        _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
6659
    }
6660
}
6661
 
6662
static bfd_boolean
6663
get_sym_h (struct elf_link_hash_entry **hp,
6664
           Elf_Internal_Sym **symp,
6665
           asection **symsecp,
6666
           unsigned char **tls_maskp,
6667
           Elf_Internal_Sym **locsymsp,
6668
           unsigned long r_symndx,
6669
           bfd *ibfd)
6670
{
6671
  Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
6672
 
6673
  if (r_symndx >= symtab_hdr->sh_info)
6674
    {
6675
      struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
6676
      struct elf_link_hash_entry *h;
6677
 
6678
      h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6679
      h = elf_follow_link (h);
6680
 
6681
      if (hp != NULL)
6682
        *hp = h;
6683
 
6684
      if (symp != NULL)
6685
        *symp = NULL;
6686
 
6687
      if (symsecp != NULL)
6688
        {
6689
          asection *symsec = NULL;
6690
          if (h->root.type == bfd_link_hash_defined
6691
              || h->root.type == bfd_link_hash_defweak)
6692
            symsec = h->root.u.def.section;
6693
          *symsecp = symsec;
6694
        }
6695
 
6696
      if (tls_maskp != NULL)
6697
        {
6698
          struct ppc_link_hash_entry *eh;
6699
 
6700
          eh = (struct ppc_link_hash_entry *) h;
6701
          *tls_maskp = &eh->tls_mask;
6702
        }
6703
    }
6704
  else
6705
    {
6706
      Elf_Internal_Sym *sym;
6707
      Elf_Internal_Sym *locsyms = *locsymsp;
6708
 
6709
      if (locsyms == NULL)
6710
        {
6711
          locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
6712
          if (locsyms == NULL)
6713
            locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
6714
                                            symtab_hdr->sh_info,
6715
                                            0, NULL, NULL, NULL);
6716
          if (locsyms == NULL)
6717
            return FALSE;
6718
          *locsymsp = locsyms;
6719
        }
6720
      sym = locsyms + r_symndx;
6721
 
6722
      if (hp != NULL)
6723
        *hp = NULL;
6724
 
6725
      if (symp != NULL)
6726
        *symp = sym;
6727
 
6728
      if (symsecp != NULL)
6729
        *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
6730
 
6731
      if (tls_maskp != NULL)
6732
        {
6733
          struct got_entry **lgot_ents;
6734
          unsigned char *tls_mask;
6735
 
6736
          tls_mask = NULL;
6737
          lgot_ents = elf_local_got_ents (ibfd);
6738
          if (lgot_ents != NULL)
6739
            {
6740
              struct plt_entry **local_plt = (struct plt_entry **)
6741
                (lgot_ents + symtab_hdr->sh_info);
6742
              unsigned char *lgot_masks = (unsigned char *)
6743
                (local_plt + symtab_hdr->sh_info);
6744
              tls_mask = &lgot_masks[r_symndx];
6745
            }
6746
          *tls_maskp = tls_mask;
6747
        }
6748
    }
6749
  return TRUE;
6750
}
6751
 
6752
/* Returns TLS_MASKP for the given REL symbol.  Function return is 0 on
6753
   error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
6754
   type suitable for optimization, and 1 otherwise.  */
6755
 
6756
static int
6757
get_tls_mask (unsigned char **tls_maskp,
6758
              unsigned long *toc_symndx,
6759
              bfd_vma *toc_addend,
6760
              Elf_Internal_Sym **locsymsp,
6761
              const Elf_Internal_Rela *rel,
6762
              bfd *ibfd)
6763
{
6764
  unsigned long r_symndx;
6765
  int next_r;
6766
  struct elf_link_hash_entry *h;
6767
  Elf_Internal_Sym *sym;
6768
  asection *sec;
6769
  bfd_vma off;
6770
 
6771
  r_symndx = ELF64_R_SYM (rel->r_info);
6772
  if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
6773
    return 0;
6774
 
6775
  if ((*tls_maskp != NULL && **tls_maskp != 0)
6776
      || sec == NULL
6777
      || ppc64_elf_section_data (sec) == NULL
6778
      || ppc64_elf_section_data (sec)->sec_type != sec_toc)
6779
    return 1;
6780
 
6781
  /* Look inside a TOC section too.  */
6782
  if (h != NULL)
6783
    {
6784
      BFD_ASSERT (h->root.type == bfd_link_hash_defined);
6785
      off = h->root.u.def.value;
6786
    }
6787
  else
6788
    off = sym->st_value;
6789
  off += rel->r_addend;
6790
  BFD_ASSERT (off % 8 == 0);
6791
  r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
6792
  next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
6793
  if (toc_symndx != NULL)
6794
    *toc_symndx = r_symndx;
6795
  if (toc_addend != NULL)
6796
    *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
6797
  if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
6798
    return 0;
6799
  if ((h == NULL || is_static_defined (h))
6800
      && (next_r == -1 || next_r == -2))
6801
    return 1 - next_r;
6802
  return 1;
6803
}
6804
 
6805 163 khays
/* Find (or create) an entry in the tocsave hash table.  */
6806
 
6807
static struct tocsave_entry *
6808
tocsave_find (struct ppc_link_hash_table *htab,
6809
              enum insert_option insert,
6810
              Elf_Internal_Sym **local_syms,
6811
              const Elf_Internal_Rela *irela,
6812
              bfd *ibfd)
6813
{
6814
  unsigned long r_indx;
6815
  struct elf_link_hash_entry *h;
6816
  Elf_Internal_Sym *sym;
6817
  struct tocsave_entry ent, *p;
6818
  hashval_t hash;
6819
  struct tocsave_entry **slot;
6820
 
6821
  r_indx = ELF64_R_SYM (irela->r_info);
6822
  if (!get_sym_h (&h, &sym, &ent.sec, NULL, local_syms, r_indx, ibfd))
6823
    return NULL;
6824
  if (ent.sec == NULL || ent.sec->output_section == NULL)
6825
    {
6826
      (*_bfd_error_handler)
6827
        (_("%B: undefined symbol on R_PPC64_TOCSAVE relocation"));
6828
      return NULL;
6829
    }
6830
 
6831
  if (h != NULL)
6832
    ent.offset = h->root.u.def.value;
6833
  else
6834
    ent.offset = sym->st_value;
6835
  ent.offset += irela->r_addend;
6836
 
6837
  hash = tocsave_htab_hash (&ent);
6838
  slot = ((struct tocsave_entry **)
6839
          htab_find_slot_with_hash (htab->tocsave_htab, &ent, hash, insert));
6840
  if (slot == NULL)
6841
    return NULL;
6842
 
6843
  if (*slot == NULL)
6844
    {
6845
      p = (struct tocsave_entry *) bfd_alloc (ibfd, sizeof (*p));
6846
      if (p == NULL)
6847
        return NULL;
6848
      *p = ent;
6849
      *slot = p;
6850
    }
6851
  return *slot;
6852
}
6853
 
6854 14 khays
/* Adjust all global syms defined in opd sections.  In gcc generated
6855
   code for the old ABI, these will already have been done.  */
6856
 
6857
static bfd_boolean
6858
adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
6859
{
6860
  struct ppc_link_hash_entry *eh;
6861
  asection *sym_sec;
6862
  struct _opd_sec_data *opd;
6863
 
6864
  if (h->root.type == bfd_link_hash_indirect)
6865
    return TRUE;
6866
 
6867
  if (h->root.type != bfd_link_hash_defined
6868
      && h->root.type != bfd_link_hash_defweak)
6869
    return TRUE;
6870
 
6871
  eh = (struct ppc_link_hash_entry *) h;
6872
  if (eh->adjust_done)
6873
    return TRUE;
6874
 
6875
  sym_sec = eh->elf.root.u.def.section;
6876
  opd = get_opd_info (sym_sec);
6877
  if (opd != NULL && opd->adjust != NULL)
6878
    {
6879
      long adjust = opd->adjust[eh->elf.root.u.def.value / 8];
6880
      if (adjust == -1)
6881
        {
6882
          /* This entry has been deleted.  */
6883
          asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
6884
          if (dsec == NULL)
6885
            {
6886
              for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
6887
                if (elf_discarded_section (dsec))
6888
                  {
6889
                    ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
6890
                    break;
6891
                  }
6892
            }
6893
          eh->elf.root.u.def.value = 0;
6894
          eh->elf.root.u.def.section = dsec;
6895
        }
6896
      else
6897
        eh->elf.root.u.def.value += adjust;
6898
      eh->adjust_done = 1;
6899
    }
6900
  return TRUE;
6901
}
6902
 
6903
/* Handles decrementing dynamic reloc counts for the reloc specified by
6904
   R_INFO in section SEC.  If LOCAL_SYMS is NULL, then H and SYM_SEC
6905
   have already been determined.  */
6906
 
6907
static bfd_boolean
6908
dec_dynrel_count (bfd_vma r_info,
6909
                  asection *sec,
6910
                  struct bfd_link_info *info,
6911
                  Elf_Internal_Sym **local_syms,
6912
                  struct elf_link_hash_entry *h,
6913
                  asection *sym_sec)
6914
{
6915
  enum elf_ppc64_reloc_type r_type;
6916
  struct elf_dyn_relocs *p;
6917
  struct elf_dyn_relocs **pp;
6918
 
6919
  /* Can this reloc be dynamic?  This switch, and later tests here
6920
     should be kept in sync with the code in check_relocs.  */
6921
  r_type = ELF64_R_TYPE (r_info);
6922
  switch (r_type)
6923
    {
6924
    default:
6925
      return TRUE;
6926
 
6927
    case R_PPC64_TPREL16:
6928
    case R_PPC64_TPREL16_LO:
6929
    case R_PPC64_TPREL16_HI:
6930
    case R_PPC64_TPREL16_HA:
6931
    case R_PPC64_TPREL16_DS:
6932
    case R_PPC64_TPREL16_LO_DS:
6933
    case R_PPC64_TPREL16_HIGHER:
6934
    case R_PPC64_TPREL16_HIGHERA:
6935
    case R_PPC64_TPREL16_HIGHEST:
6936
    case R_PPC64_TPREL16_HIGHESTA:
6937
      if (!info->shared)
6938
        return TRUE;
6939
 
6940
    case R_PPC64_TPREL64:
6941
    case R_PPC64_DTPMOD64:
6942
    case R_PPC64_DTPREL64:
6943
    case R_PPC64_ADDR64:
6944
    case R_PPC64_REL30:
6945
    case R_PPC64_REL32:
6946
    case R_PPC64_REL64:
6947
    case R_PPC64_ADDR14:
6948
    case R_PPC64_ADDR14_BRNTAKEN:
6949
    case R_PPC64_ADDR14_BRTAKEN:
6950
    case R_PPC64_ADDR16:
6951
    case R_PPC64_ADDR16_DS:
6952
    case R_PPC64_ADDR16_HA:
6953
    case R_PPC64_ADDR16_HI:
6954
    case R_PPC64_ADDR16_HIGHER:
6955
    case R_PPC64_ADDR16_HIGHERA:
6956
    case R_PPC64_ADDR16_HIGHEST:
6957
    case R_PPC64_ADDR16_HIGHESTA:
6958
    case R_PPC64_ADDR16_LO:
6959
    case R_PPC64_ADDR16_LO_DS:
6960
    case R_PPC64_ADDR24:
6961
    case R_PPC64_ADDR32:
6962
    case R_PPC64_UADDR16:
6963
    case R_PPC64_UADDR32:
6964
    case R_PPC64_UADDR64:
6965
    case R_PPC64_TOC:
6966
      break;
6967
    }
6968
 
6969
  if (local_syms != NULL)
6970
    {
6971
      unsigned long r_symndx;
6972
      Elf_Internal_Sym *sym;
6973
      bfd *ibfd = sec->owner;
6974
 
6975
      r_symndx = ELF64_R_SYM (r_info);
6976
      if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
6977
        return FALSE;
6978
    }
6979
 
6980
  if ((info->shared
6981
       && (must_be_dyn_reloc (info, r_type)
6982
           || (h != NULL
6983
               && (!info->symbolic
6984
                   || h->root.type == bfd_link_hash_defweak
6985
                   || !h->def_regular))))
6986
      || (ELIMINATE_COPY_RELOCS
6987
          && !info->shared
6988
          && h != NULL
6989
          && (h->root.type == bfd_link_hash_defweak
6990
              || !h->def_regular)))
6991
    ;
6992
  else
6993
    return TRUE;
6994
 
6995
  if (h != NULL)
6996
    pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
6997
  else
6998
    {
6999
      if (sym_sec != NULL)
7000
        {
7001
          void *vpp = &elf_section_data (sym_sec)->local_dynrel;
7002
          pp = (struct elf_dyn_relocs **) vpp;
7003
        }
7004
      else
7005
        {
7006
          void *vpp = &elf_section_data (sec)->local_dynrel;
7007
          pp = (struct elf_dyn_relocs **) vpp;
7008
        }
7009
 
7010
      /* elf_gc_sweep may have already removed all dyn relocs associated
7011
         with local syms for a given section.  Don't report a dynreloc
7012
         miscount.  */
7013
      if (*pp == NULL)
7014
        return TRUE;
7015
    }
7016
 
7017
  while ((p = *pp) != NULL)
7018
    {
7019
      if (p->sec == sec)
7020
        {
7021
          if (!must_be_dyn_reloc (info, r_type))
7022
            p->pc_count -= 1;
7023
          p->count -= 1;
7024
          if (p->count == 0)
7025
            *pp = p->next;
7026
          return TRUE;
7027
        }
7028
      pp = &p->next;
7029
    }
7030
 
7031 161 khays
  info->callbacks->einfo (_("%P: dynreloc miscount for %B, section %A\n"),
7032 14 khays
                          sec->owner, sec);
7033
  bfd_set_error (bfd_error_bad_value);
7034
  return FALSE;
7035
}
7036
 
7037
/* Remove unused Official Procedure Descriptor entries.  Currently we
7038
   only remove those associated with functions in discarded link-once
7039
   sections, or weakly defined functions that have been overridden.  It
7040
   would be possible to remove many more entries for statically linked
7041
   applications.  */
7042
 
7043
bfd_boolean
7044
ppc64_elf_edit_opd (struct bfd_link_info *info, bfd_boolean non_overlapping)
7045
{
7046
  bfd *ibfd;
7047
  bfd_boolean some_edited = FALSE;
7048
  asection *need_pad = NULL;
7049
 
7050
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
7051
    {
7052
      asection *sec;
7053
      Elf_Internal_Rela *relstart, *rel, *relend;
7054
      Elf_Internal_Shdr *symtab_hdr;
7055
      Elf_Internal_Sym *local_syms;
7056
      bfd_vma offset;
7057
      struct _opd_sec_data *opd;
7058
      bfd_boolean need_edit, add_aux_fields;
7059
      bfd_size_type cnt_16b = 0;
7060
 
7061
      if (!is_ppc64_elf (ibfd))
7062
        continue;
7063
 
7064
      sec = bfd_get_section_by_name (ibfd, ".opd");
7065
      if (sec == NULL || sec->size == 0)
7066
        continue;
7067
 
7068
      if (sec->sec_info_type == ELF_INFO_TYPE_JUST_SYMS)
7069
        continue;
7070
 
7071
      if (sec->output_section == bfd_abs_section_ptr)
7072
        continue;
7073
 
7074
      /* Look through the section relocs.  */
7075
      if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
7076
        continue;
7077
 
7078
      local_syms = NULL;
7079
      symtab_hdr = &elf_symtab_hdr (ibfd);
7080
 
7081
      /* Read the relocations.  */
7082
      relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7083
                                            info->keep_memory);
7084
      if (relstart == NULL)
7085
        return FALSE;
7086
 
7087
      /* First run through the relocs to check they are sane, and to
7088
         determine whether we need to edit this opd section.  */
7089
      need_edit = FALSE;
7090
      need_pad = sec;
7091
      offset = 0;
7092
      relend = relstart + sec->reloc_count;
7093
      for (rel = relstart; rel < relend; )
7094
        {
7095
          enum elf_ppc64_reloc_type r_type;
7096
          unsigned long r_symndx;
7097
          asection *sym_sec;
7098
          struct elf_link_hash_entry *h;
7099
          Elf_Internal_Sym *sym;
7100
 
7101
          /* .opd contains a regular array of 16 or 24 byte entries.  We're
7102
             only interested in the reloc pointing to a function entry
7103
             point.  */
7104
          if (rel->r_offset != offset
7105
              || rel + 1 >= relend
7106
              || (rel + 1)->r_offset != offset + 8)
7107
            {
7108
              /* If someone messes with .opd alignment then after a
7109
                 "ld -r" we might have padding in the middle of .opd.
7110
                 Also, there's nothing to prevent someone putting
7111
                 something silly in .opd with the assembler.  No .opd
7112
                 optimization for them!  */
7113
            broken_opd:
7114
              (*_bfd_error_handler)
7115
                (_("%B: .opd is not a regular array of opd entries"), ibfd);
7116
              need_edit = FALSE;
7117
              break;
7118
            }
7119
 
7120
          if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
7121
              || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
7122
            {
7123
              (*_bfd_error_handler)
7124
                (_("%B: unexpected reloc type %u in .opd section"),
7125
                 ibfd, r_type);
7126
              need_edit = FALSE;
7127
              break;
7128
            }
7129
 
7130
          r_symndx = ELF64_R_SYM (rel->r_info);
7131
          if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7132
                          r_symndx, ibfd))
7133
            goto error_ret;
7134
 
7135
          if (sym_sec == NULL || sym_sec->owner == NULL)
7136
            {
7137
              const char *sym_name;
7138
              if (h != NULL)
7139
                sym_name = h->root.root.string;
7140
              else
7141
                sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7142
                                             sym_sec);
7143
 
7144
              (*_bfd_error_handler)
7145
                (_("%B: undefined sym `%s' in .opd section"),
7146
                 ibfd, sym_name);
7147
              need_edit = FALSE;
7148
              break;
7149
            }
7150
 
7151
          /* opd entries are always for functions defined in the
7152
             current input bfd.  If the symbol isn't defined in the
7153
             input bfd, then we won't be using the function in this
7154
             bfd;  It must be defined in a linkonce section in another
7155
             bfd, or is weak.  It's also possible that we are
7156
             discarding the function due to a linker script /DISCARD/,
7157
             which we test for via the output_section.  */
7158
          if (sym_sec->owner != ibfd
7159
              || sym_sec->output_section == bfd_abs_section_ptr)
7160
            need_edit = TRUE;
7161
 
7162
          rel += 2;
7163
          if (rel == relend
7164
              || (rel + 1 == relend && rel->r_offset == offset + 16))
7165
            {
7166
              if (sec->size == offset + 24)
7167
                {
7168
                  need_pad = NULL;
7169
                  break;
7170
                }
7171
              if (rel == relend && sec->size == offset + 16)
7172
                {
7173
                  cnt_16b++;
7174
                  break;
7175
                }
7176
              goto broken_opd;
7177
            }
7178
 
7179
          if (rel->r_offset == offset + 24)
7180
            offset += 24;
7181
          else if (rel->r_offset != offset + 16)
7182
            goto broken_opd;
7183
          else if (rel + 1 < relend
7184
                   && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
7185
                   && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
7186
            {
7187
              offset += 16;
7188
              cnt_16b++;
7189
            }
7190
          else if (rel + 2 < relend
7191
                   && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_ADDR64
7192
                   && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC)
7193
            {
7194
              offset += 24;
7195
              rel += 1;
7196
            }
7197
          else
7198
            goto broken_opd;
7199
        }
7200
 
7201
      add_aux_fields = non_overlapping && cnt_16b > 0;
7202
 
7203
      if (need_edit || add_aux_fields)
7204
        {
7205
          Elf_Internal_Rela *write_rel;
7206
          Elf_Internal_Shdr *rel_hdr;
7207
          bfd_byte *rptr, *wptr;
7208
          bfd_byte *new_contents;
7209
          bfd_boolean skip;
7210
          long opd_ent_size;
7211
          bfd_size_type amt;
7212
 
7213
          new_contents = NULL;
7214
          amt = sec->size * sizeof (long) / 8;
7215
          opd = &ppc64_elf_section_data (sec)->u.opd;
7216
          opd->adjust = bfd_zalloc (sec->owner, amt);
7217
          if (opd->adjust == NULL)
7218
            return FALSE;
7219
          ppc64_elf_section_data (sec)->sec_type = sec_opd;
7220
 
7221
          /* This seems a waste of time as input .opd sections are all
7222
             zeros as generated by gcc, but I suppose there's no reason
7223
             this will always be so.  We might start putting something in
7224
             the third word of .opd entries.  */
7225
          if ((sec->flags & SEC_IN_MEMORY) == 0)
7226
            {
7227
              bfd_byte *loc;
7228
              if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
7229
                {
7230
                  if (loc != NULL)
7231
                    free (loc);
7232
                error_ret:
7233
                  if (local_syms != NULL
7234
                      && symtab_hdr->contents != (unsigned char *) local_syms)
7235
                    free (local_syms);
7236
                  if (elf_section_data (sec)->relocs != relstart)
7237
                    free (relstart);
7238
                  return FALSE;
7239
                }
7240
              sec->contents = loc;
7241
              sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7242
            }
7243
 
7244
          elf_section_data (sec)->relocs = relstart;
7245
 
7246
          new_contents = sec->contents;
7247
          if (add_aux_fields)
7248
            {
7249
              new_contents = bfd_malloc (sec->size + cnt_16b * 8);
7250
              if (new_contents == NULL)
7251
                return FALSE;
7252
              need_pad = FALSE;
7253
            }
7254
          wptr = new_contents;
7255
          rptr = sec->contents;
7256
 
7257
          write_rel = relstart;
7258
          skip = FALSE;
7259
          offset = 0;
7260
          opd_ent_size = 0;
7261
          for (rel = relstart; rel < relend; rel++)
7262
            {
7263
              unsigned long r_symndx;
7264
              asection *sym_sec;
7265
              struct elf_link_hash_entry *h;
7266
              Elf_Internal_Sym *sym;
7267
 
7268
              r_symndx = ELF64_R_SYM (rel->r_info);
7269
              if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7270
                              r_symndx, ibfd))
7271
                goto error_ret;
7272
 
7273
              if (rel->r_offset == offset)
7274
                {
7275
                  struct ppc_link_hash_entry *fdh = NULL;
7276
 
7277
                  /* See if the .opd entry is full 24 byte or
7278
                     16 byte (with fd_aux entry overlapped with next
7279
                     fd_func).  */
7280
                  opd_ent_size = 24;
7281
                  if ((rel + 2 == relend && sec->size == offset + 16)
7282
                      || (rel + 3 < relend
7283
                          && rel[2].r_offset == offset + 16
7284
                          && rel[3].r_offset == offset + 24
7285
                          && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_ADDR64
7286
                          && ELF64_R_TYPE (rel[3].r_info) == R_PPC64_TOC))
7287
                    opd_ent_size = 16;
7288
 
7289
                  if (h != NULL
7290
                      && h->root.root.string[0] == '.')
7291
                    {
7292
                      struct ppc_link_hash_table *htab;
7293
 
7294
                      htab = ppc_hash_table (info);
7295
                      if (htab != NULL)
7296
                        fdh = lookup_fdh ((struct ppc_link_hash_entry *) h,
7297
                                          htab);
7298
                      if (fdh != NULL
7299
                          && fdh->elf.root.type != bfd_link_hash_defined
7300
                          && fdh->elf.root.type != bfd_link_hash_defweak)
7301
                        fdh = NULL;
7302
                    }
7303
 
7304
                  skip = (sym_sec->owner != ibfd
7305
                          || sym_sec->output_section == bfd_abs_section_ptr);
7306
                  if (skip)
7307
                    {
7308
                      if (fdh != NULL && sym_sec->owner == ibfd)
7309
                        {
7310
                          /* Arrange for the function descriptor sym
7311
                             to be dropped.  */
7312
                          fdh->elf.root.u.def.value = 0;
7313
                          fdh->elf.root.u.def.section = sym_sec;
7314
                        }
7315
                      opd->adjust[rel->r_offset / 8] = -1;
7316
                    }
7317
                  else
7318
                    {
7319
                      /* We'll be keeping this opd entry.  */
7320
 
7321
                      if (fdh != NULL)
7322
                        {
7323
                          /* Redefine the function descriptor symbol to
7324
                             this location in the opd section.  It is
7325
                             necessary to update the value here rather
7326
                             than using an array of adjustments as we do
7327
                             for local symbols, because various places
7328
                             in the generic ELF code use the value
7329
                             stored in u.def.value.  */
7330
                          fdh->elf.root.u.def.value = wptr - new_contents;
7331
                          fdh->adjust_done = 1;
7332
                        }
7333
 
7334
                      /* Local syms are a bit tricky.  We could
7335
                         tweak them as they can be cached, but
7336
                         we'd need to look through the local syms
7337
                         for the function descriptor sym which we
7338
                         don't have at the moment.  So keep an
7339
                         array of adjustments.  */
7340
                      opd->adjust[rel->r_offset / 8]
7341
                        = (wptr - new_contents) - (rptr - sec->contents);
7342
 
7343
                      if (wptr != rptr)
7344
                        memcpy (wptr, rptr, opd_ent_size);
7345
                      wptr += opd_ent_size;
7346
                      if (add_aux_fields && opd_ent_size == 16)
7347
                        {
7348
                          memset (wptr, '\0', 8);
7349
                          wptr += 8;
7350
                        }
7351
                    }
7352
                  rptr += opd_ent_size;
7353
                  offset += opd_ent_size;
7354
                }
7355
 
7356
              if (skip)
7357
                {
7358
                  if (!NO_OPD_RELOCS
7359
                      && !info->relocatable
7360
                      && !dec_dynrel_count (rel->r_info, sec, info,
7361
                                            NULL, h, sym_sec))
7362
                    goto error_ret;
7363
                }
7364
              else
7365
                {
7366
                  /* We need to adjust any reloc offsets to point to the
7367
                     new opd entries.  While we're at it, we may as well
7368
                     remove redundant relocs.  */
7369
                  rel->r_offset += opd->adjust[(offset - opd_ent_size) / 8];
7370
                  if (write_rel != rel)
7371
                    memcpy (write_rel, rel, sizeof (*rel));
7372
                  ++write_rel;
7373
                }
7374
            }
7375
 
7376
          sec->size = wptr - new_contents;
7377
          sec->reloc_count = write_rel - relstart;
7378
          if (add_aux_fields)
7379
            {
7380
              free (sec->contents);
7381
              sec->contents = new_contents;
7382
            }
7383
 
7384
          /* Fudge the header size too, as this is used later in
7385
             elf_bfd_final_link if we are emitting relocs.  */
7386
          rel_hdr = _bfd_elf_single_rel_hdr (sec);
7387
          rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize;
7388
          some_edited = TRUE;
7389
        }
7390
      else if (elf_section_data (sec)->relocs != relstart)
7391
        free (relstart);
7392
 
7393
      if (local_syms != NULL
7394
          && symtab_hdr->contents != (unsigned char *) local_syms)
7395
        {
7396
          if (!info->keep_memory)
7397
            free (local_syms);
7398
          else
7399
            symtab_hdr->contents = (unsigned char *) local_syms;
7400
        }
7401
    }
7402
 
7403
  if (some_edited)
7404
    elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
7405
 
7406
  /* If we are doing a final link and the last .opd entry is just 16 byte
7407
     long, add a 8 byte padding after it.  */
7408
  if (need_pad != NULL && !info->relocatable)
7409
    {
7410
      bfd_byte *p;
7411
 
7412
      if ((need_pad->flags & SEC_IN_MEMORY) == 0)
7413
        {
7414
          BFD_ASSERT (need_pad->size > 0);
7415
 
7416
          p = bfd_malloc (need_pad->size + 8);
7417
          if (p == NULL)
7418
            return FALSE;
7419
 
7420
          if (! bfd_get_section_contents (need_pad->owner, need_pad,
7421
                                          p, 0, need_pad->size))
7422
            return FALSE;
7423
 
7424
          need_pad->contents = p;
7425
          need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7426
        }
7427
      else
7428
        {
7429
          p = bfd_realloc (need_pad->contents, need_pad->size + 8);
7430
          if (p == NULL)
7431
            return FALSE;
7432
 
7433
          need_pad->contents = p;
7434
        }
7435
 
7436
      memset (need_pad->contents + need_pad->size, 0, 8);
7437
      need_pad->size += 8;
7438
    }
7439
 
7440
  return TRUE;
7441
}
7442
 
7443
/* Set htab->tls_get_addr and call the generic ELF tls_setup function.  */
7444
 
7445
asection *
7446
ppc64_elf_tls_setup (struct bfd_link_info *info,
7447
                     int no_tls_get_addr_opt,
7448
                     int *no_multi_toc)
7449
{
7450
  struct ppc_link_hash_table *htab;
7451
 
7452
  htab = ppc_hash_table (info);
7453
  if (htab == NULL)
7454
    return NULL;
7455
 
7456
  if (*no_multi_toc)
7457
    htab->do_multi_toc = 0;
7458
  else if (!htab->do_multi_toc)
7459
    *no_multi_toc = 1;
7460
 
7461
  htab->tls_get_addr = ((struct ppc_link_hash_entry *)
7462
                        elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
7463
                                              FALSE, FALSE, TRUE));
7464
  /* Move dynamic linking info to the function descriptor sym.  */
7465
  if (htab->tls_get_addr != NULL)
7466
    func_desc_adjust (&htab->tls_get_addr->elf, info);
7467
  htab->tls_get_addr_fd = ((struct ppc_link_hash_entry *)
7468
                           elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
7469
                                                 FALSE, FALSE, TRUE));
7470
  if (!no_tls_get_addr_opt)
7471
    {
7472
      struct elf_link_hash_entry *opt, *opt_fd, *tga, *tga_fd;
7473
 
7474
      opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt",
7475
                                  FALSE, FALSE, TRUE);
7476
      if (opt != NULL)
7477
        func_desc_adjust (opt, info);
7478
      opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
7479
                                     FALSE, FALSE, TRUE);
7480
      if (opt_fd != NULL
7481
          && (opt_fd->root.type == bfd_link_hash_defined
7482
              || opt_fd->root.type == bfd_link_hash_defweak))
7483
        {
7484
          /* If glibc supports an optimized __tls_get_addr call stub,
7485
             signalled by the presence of __tls_get_addr_opt, and we'll
7486
             be calling __tls_get_addr via a plt call stub, then
7487
             make __tls_get_addr point to __tls_get_addr_opt.  */
7488
          tga_fd = &htab->tls_get_addr_fd->elf;
7489
          if (htab->elf.dynamic_sections_created
7490
              && tga_fd != NULL
7491
              && (tga_fd->type == STT_FUNC
7492
                  || tga_fd->needs_plt)
7493
              && !(SYMBOL_CALLS_LOCAL (info, tga_fd)
7494
                   || (ELF_ST_VISIBILITY (tga_fd->other) != STV_DEFAULT
7495
                       && tga_fd->root.type == bfd_link_hash_undefweak)))
7496
            {
7497
              struct plt_entry *ent;
7498
 
7499
              for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next)
7500
                if (ent->plt.refcount > 0)
7501
                  break;
7502
              if (ent != NULL)
7503
                {
7504
                  tga_fd->root.type = bfd_link_hash_indirect;
7505
                  tga_fd->root.u.i.link = &opt_fd->root;
7506
                  ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd);
7507
                  if (opt_fd->dynindx != -1)
7508
                    {
7509
                      /* Use __tls_get_addr_opt in dynamic relocations.  */
7510
                      opt_fd->dynindx = -1;
7511
                      _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
7512
                                              opt_fd->dynstr_index);
7513
                      if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd))
7514
                        return NULL;
7515
                    }
7516
                  htab->tls_get_addr_fd = (struct ppc_link_hash_entry *) opt_fd;
7517
                  tga = &htab->tls_get_addr->elf;
7518
                  if (opt != NULL && tga != NULL)
7519
                    {
7520
                      tga->root.type = bfd_link_hash_indirect;
7521
                      tga->root.u.i.link = &opt->root;
7522
                      ppc64_elf_copy_indirect_symbol (info, opt, tga);
7523
                      _bfd_elf_link_hash_hide_symbol (info, opt,
7524
                                                      tga->forced_local);
7525
                      htab->tls_get_addr = (struct ppc_link_hash_entry *) opt;
7526
                    }
7527
                  htab->tls_get_addr_fd->oh = htab->tls_get_addr;
7528
                  htab->tls_get_addr_fd->is_func_descriptor = 1;
7529
                  if (htab->tls_get_addr != NULL)
7530
                    {
7531
                      htab->tls_get_addr->oh = htab->tls_get_addr_fd;
7532
                      htab->tls_get_addr->is_func = 1;
7533
                    }
7534
                }
7535
            }
7536
        }
7537
      else
7538
        no_tls_get_addr_opt = TRUE;
7539
    }
7540
  htab->no_tls_get_addr_opt = no_tls_get_addr_opt;
7541
  return _bfd_elf_tls_setup (info->output_bfd, info);
7542
}
7543
 
7544
/* Return TRUE iff REL is a branch reloc with a global symbol matching
7545
   HASH1 or HASH2.  */
7546
 
7547
static bfd_boolean
7548
branch_reloc_hash_match (const bfd *ibfd,
7549
                         const Elf_Internal_Rela *rel,
7550
                         const struct ppc_link_hash_entry *hash1,
7551
                         const struct ppc_link_hash_entry *hash2)
7552
{
7553
  Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
7554
  enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
7555
  unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
7556
 
7557
  if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
7558
    {
7559
      struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7560
      struct elf_link_hash_entry *h;
7561
 
7562
      h = sym_hashes[r_symndx - symtab_hdr->sh_info];
7563
      h = elf_follow_link (h);
7564
      if (h == &hash1->elf || h == &hash2->elf)
7565
        return TRUE;
7566
    }
7567
  return FALSE;
7568
}
7569
 
7570
/* Run through all the TLS relocs looking for optimization
7571
   opportunities.  The linker has been hacked (see ppc64elf.em) to do
7572
   a preliminary section layout so that we know the TLS segment
7573
   offsets.  We can't optimize earlier because some optimizations need
7574
   to know the tp offset, and we need to optimize before allocating
7575
   dynamic relocations.  */
7576
 
7577
bfd_boolean
7578
ppc64_elf_tls_optimize (struct bfd_link_info *info)
7579
{
7580
  bfd *ibfd;
7581
  asection *sec;
7582
  struct ppc_link_hash_table *htab;
7583
  unsigned char *toc_ref;
7584
  int pass;
7585
 
7586
  if (info->relocatable || !info->executable)
7587
    return TRUE;
7588
 
7589
  htab = ppc_hash_table (info);
7590
  if (htab == NULL)
7591
    return FALSE;
7592
 
7593
  /* Make two passes over the relocs.  On the first pass, mark toc
7594
     entries involved with tls relocs, and check that tls relocs
7595
     involved in setting up a tls_get_addr call are indeed followed by
7596
     such a call.  If they are not, we can't do any tls optimization.
7597
     On the second pass twiddle tls_mask flags to notify
7598
     relocate_section that optimization can be done, and adjust got
7599
     and plt refcounts.  */
7600
  toc_ref = NULL;
7601
  for (pass = 0; pass < 2; ++pass)
7602
    for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
7603
      {
7604
        Elf_Internal_Sym *locsyms = NULL;
7605
        asection *toc = bfd_get_section_by_name (ibfd, ".toc");
7606
 
7607
        for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7608
          if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
7609
            {
7610
              Elf_Internal_Rela *relstart, *rel, *relend;
7611
              bfd_boolean found_tls_get_addr_arg = 0;
7612
 
7613
              /* Read the relocations.  */
7614
              relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7615
                                                    info->keep_memory);
7616
              if (relstart == NULL)
7617
                return FALSE;
7618
 
7619
              relend = relstart + sec->reloc_count;
7620
              for (rel = relstart; rel < relend; rel++)
7621
                {
7622
                  enum elf_ppc64_reloc_type r_type;
7623
                  unsigned long r_symndx;
7624
                  struct elf_link_hash_entry *h;
7625
                  Elf_Internal_Sym *sym;
7626
                  asection *sym_sec;
7627
                  unsigned char *tls_mask;
7628
                  unsigned char tls_set, tls_clear, tls_type = 0;
7629
                  bfd_vma value;
7630
                  bfd_boolean ok_tprel, is_local;
7631
                  long toc_ref_index = 0;
7632
                  int expecting_tls_get_addr = 0;
7633
                  bfd_boolean ret = FALSE;
7634
 
7635
                  r_symndx = ELF64_R_SYM (rel->r_info);
7636
                  if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
7637
                                  r_symndx, ibfd))
7638
                    {
7639
                    err_free_rel:
7640
                      if (elf_section_data (sec)->relocs != relstart)
7641
                        free (relstart);
7642
                      if (toc_ref != NULL)
7643
                        free (toc_ref);
7644
                      if (locsyms != NULL
7645
                          && (elf_symtab_hdr (ibfd).contents
7646
                              != (unsigned char *) locsyms))
7647
                        free (locsyms);
7648
                      return ret;
7649
                    }
7650
 
7651
                  if (h != NULL)
7652
                    {
7653
                      if (h->root.type == bfd_link_hash_defined
7654
                          || h->root.type == bfd_link_hash_defweak)
7655
                        value = h->root.u.def.value;
7656
                      else if (h->root.type == bfd_link_hash_undefweak)
7657
                        value = 0;
7658
                      else
7659
                        {
7660
                          found_tls_get_addr_arg = 0;
7661
                          continue;
7662
                        }
7663
                    }
7664
                  else
7665
                    /* Symbols referenced by TLS relocs must be of type
7666
                       STT_TLS.  So no need for .opd local sym adjust.  */
7667
                    value = sym->st_value;
7668
 
7669
                  ok_tprel = FALSE;
7670
                  is_local = FALSE;
7671
                  if (h == NULL
7672
                      || !h->def_dynamic)
7673
                    {
7674
                      is_local = TRUE;
7675
                      if (h != NULL
7676
                          && h->root.type == bfd_link_hash_undefweak)
7677
                        ok_tprel = TRUE;
7678
                      else
7679
                        {
7680
                          value += sym_sec->output_offset;
7681
                          value += sym_sec->output_section->vma;
7682
                          value -= htab->elf.tls_sec->vma;
7683
                          ok_tprel = (value + TP_OFFSET + ((bfd_vma) 1 << 31)
7684
                                      < (bfd_vma) 1 << 32);
7685
                        }
7686
                    }
7687
 
7688
                  r_type = ELF64_R_TYPE (rel->r_info);
7689
                  /* If this section has old-style __tls_get_addr calls
7690
                     without marker relocs, then check that each
7691
                     __tls_get_addr call reloc is preceded by a reloc
7692
                     that conceivably belongs to the __tls_get_addr arg
7693
                     setup insn.  If we don't find matching arg setup
7694
                     relocs, don't do any tls optimization.  */
7695
                  if (pass == 0
7696
                      && sec->has_tls_get_addr_call
7697
                      && h != NULL
7698
                      && (h == &htab->tls_get_addr->elf
7699
                          || h == &htab->tls_get_addr_fd->elf)
7700
                      && !found_tls_get_addr_arg
7701
                      && is_branch_reloc (r_type))
7702
                    {
7703
                      info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
7704
                                                "TLS optimization disabled\n"),
7705
                                              ibfd, sec, rel->r_offset);
7706
                      ret = TRUE;
7707
                      goto err_free_rel;
7708
                    }
7709
 
7710
                  found_tls_get_addr_arg = 0;
7711
                  switch (r_type)
7712
                    {
7713
                    case R_PPC64_GOT_TLSLD16:
7714
                    case R_PPC64_GOT_TLSLD16_LO:
7715
                      expecting_tls_get_addr = 1;
7716
                      found_tls_get_addr_arg = 1;
7717
                      /* Fall thru */
7718
 
7719
                    case R_PPC64_GOT_TLSLD16_HI:
7720
                    case R_PPC64_GOT_TLSLD16_HA:
7721
                      /* These relocs should never be against a symbol
7722
                         defined in a shared lib.  Leave them alone if
7723
                         that turns out to be the case.  */
7724
                      if (!is_local)
7725
                        continue;
7726
 
7727
                      /* LD -> LE */
7728
                      tls_set = 0;
7729
                      tls_clear = TLS_LD;
7730
                      tls_type = TLS_TLS | TLS_LD;
7731
                      break;
7732
 
7733
                    case R_PPC64_GOT_TLSGD16:
7734
                    case R_PPC64_GOT_TLSGD16_LO:
7735
                      expecting_tls_get_addr = 1;
7736
                      found_tls_get_addr_arg = 1;
7737
                      /* Fall thru */
7738
 
7739
                    case R_PPC64_GOT_TLSGD16_HI:
7740
                    case R_PPC64_GOT_TLSGD16_HA:
7741
                      if (ok_tprel)
7742
                        /* GD -> LE */
7743
                        tls_set = 0;
7744
                      else
7745
                        /* GD -> IE */
7746
                        tls_set = TLS_TLS | TLS_TPRELGD;
7747
                      tls_clear = TLS_GD;
7748
                      tls_type = TLS_TLS | TLS_GD;
7749
                      break;
7750
 
7751
                    case R_PPC64_GOT_TPREL16_DS:
7752
                    case R_PPC64_GOT_TPREL16_LO_DS:
7753
                    case R_PPC64_GOT_TPREL16_HI:
7754
                    case R_PPC64_GOT_TPREL16_HA:
7755
                      if (ok_tprel)
7756
                        {
7757
                          /* IE -> LE */
7758
                          tls_set = 0;
7759
                          tls_clear = TLS_TPREL;
7760
                          tls_type = TLS_TLS | TLS_TPREL;
7761
                          break;
7762
                        }
7763
                      continue;
7764
 
7765
                    case R_PPC64_TLSGD:
7766
                    case R_PPC64_TLSLD:
7767
                      found_tls_get_addr_arg = 1;
7768
                      /* Fall thru */
7769
 
7770
                    case R_PPC64_TLS:
7771
                    case R_PPC64_TOC16:
7772
                    case R_PPC64_TOC16_LO:
7773
                      if (sym_sec == NULL || sym_sec != toc)
7774
                        continue;
7775
 
7776
                      /* Mark this toc entry as referenced by a TLS
7777
                         code sequence.  We can do that now in the
7778
                         case of R_PPC64_TLS, and after checking for
7779
                         tls_get_addr for the TOC16 relocs.  */
7780
                      if (toc_ref == NULL)
7781
                        toc_ref = bfd_zmalloc (toc->output_section->rawsize / 8);
7782
                      if (toc_ref == NULL)
7783
                        goto err_free_rel;
7784
 
7785
                      if (h != NULL)
7786
                        value = h->root.u.def.value;
7787
                      else
7788
                        value = sym->st_value;
7789
                      value += rel->r_addend;
7790
                      BFD_ASSERT (value < toc->size && value % 8 == 0);
7791
                      toc_ref_index = (value + toc->output_offset) / 8;
7792
                      if (r_type == R_PPC64_TLS
7793
                          || r_type == R_PPC64_TLSGD
7794
                          || r_type == R_PPC64_TLSLD)
7795
                        {
7796
                          toc_ref[toc_ref_index] = 1;
7797
                          continue;
7798
                        }
7799
 
7800
                      if (pass != 0 && toc_ref[toc_ref_index] == 0)
7801
                        continue;
7802
 
7803
                      tls_set = 0;
7804
                      tls_clear = 0;
7805
                      expecting_tls_get_addr = 2;
7806
                      break;
7807
 
7808
                    case R_PPC64_TPREL64:
7809
                      if (pass == 0
7810
                          || sec != toc
7811
                          || toc_ref == NULL
7812
                          || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
7813
                        continue;
7814
                      if (ok_tprel)
7815
                        {
7816
                          /* IE -> LE */
7817
                          tls_set = TLS_EXPLICIT;
7818
                          tls_clear = TLS_TPREL;
7819
                          break;
7820
                        }
7821
                      continue;
7822
 
7823
                    case R_PPC64_DTPMOD64:
7824
                      if (pass == 0
7825
                          || sec != toc
7826
                          || toc_ref == NULL
7827
                          || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
7828
                        continue;
7829
                      if (rel + 1 < relend
7830
                          && (rel[1].r_info
7831
                              == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
7832
                          && rel[1].r_offset == rel->r_offset + 8)
7833
                        {
7834
                          if (ok_tprel)
7835
                            /* GD -> LE */
7836
                            tls_set = TLS_EXPLICIT | TLS_GD;
7837
                          else
7838
                            /* GD -> IE */
7839
                            tls_set = TLS_EXPLICIT | TLS_GD | TLS_TPRELGD;
7840
                          tls_clear = TLS_GD;
7841
                        }
7842
                      else
7843
                        {
7844
                          if (!is_local)
7845
                            continue;
7846
 
7847
                          /* LD -> LE */
7848
                          tls_set = TLS_EXPLICIT;
7849
                          tls_clear = TLS_LD;
7850
                        }
7851
                      break;
7852
 
7853
                    default:
7854
                      continue;
7855
                    }
7856
 
7857
                  if (pass == 0)
7858
                    {
7859
                      if (!expecting_tls_get_addr
7860
                          || !sec->has_tls_get_addr_call)
7861
                        continue;
7862
 
7863
                      if (rel + 1 < relend
7864
                          && branch_reloc_hash_match (ibfd, rel + 1,
7865
                                                      htab->tls_get_addr,
7866
                                                      htab->tls_get_addr_fd))
7867
                        {
7868
                          if (expecting_tls_get_addr == 2)
7869
                            {
7870
                              /* Check for toc tls entries.  */
7871
                              unsigned char *toc_tls;
7872
                              int retval;
7873
 
7874
                              retval = get_tls_mask (&toc_tls, NULL, NULL,
7875
                                                     &locsyms,
7876
                                                     rel, ibfd);
7877
                              if (retval == 0)
7878
                                goto err_free_rel;
7879
                              if (toc_tls != NULL)
7880
                                {
7881
                                  if ((*toc_tls & (TLS_GD | TLS_LD)) != 0)
7882
                                    found_tls_get_addr_arg = 1;
7883
                                  if (retval > 1)
7884
                                    toc_ref[toc_ref_index] = 1;
7885
                                }
7886
                            }
7887
                          continue;
7888
                        }
7889
 
7890
                      if (expecting_tls_get_addr != 1)
7891
                        continue;
7892
 
7893
                      /* Uh oh, we didn't find the expected call.  We
7894
                         could just mark this symbol to exclude it
7895
                         from tls optimization but it's safer to skip
7896
                         the entire optimization.  */
7897
                      info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
7898
                                                "TLS optimization disabled\n"),
7899
                                              ibfd, sec, rel->r_offset);
7900
                      ret = TRUE;
7901
                      goto err_free_rel;
7902
                    }
7903
 
7904
                  if (expecting_tls_get_addr && htab->tls_get_addr != NULL)
7905
                    {
7906
                      struct plt_entry *ent;
7907
                      for (ent = htab->tls_get_addr->elf.plt.plist;
7908
                           ent != NULL;
7909
                           ent = ent->next)
7910
                        if (ent->addend == 0)
7911
                          {
7912
                            if (ent->plt.refcount > 0)
7913
                              {
7914
                                ent->plt.refcount -= 1;
7915
                                expecting_tls_get_addr = 0;
7916
                              }
7917
                            break;
7918
                          }
7919
                    }
7920
 
7921
                  if (expecting_tls_get_addr && htab->tls_get_addr_fd != NULL)
7922
                    {
7923
                      struct plt_entry *ent;
7924
                      for (ent = htab->tls_get_addr_fd->elf.plt.plist;
7925
                           ent != NULL;
7926
                           ent = ent->next)
7927
                        if (ent->addend == 0)
7928
                          {
7929
                            if (ent->plt.refcount > 0)
7930
                              ent->plt.refcount -= 1;
7931
                            break;
7932
                          }
7933
                    }
7934
 
7935
                  if (tls_clear == 0)
7936
                    continue;
7937
 
7938
                  if ((tls_set & TLS_EXPLICIT) == 0)
7939
                    {
7940
                      struct got_entry *ent;
7941
 
7942
                      /* Adjust got entry for this reloc.  */
7943
                      if (h != NULL)
7944
                        ent = h->got.glist;
7945
                      else
7946
                        ent = elf_local_got_ents (ibfd)[r_symndx];
7947
 
7948
                      for (; ent != NULL; ent = ent->next)
7949
                        if (ent->addend == rel->r_addend
7950
                            && ent->owner == ibfd
7951
                            && ent->tls_type == tls_type)
7952
                          break;
7953
                      if (ent == NULL)
7954
                        abort ();
7955
 
7956
                      if (tls_set == 0)
7957
                        {
7958
                          /* We managed to get rid of a got entry.  */
7959
                          if (ent->got.refcount > 0)
7960
                            ent->got.refcount -= 1;
7961
                        }
7962
                    }
7963
                  else
7964
                    {
7965
                      /* If we got rid of a DTPMOD/DTPREL reloc pair then
7966
                         we'll lose one or two dyn relocs.  */
7967
                      if (!dec_dynrel_count (rel->r_info, sec, info,
7968
                                             NULL, h, sym_sec))
7969
                        return FALSE;
7970
 
7971
                      if (tls_set == (TLS_EXPLICIT | TLS_GD))
7972
                        {
7973
                          if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
7974
                                                 NULL, h, sym_sec))
7975
                            return FALSE;
7976
                        }
7977
                    }
7978
 
7979
                  *tls_mask |= tls_set;
7980
                  *tls_mask &= ~tls_clear;
7981
                }
7982
 
7983
              if (elf_section_data (sec)->relocs != relstart)
7984
                free (relstart);
7985
            }
7986
 
7987
        if (locsyms != NULL
7988
            && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
7989
          {
7990
            if (!info->keep_memory)
7991
              free (locsyms);
7992
            else
7993
              elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
7994
          }
7995
      }
7996
 
7997
  if (toc_ref != NULL)
7998
    free (toc_ref);
7999
  return TRUE;
8000
}
8001
 
8002
/* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
8003
   the values of any global symbols in a toc section that has been
8004
   edited.  Globals in toc sections should be a rarity, so this function
8005
   sets a flag if any are found in toc sections other than the one just
8006
   edited, so that futher hash table traversals can be avoided.  */
8007
 
8008
struct adjust_toc_info
8009
{
8010
  asection *toc;
8011
  unsigned long *skip;
8012
  bfd_boolean global_toc_syms;
8013
};
8014
 
8015
enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 };
8016
 
8017
static bfd_boolean
8018
adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
8019
{
8020
  struct ppc_link_hash_entry *eh;
8021
  struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
8022
  unsigned long i;
8023
 
8024
  if (h->root.type != bfd_link_hash_defined
8025
      && h->root.type != bfd_link_hash_defweak)
8026
    return TRUE;
8027
 
8028
  eh = (struct ppc_link_hash_entry *) h;
8029
  if (eh->adjust_done)
8030
    return TRUE;
8031
 
8032
  if (eh->elf.root.u.def.section == toc_inf->toc)
8033
    {
8034
      if (eh->elf.root.u.def.value > toc_inf->toc->rawsize)
8035
        i = toc_inf->toc->rawsize >> 3;
8036
      else
8037
        i = eh->elf.root.u.def.value >> 3;
8038
 
8039
      if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0)
8040
        {
8041
          (*_bfd_error_handler)
8042
            (_("%s defined on removed toc entry"), eh->elf.root.root.string);
8043
          do
8044
            ++i;
8045
          while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0);
8046
          eh->elf.root.u.def.value = (bfd_vma) i << 3;
8047
        }
8048
 
8049
      eh->elf.root.u.def.value -= toc_inf->skip[i];
8050
      eh->adjust_done = 1;
8051
    }
8052
  else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
8053
    toc_inf->global_toc_syms = TRUE;
8054
 
8055
  return TRUE;
8056
}
8057
 
8058 163 khays
/* Return TRUE iff INSN is one we expect on a _LO variety toc/got reloc.  */
8059
 
8060
static bfd_boolean
8061
ok_lo_toc_insn (unsigned int insn)
8062
{
8063
  return ((insn & (0x3f << 26)) == 14u << 26 /* addi */
8064
          || (insn & (0x3f << 26)) == 32u << 26 /* lwz */
8065
          || (insn & (0x3f << 26)) == 34u << 26 /* lbz */
8066
          || (insn & (0x3f << 26)) == 36u << 26 /* stw */
8067
          || (insn & (0x3f << 26)) == 38u << 26 /* stb */
8068
          || (insn & (0x3f << 26)) == 40u << 26 /* lhz */
8069
          || (insn & (0x3f << 26)) == 42u << 26 /* lha */
8070
          || (insn & (0x3f << 26)) == 44u << 26 /* sth */
8071
          || (insn & (0x3f << 26)) == 46u << 26 /* lmw */
8072
          || (insn & (0x3f << 26)) == 47u << 26 /* stmw */
8073
          || (insn & (0x3f << 26)) == 48u << 26 /* lfs */
8074
          || (insn & (0x3f << 26)) == 50u << 26 /* lfd */
8075
          || (insn & (0x3f << 26)) == 52u << 26 /* stfs */
8076
          || (insn & (0x3f << 26)) == 54u << 26 /* stfd */
8077
          || ((insn & (0x3f << 26)) == 58u << 26 /* lwa,ld,lmd */
8078
              && (insn & 3) != 1)
8079
          || ((insn & (0x3f << 26)) == 62u << 26 /* std, stmd */
8080
              && ((insn & 3) == 0 || (insn & 3) == 3))
8081
          || (insn & (0x3f << 26)) == 12u << 26 /* addic */);
8082
}
8083
 
8084 14 khays
/* Examine all relocs referencing .toc sections in order to remove
8085
   unused .toc entries.  */
8086
 
8087
bfd_boolean
8088
ppc64_elf_edit_toc (struct bfd_link_info *info)
8089
{
8090
  bfd *ibfd;
8091
  struct adjust_toc_info toc_inf;
8092
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
8093
 
8094
  htab->do_toc_opt = 1;
8095
  toc_inf.global_toc_syms = TRUE;
8096
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
8097
    {
8098
      asection *toc, *sec;
8099
      Elf_Internal_Shdr *symtab_hdr;
8100
      Elf_Internal_Sym *local_syms;
8101
      Elf_Internal_Rela *relstart, *rel, *toc_relocs;
8102
      unsigned long *skip, *drop;
8103
      unsigned char *used;
8104
      unsigned char *keep, last, some_unused;
8105
 
8106
      if (!is_ppc64_elf (ibfd))
8107
        continue;
8108
 
8109
      toc = bfd_get_section_by_name (ibfd, ".toc");
8110
      if (toc == NULL
8111
          || toc->size == 0
8112
          || toc->sec_info_type == ELF_INFO_TYPE_JUST_SYMS
8113
          || elf_discarded_section (toc))
8114
        continue;
8115
 
8116
      toc_relocs = NULL;
8117
      local_syms = NULL;
8118
      symtab_hdr = &elf_symtab_hdr (ibfd);
8119
 
8120
      /* Look at sections dropped from the final link.  */
8121
      skip = NULL;
8122
      relstart = NULL;
8123
      for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8124
        {
8125
          if (sec->reloc_count == 0
8126
              || !elf_discarded_section (sec)
8127
              || get_opd_info (sec)
8128
              || (sec->flags & SEC_ALLOC) == 0
8129
              || (sec->flags & SEC_DEBUGGING) != 0)
8130
            continue;
8131
 
8132
          relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
8133
          if (relstart == NULL)
8134
            goto error_ret;
8135
 
8136
          /* Run through the relocs to see which toc entries might be
8137
             unused.  */
8138
          for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8139
            {
8140
              enum elf_ppc64_reloc_type r_type;
8141
              unsigned long r_symndx;
8142
              asection *sym_sec;
8143
              struct elf_link_hash_entry *h;
8144
              Elf_Internal_Sym *sym;
8145
              bfd_vma val;
8146
 
8147
              r_type = ELF64_R_TYPE (rel->r_info);
8148
              switch (r_type)
8149
                {
8150
                default:
8151
                  continue;
8152
 
8153
                case R_PPC64_TOC16:
8154
                case R_PPC64_TOC16_LO:
8155
                case R_PPC64_TOC16_HI:
8156
                case R_PPC64_TOC16_HA:
8157
                case R_PPC64_TOC16_DS:
8158
                case R_PPC64_TOC16_LO_DS:
8159
                  break;
8160
                }
8161
 
8162
              r_symndx = ELF64_R_SYM (rel->r_info);
8163
              if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8164
                              r_symndx, ibfd))
8165
                goto error_ret;
8166
 
8167
              if (sym_sec != toc)
8168
                continue;
8169
 
8170
              if (h != NULL)
8171
                val = h->root.u.def.value;
8172
              else
8173
                val = sym->st_value;
8174
              val += rel->r_addend;
8175
 
8176
              if (val >= toc->size)
8177
                continue;
8178
 
8179
              /* Anything in the toc ought to be aligned to 8 bytes.
8180
                 If not, don't mark as unused.  */
8181
              if (val & 7)
8182
                continue;
8183
 
8184
              if (skip == NULL)
8185
                {
8186
                  skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8187
                  if (skip == NULL)
8188
                    goto error_ret;
8189
                }
8190
 
8191
              skip[val >> 3] = ref_from_discarded;
8192
            }
8193
 
8194
          if (elf_section_data (sec)->relocs != relstart)
8195
            free (relstart);
8196
        }
8197
 
8198
      /* For largetoc loads of address constants, we can convert
8199
         .  addis rx,2,addr@got@ha
8200
         .  ld ry,addr@got@l(rx)
8201
         to
8202
         .  addis rx,2,addr@toc@ha
8203
         .  addi ry,rx,addr@toc@l
8204
         when addr is within 2G of the toc pointer.  This then means
8205
         that the word storing "addr" in the toc is no longer needed.  */
8206
 
8207
      if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc
8208
          && toc->output_section->rawsize < (bfd_vma) 1 << 31
8209
          && toc->reloc_count != 0)
8210
        {
8211
          /* Read toc relocs.  */
8212
          toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
8213
                                                  info->keep_memory);
8214
          if (toc_relocs == NULL)
8215
            goto error_ret;
8216
 
8217
          for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
8218
            {
8219
              enum elf_ppc64_reloc_type r_type;
8220
              unsigned long r_symndx;
8221
              asection *sym_sec;
8222
              struct elf_link_hash_entry *h;
8223
              Elf_Internal_Sym *sym;
8224
              bfd_vma val, addr;
8225
 
8226
              r_type = ELF64_R_TYPE (rel->r_info);
8227
              if (r_type != R_PPC64_ADDR64)
8228
                continue;
8229
 
8230
              r_symndx = ELF64_R_SYM (rel->r_info);
8231
              if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8232
                              r_symndx, ibfd))
8233
                goto error_ret;
8234
 
8235
              if (sym_sec == NULL
8236
                  || elf_discarded_section (sym_sec))
8237
                continue;
8238
 
8239
              if (!SYMBOL_CALLS_LOCAL (info, h))
8240
                continue;
8241
 
8242
              if (h != NULL)
8243
                {
8244
                  if (h->type == STT_GNU_IFUNC)
8245
                    continue;
8246
                  val = h->root.u.def.value;
8247
                }
8248
              else
8249
                {
8250
                  if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
8251
                    continue;
8252
                  val = sym->st_value;
8253
                }
8254
              val += rel->r_addend;
8255
              val += sym_sec->output_section->vma + sym_sec->output_offset;
8256
 
8257
              /* We don't yet know the exact toc pointer value, but we
8258
                 know it will be somewhere in the toc section.  Don't
8259
                 optimize if the difference from any possible toc
8260
                 pointer is outside [ff..f80008000, 7fff7fff].  */
8261
              addr = toc->output_section->vma + TOC_BASE_OFF;
8262
              if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8263
                continue;
8264
 
8265
              addr = toc->output_section->vma + toc->output_section->rawsize;
8266
              if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8267
                continue;
8268
 
8269
              if (skip == NULL)
8270
                {
8271
                  skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8272
                  if (skip == NULL)
8273
                    goto error_ret;
8274
                }
8275
 
8276
              skip[rel->r_offset >> 3]
8277
                |= can_optimize | ((rel - toc_relocs) << 2);
8278
            }
8279
        }
8280
 
8281
      if (skip == NULL)
8282
        continue;
8283
 
8284
      used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
8285
      if (used == NULL)
8286
        {
8287
        error_ret:
8288
          if (local_syms != NULL
8289
              && symtab_hdr->contents != (unsigned char *) local_syms)
8290
            free (local_syms);
8291
          if (sec != NULL
8292
              && relstart != NULL
8293
              && elf_section_data (sec)->relocs != relstart)
8294
            free (relstart);
8295
          if (toc_relocs != NULL
8296
              && elf_section_data (toc)->relocs != toc_relocs)
8297
            free (toc_relocs);
8298
          if (skip != NULL)
8299
            free (skip);
8300
          return FALSE;
8301
        }
8302
 
8303
      /* Now check all kept sections that might reference the toc.
8304
         Check the toc itself last.  */
8305
      for (sec = (ibfd->sections == toc && toc->next ? toc->next
8306
                  : ibfd->sections);
8307
           sec != NULL;
8308
           sec = (sec == toc ? NULL
8309
                  : sec->next == NULL ? toc
8310
                  : sec->next == toc && toc->next ? toc->next
8311
                  : sec->next))
8312
        {
8313
          int repeat;
8314
 
8315
          if (sec->reloc_count == 0
8316
              || elf_discarded_section (sec)
8317
              || get_opd_info (sec)
8318
              || (sec->flags & SEC_ALLOC) == 0
8319
              || (sec->flags & SEC_DEBUGGING) != 0)
8320
            continue;
8321
 
8322
          relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8323
                                                info->keep_memory);
8324
          if (relstart == NULL)
8325
            goto error_ret;
8326
 
8327
          /* Mark toc entries referenced as used.  */
8328
          repeat = 0;
8329
          do
8330
            for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8331
              {
8332
                enum elf_ppc64_reloc_type r_type;
8333
                unsigned long r_symndx;
8334
                asection *sym_sec;
8335
                struct elf_link_hash_entry *h;
8336
                Elf_Internal_Sym *sym;
8337
                bfd_vma val;
8338 163 khays
                enum {no_check, check_lo, check_ha} insn_check;
8339 14 khays
 
8340
                r_type = ELF64_R_TYPE (rel->r_info);
8341
                switch (r_type)
8342
                  {
8343 163 khays
                  default:
8344
                    insn_check = no_check;
8345
                    break;
8346
 
8347
                  case R_PPC64_GOT_TLSLD16_HA:
8348
                  case R_PPC64_GOT_TLSGD16_HA:
8349
                  case R_PPC64_GOT_TPREL16_HA:
8350
                  case R_PPC64_GOT_DTPREL16_HA:
8351
                  case R_PPC64_GOT16_HA:
8352
                  case R_PPC64_TOC16_HA:
8353
                    insn_check = check_ha;
8354
                    break;
8355
 
8356
                  case R_PPC64_GOT_TLSLD16_LO:
8357
                  case R_PPC64_GOT_TLSGD16_LO:
8358
                  case R_PPC64_GOT_TPREL16_LO_DS:
8359
                  case R_PPC64_GOT_DTPREL16_LO_DS:
8360
                  case R_PPC64_GOT16_LO:
8361
                  case R_PPC64_GOT16_LO_DS:
8362
                  case R_PPC64_TOC16_LO:
8363
                  case R_PPC64_TOC16_LO_DS:
8364
                    insn_check = check_lo;
8365
                    break;
8366
                  }
8367
 
8368
                if (insn_check != no_check)
8369
                  {
8370
                    bfd_vma off = rel->r_offset & ~3;
8371
                    unsigned char buf[4];
8372
                    unsigned int insn;
8373
 
8374
                    if (!bfd_get_section_contents (ibfd, sec, buf, off, 4))
8375
                      {
8376
                        free (used);
8377
                        goto error_ret;
8378
                      }
8379
                    insn = bfd_get_32 (ibfd, buf);
8380
                    if (insn_check == check_lo
8381
                        ? !ok_lo_toc_insn (insn)
8382
                        : ((insn & ((0x3f << 26) | 0x1f << 16))
8383
                           != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
8384
                      {
8385
                        char str[12];
8386
 
8387
                        ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1;
8388
                        sprintf (str, "%#08x", insn);
8389
                        info->callbacks->einfo
8390
                          (_("%P: %H: toc optimization is not supported for"
8391
                             " %s instruction.\n"),
8392
                           ibfd, sec, rel->r_offset & ~3, str);
8393
                      }
8394
                  }
8395
 
8396
                switch (r_type)
8397
                  {
8398 14 khays
                  case R_PPC64_TOC16:
8399
                  case R_PPC64_TOC16_LO:
8400
                  case R_PPC64_TOC16_HI:
8401
                  case R_PPC64_TOC16_HA:
8402
                  case R_PPC64_TOC16_DS:
8403
                  case R_PPC64_TOC16_LO_DS:
8404
                    /* In case we're taking addresses of toc entries.  */
8405
                  case R_PPC64_ADDR64:
8406
                    break;
8407
 
8408
                  default:
8409
                    continue;
8410
                  }
8411
 
8412
                r_symndx = ELF64_R_SYM (rel->r_info);
8413
                if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8414
                                r_symndx, ibfd))
8415
                  {
8416
                    free (used);
8417
                    goto error_ret;
8418
                  }
8419
 
8420
                if (sym_sec != toc)
8421
                  continue;
8422
 
8423
                if (h != NULL)
8424
                  val = h->root.u.def.value;
8425
                else
8426
                  val = sym->st_value;
8427
                val += rel->r_addend;
8428
 
8429
                if (val >= toc->size)
8430
                  continue;
8431
 
8432
                if ((skip[val >> 3] & can_optimize) != 0)
8433
                  {
8434
                    bfd_vma off;
8435
                    unsigned char opc;
8436
 
8437
                    switch (r_type)
8438
                      {
8439
                      case R_PPC64_TOC16_HA:
8440
                        break;
8441
 
8442
                      case R_PPC64_TOC16_LO_DS:
8443
                        off = rel->r_offset + (bfd_big_endian (ibfd) ? -2 : 3);
8444
                        if (!bfd_get_section_contents (ibfd, sec, &opc, off, 1))
8445 163 khays
                          {
8446
                            free (used);
8447
                            goto error_ret;
8448
                          }
8449 14 khays
                        if ((opc & (0x3f << 2)) == (58u << 2))
8450
                          break;
8451
                        /* Fall thru */
8452
 
8453
                      default:
8454
                        /* Wrong sort of reloc, or not a ld.  We may
8455
                           as well clear ref_from_discarded too.  */
8456
                        skip[val >> 3] = 0;
8457
                      }
8458
                  }
8459
 
8460
                /* For the toc section, we only mark as used if
8461
                   this entry itself isn't unused.  */
8462
                if (sec == toc
8463
                    && !used[val >> 3]
8464
                    && (used[rel->r_offset >> 3]
8465
                        || !(skip[rel->r_offset >> 3] & ref_from_discarded)))
8466
                  /* Do all the relocs again, to catch reference
8467
                     chains.  */
8468
                  repeat = 1;
8469
 
8470
                used[val >> 3] = 1;
8471
              }
8472
          while (repeat);
8473
 
8474
          if (elf_section_data (sec)->relocs != relstart)
8475
            free (relstart);
8476
        }
8477
 
8478
      /* Merge the used and skip arrays.  Assume that TOC
8479
         doublewords not appearing as either used or unused belong
8480
         to to an entry more than one doubleword in size.  */
8481
      for (drop = skip, keep = used, last = 0, some_unused = 0;
8482
           drop < skip + (toc->size + 7) / 8;
8483
           ++drop, ++keep)
8484
        {
8485
          if (*keep)
8486
            {
8487
              *drop &= ~ref_from_discarded;
8488
              if ((*drop & can_optimize) != 0)
8489
                some_unused = 1;
8490
              last = 0;
8491
            }
8492 163 khays
          else if ((*drop & ref_from_discarded) != 0)
8493 14 khays
            {
8494
              some_unused = 1;
8495
              last = ref_from_discarded;
8496
            }
8497
          else
8498
            *drop = last;
8499
        }
8500
 
8501
      free (used);
8502
 
8503
      if (some_unused)
8504
        {
8505
          bfd_byte *contents, *src;
8506
          unsigned long off;
8507
          Elf_Internal_Sym *sym;
8508
          bfd_boolean local_toc_syms = FALSE;
8509
 
8510
          /* Shuffle the toc contents, and at the same time convert the
8511
             skip array from booleans into offsets.  */
8512
          if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
8513
            goto error_ret;
8514
 
8515
          elf_section_data (toc)->this_hdr.contents = contents;
8516
 
8517
          for (src = contents, off = 0, drop = skip;
8518
               src < contents + toc->size;
8519
               src += 8, ++drop)
8520
            {
8521
              if ((*drop & (can_optimize | ref_from_discarded)) != 0)
8522
                off += 8;
8523
              else if (off != 0)
8524
                {
8525
                  *drop = off;
8526
                  memcpy (src - off, src, 8);
8527
                }
8528
            }
8529
          *drop = off;
8530
          toc->rawsize = toc->size;
8531
          toc->size = src - contents - off;
8532
 
8533
          /* Adjust addends for relocs against the toc section sym,
8534
             and optimize any accesses we can.  */
8535
          for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8536
            {
8537
              if (sec->reloc_count == 0
8538
                  || elf_discarded_section (sec))
8539
                continue;
8540
 
8541
              relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8542
                                                    info->keep_memory);
8543
              if (relstart == NULL)
8544
                goto error_ret;
8545
 
8546
              for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8547
                {
8548
                  enum elf_ppc64_reloc_type r_type;
8549
                  unsigned long r_symndx;
8550
                  asection *sym_sec;
8551
                  struct elf_link_hash_entry *h;
8552
                  bfd_vma val;
8553
 
8554
                  r_type = ELF64_R_TYPE (rel->r_info);
8555
                  switch (r_type)
8556
                    {
8557
                    default:
8558
                      continue;
8559
 
8560
                    case R_PPC64_TOC16:
8561
                    case R_PPC64_TOC16_LO:
8562
                    case R_PPC64_TOC16_HI:
8563
                    case R_PPC64_TOC16_HA:
8564
                    case R_PPC64_TOC16_DS:
8565
                    case R_PPC64_TOC16_LO_DS:
8566
                    case R_PPC64_ADDR64:
8567
                      break;
8568
                    }
8569
 
8570
                  r_symndx = ELF64_R_SYM (rel->r_info);
8571
                  if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8572
                                  r_symndx, ibfd))
8573
                    goto error_ret;
8574
 
8575
                  if (sym_sec != toc)
8576
                    continue;
8577
 
8578
                  if (h != NULL)
8579
                    val = h->root.u.def.value;
8580
                  else
8581
                    {
8582
                      val = sym->st_value;
8583
                      if (val != 0)
8584
                        local_toc_syms = TRUE;
8585
                    }
8586
 
8587
                  val += rel->r_addend;
8588
 
8589
                  if (val > toc->rawsize)
8590
                    val = toc->rawsize;
8591
                  else if ((skip[val >> 3] & ref_from_discarded) != 0)
8592
                    continue;
8593
                  else if ((skip[val >> 3] & can_optimize) != 0)
8594
                    {
8595
                      Elf_Internal_Rela *tocrel
8596
                        = toc_relocs + (skip[val >> 3] >> 2);
8597
                      unsigned long tsym = ELF64_R_SYM (tocrel->r_info);
8598
 
8599
                      switch (r_type)
8600
                        {
8601
                        case R_PPC64_TOC16_HA:
8602
                          rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA);
8603
                          break;
8604
 
8605
                        case R_PPC64_TOC16_LO_DS:
8606
                          rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT);
8607
                          break;
8608
 
8609
                        default:
8610 163 khays
                          if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
8611
                            ppc_howto_init ();
8612
                          info->callbacks->einfo
8613
                            (_("%P: %H: %s relocation references "
8614
                               "optimized away TOC entry\n"),
8615
                             ibfd, sec, rel->r_offset,
8616
                             ppc64_elf_howto_table[r_type]->name);
8617
                          bfd_set_error (bfd_error_bad_value);
8618
                          goto error_ret;
8619 14 khays
                        }
8620
                      rel->r_addend = tocrel->r_addend;
8621
                      elf_section_data (sec)->relocs = relstart;
8622
                      continue;
8623
                    }
8624
 
8625
                  if (h != NULL || sym->st_value != 0)
8626
                    continue;
8627
 
8628
                  rel->r_addend -= skip[val >> 3];
8629
                  elf_section_data (sec)->relocs = relstart;
8630
                }
8631
 
8632
              if (elf_section_data (sec)->relocs != relstart)
8633
                free (relstart);
8634
            }
8635
 
8636
          /* We shouldn't have local or global symbols defined in the TOC,
8637
             but handle them anyway.  */
8638
          if (local_syms != NULL)
8639
            for (sym = local_syms;
8640
                 sym < local_syms + symtab_hdr->sh_info;
8641
                 ++sym)
8642
              if (sym->st_value != 0
8643
                  && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
8644
                {
8645
                  unsigned long i;
8646
 
8647
                  if (sym->st_value > toc->rawsize)
8648
                    i = toc->rawsize >> 3;
8649
                  else
8650
                    i = sym->st_value >> 3;
8651
 
8652
                  if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
8653
                    {
8654
                      if (local_toc_syms)
8655
                        (*_bfd_error_handler)
8656
                          (_("%s defined on removed toc entry"),
8657
                           bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
8658
                      do
8659
                        ++i;
8660
                      while ((skip[i] & (ref_from_discarded | can_optimize)));
8661
                      sym->st_value = (bfd_vma) i << 3;
8662
                    }
8663
 
8664
                  sym->st_value -= skip[i];
8665
                  symtab_hdr->contents = (unsigned char *) local_syms;
8666
                }
8667
 
8668
          /* Adjust any global syms defined in this toc input section.  */
8669
          if (toc_inf.global_toc_syms)
8670
            {
8671
              toc_inf.toc = toc;
8672
              toc_inf.skip = skip;
8673
              toc_inf.global_toc_syms = FALSE;
8674
              elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
8675
                                      &toc_inf);
8676
            }
8677
 
8678
          if (toc->reloc_count != 0)
8679
            {
8680
              Elf_Internal_Shdr *rel_hdr;
8681
              Elf_Internal_Rela *wrel;
8682
              bfd_size_type sz;
8683
 
8684
              /* Remove unused toc relocs, and adjust those we keep.  */
8685
              if (toc_relocs == NULL)
8686
                toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
8687
                                                        info->keep_memory);
8688
              if (toc_relocs == NULL)
8689
                goto error_ret;
8690
 
8691
              wrel = toc_relocs;
8692
              for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
8693
                if ((skip[rel->r_offset >> 3]
8694
                     & (ref_from_discarded | can_optimize)) == 0)
8695
                  {
8696
                    wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
8697
                    wrel->r_info = rel->r_info;
8698
                    wrel->r_addend = rel->r_addend;
8699
                    ++wrel;
8700
                  }
8701
                else if (!dec_dynrel_count (rel->r_info, toc, info,
8702
                                            &local_syms, NULL, NULL))
8703
                  goto error_ret;
8704
 
8705
              elf_section_data (toc)->relocs = toc_relocs;
8706
              toc->reloc_count = wrel - toc_relocs;
8707
              rel_hdr = _bfd_elf_single_rel_hdr (toc);
8708
              sz = rel_hdr->sh_entsize;
8709
              rel_hdr->sh_size = toc->reloc_count * sz;
8710
            }
8711
        }
8712
      else if (toc_relocs != NULL
8713
               && elf_section_data (toc)->relocs != toc_relocs)
8714
        free (toc_relocs);
8715
 
8716
      if (local_syms != NULL
8717
          && symtab_hdr->contents != (unsigned char *) local_syms)
8718
        {
8719
          if (!info->keep_memory)
8720
            free (local_syms);
8721
          else
8722
            symtab_hdr->contents = (unsigned char *) local_syms;
8723
        }
8724
      free (skip);
8725
    }
8726
 
8727
  return TRUE;
8728
}
8729
 
8730
/* Return true iff input section I references the TOC using
8731
   instructions limited to +/-32k offsets.  */
8732
 
8733
bfd_boolean
8734
ppc64_elf_has_small_toc_reloc (asection *i)
8735
{
8736
  return (is_ppc64_elf (i->owner)
8737
          && ppc64_elf_tdata (i->owner)->has_small_toc_reloc);
8738
}
8739
 
8740
/* Allocate space for one GOT entry.  */
8741
 
8742
static void
8743
allocate_got (struct elf_link_hash_entry *h,
8744
              struct bfd_link_info *info,
8745
              struct got_entry *gent)
8746
{
8747
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
8748
  bfd_boolean dyn;
8749
  struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
8750
  int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)
8751
                 ? 16 : 8);
8752
  int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD
8753
                  ? 2 : 1) * sizeof (Elf64_External_Rela);
8754
  asection *got = ppc64_elf_tdata (gent->owner)->got;
8755
 
8756
  gent->got.offset = got->size;
8757
  got->size += entsize;
8758
 
8759
  dyn = htab->elf.dynamic_sections_created;
8760
  if ((info->shared
8761
       || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
8762
            && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
8763
                || h->root.type != bfd_link_hash_undefweak))
8764
    {
8765
      asection *relgot = ppc64_elf_tdata (gent->owner)->relgot;
8766
      relgot->size += rentsize;
8767
    }
8768
  else if (h->type == STT_GNU_IFUNC)
8769
    {
8770
      asection *relgot = htab->reliplt;
8771
      relgot->size += rentsize;
8772
      htab->got_reli_size += rentsize;
8773
    }
8774
}
8775
 
8776
/* This function merges got entries in the same toc group.  */
8777
 
8778
static void
8779
merge_got_entries (struct got_entry **pent)
8780
{
8781
  struct got_entry *ent, *ent2;
8782
 
8783
  for (ent = *pent; ent != NULL; ent = ent->next)
8784
    if (!ent->is_indirect)
8785
      for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next)
8786
        if (!ent2->is_indirect
8787
            && ent2->addend == ent->addend
8788
            && ent2->tls_type == ent->tls_type
8789
            && elf_gp (ent2->owner) == elf_gp (ent->owner))
8790
          {
8791
            ent2->is_indirect = TRUE;
8792
            ent2->got.ent = ent;
8793
          }
8794
}
8795
 
8796
/* Allocate space in .plt, .got and associated reloc sections for
8797
   dynamic relocs.  */
8798
 
8799
static bfd_boolean
8800
allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
8801
{
8802
  struct bfd_link_info *info;
8803
  struct ppc_link_hash_table *htab;
8804
  asection *s;
8805
  struct ppc_link_hash_entry *eh;
8806
  struct elf_dyn_relocs *p;
8807
  struct got_entry **pgent, *gent;
8808
 
8809
  if (h->root.type == bfd_link_hash_indirect)
8810
    return TRUE;
8811
 
8812
  info = (struct bfd_link_info *) inf;
8813
  htab = ppc_hash_table (info);
8814
  if (htab == NULL)
8815
    return FALSE;
8816
 
8817
  if ((htab->elf.dynamic_sections_created
8818
       && h->dynindx != -1
8819
       && WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
8820
      || h->type == STT_GNU_IFUNC)
8821
    {
8822
      struct plt_entry *pent;
8823
      bfd_boolean doneone = FALSE;
8824
      for (pent = h->plt.plist; pent != NULL; pent = pent->next)
8825
        if (pent->plt.refcount > 0)
8826
          {
8827
            if (!htab->elf.dynamic_sections_created
8828
                || h->dynindx == -1)
8829
              {
8830
                s = htab->iplt;
8831
                pent->plt.offset = s->size;
8832
                s->size += PLT_ENTRY_SIZE;
8833
                s = htab->reliplt;
8834
              }
8835
            else
8836
              {
8837
                /* If this is the first .plt entry, make room for the special
8838
                   first entry.  */
8839
                s = htab->plt;
8840
                if (s->size == 0)
8841
                  s->size += PLT_INITIAL_ENTRY_SIZE;
8842
 
8843
                pent->plt.offset = s->size;
8844
 
8845
                /* Make room for this entry.  */
8846
                s->size += PLT_ENTRY_SIZE;
8847
 
8848
                /* Make room for the .glink code.  */
8849
                s = htab->glink;
8850
                if (s->size == 0)
8851
                  s->size += GLINK_CALL_STUB_SIZE;
8852
                /* We need bigger stubs past index 32767.  */
8853
                if (s->size >= GLINK_CALL_STUB_SIZE + 32768*2*4)
8854
                  s->size += 4;
8855
                s->size += 2*4;
8856
 
8857
                /* We also need to make an entry in the .rela.plt section.  */
8858
                s = htab->relplt;
8859
              }
8860
            s->size += sizeof (Elf64_External_Rela);
8861
            doneone = TRUE;
8862
          }
8863
        else
8864
          pent->plt.offset = (bfd_vma) -1;
8865
      if (!doneone)
8866
        {
8867
          h->plt.plist = NULL;
8868
          h->needs_plt = 0;
8869
        }
8870
    }
8871
  else
8872
    {
8873
      h->plt.plist = NULL;
8874
      h->needs_plt = 0;
8875
    }
8876
 
8877
  eh = (struct ppc_link_hash_entry *) h;
8878
  /* Run through the TLS GD got entries first if we're changing them
8879
     to TPREL.  */
8880
  if ((eh->tls_mask & TLS_TPRELGD) != 0)
8881
    for (gent = h->got.glist; gent != NULL; gent = gent->next)
8882
      if (gent->got.refcount > 0
8883
          && (gent->tls_type & TLS_GD) != 0)
8884
        {
8885
          /* This was a GD entry that has been converted to TPREL.  If
8886
             there happens to be a TPREL entry we can use that one.  */
8887
          struct got_entry *ent;
8888
          for (ent = h->got.glist; ent != NULL; ent = ent->next)
8889
            if (ent->got.refcount > 0
8890
                && (ent->tls_type & TLS_TPREL) != 0
8891
                && ent->addend == gent->addend
8892
                && ent->owner == gent->owner)
8893
              {
8894
                gent->got.refcount = 0;
8895
                break;
8896
              }
8897
 
8898
          /* If not, then we'll be using our own TPREL entry.  */
8899
          if (gent->got.refcount != 0)
8900
            gent->tls_type = TLS_TLS | TLS_TPREL;
8901
        }
8902
 
8903
  /* Remove any list entry that won't generate a word in the GOT before
8904
     we call merge_got_entries.  Otherwise we risk merging to empty
8905
     entries.  */
8906
  pgent = &h->got.glist;
8907
  while ((gent = *pgent) != NULL)
8908
    if (gent->got.refcount > 0)
8909
      {
8910
        if ((gent->tls_type & TLS_LD) != 0
8911
            && !h->def_dynamic)
8912
          {
8913
            ppc64_tlsld_got (gent->owner)->got.refcount += 1;
8914
            *pgent = gent->next;
8915
          }
8916
        else
8917
          pgent = &gent->next;
8918
      }
8919
    else
8920
      *pgent = gent->next;
8921
 
8922
  if (!htab->do_multi_toc)
8923
    merge_got_entries (&h->got.glist);
8924
 
8925
  for (gent = h->got.glist; gent != NULL; gent = gent->next)
8926
    if (!gent->is_indirect)
8927
      {
8928
        /* Make sure this symbol is output as a dynamic symbol.
8929
           Undefined weak syms won't yet be marked as dynamic,
8930
           nor will all TLS symbols.  */
8931
        if (h->dynindx == -1
8932
            && !h->forced_local
8933
            && h->type != STT_GNU_IFUNC
8934
            && htab->elf.dynamic_sections_created)
8935
          {
8936
            if (! bfd_elf_link_record_dynamic_symbol (info, h))
8937
              return FALSE;
8938
          }
8939
 
8940
        if (!is_ppc64_elf (gent->owner))
8941
          abort ();
8942
 
8943
        allocate_got (h, info, gent);
8944
      }
8945
 
8946
  if (eh->dyn_relocs == NULL
8947
      || (!htab->elf.dynamic_sections_created
8948
          && h->type != STT_GNU_IFUNC))
8949
    return TRUE;
8950
 
8951
  /* In the shared -Bsymbolic case, discard space allocated for
8952
     dynamic pc-relative relocs against symbols which turn out to be
8953
     defined in regular objects.  For the normal shared case, discard
8954
     space for relocs that have become local due to symbol visibility
8955
     changes.  */
8956
 
8957
  if (info->shared)
8958
    {
8959
      /* Relocs that use pc_count are those that appear on a call insn,
8960
         or certain REL relocs (see must_be_dyn_reloc) that can be
8961
         generated via assembly.  We want calls to protected symbols to
8962
         resolve directly to the function rather than going via the plt.
8963
         If people want function pointer comparisons to work as expected
8964
         then they should avoid writing weird assembly.  */
8965
      if (SYMBOL_CALLS_LOCAL (info, h))
8966
        {
8967
          struct elf_dyn_relocs **pp;
8968
 
8969
          for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
8970
            {
8971
              p->count -= p->pc_count;
8972
              p->pc_count = 0;
8973
              if (p->count == 0)
8974
                *pp = p->next;
8975
              else
8976
                pp = &p->next;
8977
            }
8978
        }
8979
 
8980
      /* Also discard relocs on undefined weak syms with non-default
8981
         visibility.  */
8982
      if (eh->dyn_relocs != NULL
8983
          && h->root.type == bfd_link_hash_undefweak)
8984
        {
8985
          if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
8986
            eh->dyn_relocs = NULL;
8987
 
8988
          /* Make sure this symbol is output as a dynamic symbol.
8989
             Undefined weak syms won't yet be marked as dynamic.  */
8990
          else if (h->dynindx == -1
8991
                   && !h->forced_local)
8992
            {
8993
              if (! bfd_elf_link_record_dynamic_symbol (info, h))
8994
                return FALSE;
8995
            }
8996
        }
8997
    }
8998
  else if (h->type == STT_GNU_IFUNC)
8999
    {
9000
      if (!h->non_got_ref)
9001
        eh->dyn_relocs = NULL;
9002
    }
9003
  else if (ELIMINATE_COPY_RELOCS)
9004
    {
9005
      /* For the non-shared case, discard space for relocs against
9006
         symbols which turn out to need copy relocs or are not
9007
         dynamic.  */
9008
 
9009
      if (!h->non_got_ref
9010
          && !h->def_regular)
9011
        {
9012
          /* Make sure this symbol is output as a dynamic symbol.
9013
             Undefined weak syms won't yet be marked as dynamic.  */
9014
          if (h->dynindx == -1
9015
              && !h->forced_local)
9016
            {
9017
              if (! bfd_elf_link_record_dynamic_symbol (info, h))
9018
                return FALSE;
9019
            }
9020
 
9021
          /* If that succeeded, we know we'll be keeping all the
9022
             relocs.  */
9023
          if (h->dynindx != -1)
9024
            goto keep;
9025
        }
9026
 
9027
      eh->dyn_relocs = NULL;
9028
 
9029
    keep: ;
9030
    }
9031
 
9032
  /* Finally, allocate space.  */
9033
  for (p = eh->dyn_relocs; p != NULL; p = p->next)
9034
    {
9035
      asection *sreloc = elf_section_data (p->sec)->sreloc;
9036
      if (!htab->elf.dynamic_sections_created)
9037
        sreloc = htab->reliplt;
9038
      sreloc->size += p->count * sizeof (Elf64_External_Rela);
9039
    }
9040
 
9041
  return TRUE;
9042
}
9043
 
9044
/* Find any dynamic relocs that apply to read-only sections.  */
9045
 
9046
static bfd_boolean
9047
readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
9048
{
9049
  struct ppc_link_hash_entry *eh;
9050
  struct elf_dyn_relocs *p;
9051
 
9052
  eh = (struct ppc_link_hash_entry *) h;
9053
  for (p = eh->dyn_relocs; p != NULL; p = p->next)
9054
    {
9055
      asection *s = p->sec->output_section;
9056
 
9057
      if (s != NULL && (s->flags & SEC_READONLY) != 0)
9058
        {
9059
          struct bfd_link_info *info = inf;
9060
 
9061
          info->flags |= DF_TEXTREL;
9062
 
9063
          /* Not an error, just cut short the traversal.  */
9064
          return FALSE;
9065
        }
9066
    }
9067
  return TRUE;
9068
}
9069
 
9070
/* Set the sizes of the dynamic sections.  */
9071
 
9072
static bfd_boolean
9073
ppc64_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
9074
                                 struct bfd_link_info *info)
9075
{
9076
  struct ppc_link_hash_table *htab;
9077
  bfd *dynobj;
9078
  asection *s;
9079
  bfd_boolean relocs;
9080
  bfd *ibfd;
9081
  struct got_entry *first_tlsld;
9082
 
9083
  htab = ppc_hash_table (info);
9084
  if (htab == NULL)
9085
    return FALSE;
9086
 
9087
  dynobj = htab->elf.dynobj;
9088
  if (dynobj == NULL)
9089
    abort ();
9090
 
9091
  if (htab->elf.dynamic_sections_created)
9092
    {
9093
      /* Set the contents of the .interp section to the interpreter.  */
9094
      if (info->executable)
9095
        {
9096
          s = bfd_get_section_by_name (dynobj, ".interp");
9097
          if (s == NULL)
9098
            abort ();
9099
          s->size = sizeof ELF_DYNAMIC_INTERPRETER;
9100
          s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
9101
        }
9102
    }
9103
 
9104
  /* Set up .got offsets for local syms, and space for local dynamic
9105
     relocs.  */
9106
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
9107
    {
9108
      struct got_entry **lgot_ents;
9109
      struct got_entry **end_lgot_ents;
9110
      struct plt_entry **local_plt;
9111
      struct plt_entry **end_local_plt;
9112
      unsigned char *lgot_masks;
9113
      bfd_size_type locsymcount;
9114
      Elf_Internal_Shdr *symtab_hdr;
9115
      asection *srel;
9116
 
9117
      if (!is_ppc64_elf (ibfd))
9118
        continue;
9119
 
9120
      for (s = ibfd->sections; s != NULL; s = s->next)
9121
        {
9122
          struct elf_dyn_relocs *p;
9123
 
9124
          for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
9125
            {
9126
              if (!bfd_is_abs_section (p->sec)
9127
                  && bfd_is_abs_section (p->sec->output_section))
9128
                {
9129
                  /* Input section has been discarded, either because
9130
                     it is a copy of a linkonce section or due to
9131
                     linker script /DISCARD/, so we'll be discarding
9132
                     the relocs too.  */
9133
                }
9134
              else if (p->count != 0)
9135
                {
9136
                  srel = elf_section_data (p->sec)->sreloc;
9137
                  if (!htab->elf.dynamic_sections_created)
9138
                    srel = htab->reliplt;
9139
                  srel->size += p->count * sizeof (Elf64_External_Rela);
9140
                  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
9141
                    info->flags |= DF_TEXTREL;
9142
                }
9143
            }
9144
        }
9145
 
9146
      lgot_ents = elf_local_got_ents (ibfd);
9147
      if (!lgot_ents)
9148
        continue;
9149
 
9150
      symtab_hdr = &elf_symtab_hdr (ibfd);
9151
      locsymcount = symtab_hdr->sh_info;
9152
      end_lgot_ents = lgot_ents + locsymcount;
9153
      local_plt = (struct plt_entry **) end_lgot_ents;
9154
      end_local_plt = local_plt + locsymcount;
9155
      lgot_masks = (unsigned char *) end_local_plt;
9156
      s = ppc64_elf_tdata (ibfd)->got;
9157
      srel = ppc64_elf_tdata (ibfd)->relgot;
9158
      for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
9159
        {
9160
          struct got_entry **pent, *ent;
9161
 
9162
          pent = lgot_ents;
9163
          while ((ent = *pent) != NULL)
9164
            if (ent->got.refcount > 0)
9165
              {
9166
                if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
9167
                  {
9168
                    ppc64_tlsld_got (ibfd)->got.refcount += 1;
9169
                    *pent = ent->next;
9170
                  }
9171
                else
9172
                  {
9173
                    unsigned int num = 1;
9174
                    ent->got.offset = s->size;
9175
                    if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
9176
                      num = 2;
9177
                    s->size += num * 8;
9178
                    if (info->shared)
9179
                      srel->size += num * sizeof (Elf64_External_Rela);
9180
                    else if ((*lgot_masks & PLT_IFUNC) != 0)
9181
                      {
9182
                        htab->reliplt->size
9183
                          += num * sizeof (Elf64_External_Rela);
9184
                        htab->got_reli_size
9185
                          += num * sizeof (Elf64_External_Rela);
9186
                      }
9187
                    pent = &ent->next;
9188
                  }
9189
              }
9190
            else
9191
              *pent = ent->next;
9192
        }
9193
 
9194
      /* Allocate space for calls to local STT_GNU_IFUNC syms in .iplt.  */
9195
      for (; local_plt < end_local_plt; ++local_plt)
9196
        {
9197
          struct plt_entry *ent;
9198
 
9199
          for (ent = *local_plt; ent != NULL; ent = ent->next)
9200
            if (ent->plt.refcount > 0)
9201
              {
9202
                s = htab->iplt;
9203
                ent->plt.offset = s->size;
9204
                s->size += PLT_ENTRY_SIZE;
9205
 
9206
                htab->reliplt->size += sizeof (Elf64_External_Rela);
9207
              }
9208
            else
9209
              ent->plt.offset = (bfd_vma) -1;
9210
        }
9211
    }
9212
 
9213
  /* Allocate global sym .plt and .got entries, and space for global
9214
     sym dynamic relocs.  */
9215
  elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
9216
 
9217
  first_tlsld = NULL;
9218
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
9219
    {
9220
      struct got_entry *ent;
9221
 
9222
      if (!is_ppc64_elf (ibfd))
9223
        continue;
9224
 
9225
      ent = ppc64_tlsld_got (ibfd);
9226
      if (ent->got.refcount > 0)
9227
        {
9228
          if (!htab->do_multi_toc && first_tlsld != NULL)
9229
            {
9230
              ent->is_indirect = TRUE;
9231
              ent->got.ent = first_tlsld;
9232
            }
9233
          else
9234
            {
9235
              if (first_tlsld == NULL)
9236
                first_tlsld = ent;
9237
              s = ppc64_elf_tdata (ibfd)->got;
9238
              ent->got.offset = s->size;
9239
              ent->owner = ibfd;
9240
              s->size += 16;
9241
              if (info->shared)
9242
                {
9243
                  asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9244
                  srel->size += sizeof (Elf64_External_Rela);
9245
                }
9246
            }
9247
        }
9248
      else
9249
        ent->got.offset = (bfd_vma) -1;
9250
    }
9251
 
9252
  /* We now have determined the sizes of the various dynamic sections.
9253
     Allocate memory for them.  */
9254
  relocs = FALSE;
9255
  for (s = dynobj->sections; s != NULL; s = s->next)
9256
    {
9257
      if ((s->flags & SEC_LINKER_CREATED) == 0)
9258
        continue;
9259
 
9260
      if (s == htab->brlt || s == htab->relbrlt)
9261
        /* These haven't been allocated yet;  don't strip.  */
9262
        continue;
9263
      else if (s == htab->got
9264
               || s == htab->plt
9265
               || s == htab->iplt
9266
               || s == htab->glink
9267
               || s == htab->dynbss)
9268
        {
9269
          /* Strip this section if we don't need it; see the
9270
             comment below.  */
9271
        }
9272 161 khays
      else if (s == htab->glink_eh_frame)
9273
        {
9274
          if (!bfd_is_abs_section (s->output_section))
9275
            /* Not sized yet.  */
9276
            continue;
9277
        }
9278 14 khays
      else if (CONST_STRNEQ (s->name, ".rela"))
9279
        {
9280
          if (s->size != 0)
9281
            {
9282
              if (s != htab->relplt)
9283
                relocs = TRUE;
9284
 
9285
              /* We use the reloc_count field as a counter if we need
9286
                 to copy relocs into the output file.  */
9287
              s->reloc_count = 0;
9288
            }
9289
        }
9290
      else
9291
        {
9292
          /* It's not one of our sections, so don't allocate space.  */
9293
          continue;
9294
        }
9295
 
9296
      if (s->size == 0)
9297
        {
9298
          /* If we don't need this section, strip it from the
9299
             output file.  This is mostly to handle .rela.bss and
9300
             .rela.plt.  We must create both sections in
9301
             create_dynamic_sections, because they must be created
9302
             before the linker maps input sections to output
9303
             sections.  The linker does that before
9304
             adjust_dynamic_symbol is called, and it is that
9305
             function which decides whether anything needs to go
9306
             into these sections.  */
9307
          s->flags |= SEC_EXCLUDE;
9308
          continue;
9309
        }
9310
 
9311
      if ((s->flags & SEC_HAS_CONTENTS) == 0)
9312
        continue;
9313
 
9314
      /* Allocate memory for the section contents.  We use bfd_zalloc
9315
         here in case unused entries are not reclaimed before the
9316
         section's contents are written out.  This should not happen,
9317
         but this way if it does we get a R_PPC64_NONE reloc in .rela
9318
         sections instead of garbage.
9319
         We also rely on the section contents being zero when writing
9320
         the GOT.  */
9321
      s->contents = bfd_zalloc (dynobj, s->size);
9322
      if (s->contents == NULL)
9323
        return FALSE;
9324
    }
9325
 
9326
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
9327
    {
9328
      if (!is_ppc64_elf (ibfd))
9329
        continue;
9330
 
9331
      s = ppc64_elf_tdata (ibfd)->got;
9332
      if (s != NULL && s != htab->got)
9333
        {
9334
          if (s->size == 0)
9335
            s->flags |= SEC_EXCLUDE;
9336
          else
9337
            {
9338
              s->contents = bfd_zalloc (ibfd, s->size);
9339
              if (s->contents == NULL)
9340
                return FALSE;
9341
            }
9342
        }
9343
      s = ppc64_elf_tdata (ibfd)->relgot;
9344
      if (s != NULL)
9345
        {
9346
          if (s->size == 0)
9347
            s->flags |= SEC_EXCLUDE;
9348
          else
9349
            {
9350
              s->contents = bfd_zalloc (ibfd, s->size);
9351
              if (s->contents == NULL)
9352
                return FALSE;
9353
              relocs = TRUE;
9354
              s->reloc_count = 0;
9355
            }
9356
        }
9357
    }
9358
 
9359
  if (htab->elf.dynamic_sections_created)
9360
    {
9361
      /* Add some entries to the .dynamic section.  We fill in the
9362
         values later, in ppc64_elf_finish_dynamic_sections, but we
9363
         must add the entries now so that we get the correct size for
9364
         the .dynamic section.  The DT_DEBUG entry is filled in by the
9365
         dynamic linker and used by the debugger.  */
9366
#define add_dynamic_entry(TAG, VAL) \
9367
  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
9368
 
9369
      if (info->executable)
9370
        {
9371
          if (!add_dynamic_entry (DT_DEBUG, 0))
9372
            return FALSE;
9373
        }
9374
 
9375
      if (htab->plt != NULL && htab->plt->size != 0)
9376
        {
9377
          if (!add_dynamic_entry (DT_PLTGOT, 0)
9378
              || !add_dynamic_entry (DT_PLTRELSZ, 0)
9379
              || !add_dynamic_entry (DT_PLTREL, DT_RELA)
9380
              || !add_dynamic_entry (DT_JMPREL, 0)
9381
              || !add_dynamic_entry (DT_PPC64_GLINK, 0))
9382
            return FALSE;
9383
        }
9384
 
9385
      if (NO_OPD_RELOCS)
9386
        {
9387
          if (!add_dynamic_entry (DT_PPC64_OPD, 0)
9388
              || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
9389
            return FALSE;
9390
        }
9391
 
9392
      if (!htab->no_tls_get_addr_opt
9393
          && htab->tls_get_addr_fd != NULL
9394
          && htab->tls_get_addr_fd->elf.plt.plist != NULL
9395
          && !add_dynamic_entry (DT_PPC64_TLSOPT, 0))
9396
        return FALSE;
9397
 
9398
      if (relocs)
9399
        {
9400
          if (!add_dynamic_entry (DT_RELA, 0)
9401
              || !add_dynamic_entry (DT_RELASZ, 0)
9402
              || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
9403
            return FALSE;
9404
 
9405
          /* If any dynamic relocs apply to a read-only section,
9406
             then we need a DT_TEXTREL entry.  */
9407
          if ((info->flags & DF_TEXTREL) == 0)
9408
            elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, info);
9409
 
9410
          if ((info->flags & DF_TEXTREL) != 0)
9411
            {
9412
              if (!add_dynamic_entry (DT_TEXTREL, 0))
9413
                return FALSE;
9414
            }
9415
        }
9416
    }
9417
#undef add_dynamic_entry
9418
 
9419
  return TRUE;
9420
}
9421
 
9422
/* Determine the type of stub needed, if any, for a call.  */
9423
 
9424
static inline enum ppc_stub_type
9425
ppc_type_of_stub (asection *input_sec,
9426
                  const Elf_Internal_Rela *rel,
9427
                  struct ppc_link_hash_entry **hash,
9428
                  struct plt_entry **plt_ent,
9429
                  bfd_vma destination)
9430
{
9431
  struct ppc_link_hash_entry *h = *hash;
9432
  bfd_vma location;
9433
  bfd_vma branch_offset;
9434
  bfd_vma max_branch_offset;
9435
  enum elf_ppc64_reloc_type r_type;
9436
 
9437
  if (h != NULL)
9438
    {
9439
      struct plt_entry *ent;
9440
      struct ppc_link_hash_entry *fdh = h;
9441
      if (h->oh != NULL
9442
          && h->oh->is_func_descriptor)
9443
        {
9444
          fdh = ppc_follow_link (h->oh);
9445
          *hash = fdh;
9446
        }
9447
 
9448
      for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
9449
        if (ent->addend == rel->r_addend
9450
            && ent->plt.offset != (bfd_vma) -1)
9451
          {
9452
            *plt_ent = ent;
9453
            return ppc_stub_plt_call;
9454
          }
9455
 
9456
      /* Here, we know we don't have a plt entry.  If we don't have a
9457
         either a defined function descriptor or a defined entry symbol
9458
         in a regular object file, then it is pointless trying to make
9459
         any other type of stub.  */
9460
      if (!is_static_defined (&fdh->elf)
9461
          && !is_static_defined (&h->elf))
9462
        return ppc_stub_none;
9463
    }
9464
  else if (elf_local_got_ents (input_sec->owner) != NULL)
9465
    {
9466
      Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner);
9467
      struct plt_entry **local_plt = (struct plt_entry **)
9468
        elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info;
9469
      unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
9470
 
9471
      if (local_plt[r_symndx] != NULL)
9472
        {
9473
          struct plt_entry *ent;
9474
 
9475
          for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next)
9476
            if (ent->addend == rel->r_addend
9477
                && ent->plt.offset != (bfd_vma) -1)
9478
              {
9479
                *plt_ent = ent;
9480
                return ppc_stub_plt_call;
9481
              }
9482
        }
9483
    }
9484
 
9485
  /* Determine where the call point is.  */
9486
  location = (input_sec->output_offset
9487
              + input_sec->output_section->vma
9488
              + rel->r_offset);
9489
 
9490
  branch_offset = destination - location;
9491
  r_type = ELF64_R_TYPE (rel->r_info);
9492
 
9493
  /* Determine if a long branch stub is needed.  */
9494
  max_branch_offset = 1 << 25;
9495
  if (r_type != R_PPC64_REL24)
9496
    max_branch_offset = 1 << 15;
9497
 
9498
  if (branch_offset + max_branch_offset >= 2 * max_branch_offset)
9499
    /* We need a stub.  Figure out whether a long_branch or plt_branch
9500
       is needed later.  */
9501
    return ppc_stub_long_branch;
9502
 
9503
  return ppc_stub_none;
9504
}
9505
 
9506 166 khays
/* With power7 weakly ordered memory model, it is possible for ld.so
9507
   to update a plt entry in one thread and have another thread see a
9508
   stale zero toc entry.  To avoid this we need some sort of acquire
9509
   barrier in the call stub.  One solution is to make the load of the
9510
   toc word seem to appear to depend on the load of the function entry
9511
   word.  Another solution is to test for r2 being zero, and branch to
9512
   the appropriate glink entry if so.
9513 14 khays
 
9514 166 khays
   .    fake dep barrier        compare
9515
   .    ld 11,xxx(2)            ld 11,xxx(2)
9516
   .    mtctr 11                mtctr 11
9517
   .    xor 11,11,11            ld 2,xxx+8(2)
9518
   .    add 2,2,11              cmpldi 2,0
9519
   .    ld 2,xxx+8(2)           bnectr+
9520
   .    bctr                    b <glink_entry>
9521
 
9522
   The solution involving the compare turns out to be faster, so
9523
   that's what we use unless the branch won't reach.  */
9524
 
9525
#define ALWAYS_USE_FAKE_DEP 0
9526
#define ALWAYS_EMIT_R2SAVE 0
9527
 
9528 14 khays
#define PPC_LO(v) ((v) & 0xffff)
9529
#define PPC_HI(v) (((v) >> 16) & 0xffff)
9530
#define PPC_HA(v) PPC_HI ((v) + 0x8000)
9531
 
9532 166 khays
static inline unsigned int
9533
plt_stub_size (struct ppc_link_hash_table *htab,
9534
               struct ppc_stub_hash_entry *stub_entry,
9535
               bfd_vma off)
9536
{
9537
  unsigned size = PLT_CALL_STUB_SIZE;
9538
 
9539
  if (!(ALWAYS_EMIT_R2SAVE
9540
        || stub_entry->stub_type == ppc_stub_plt_call_r2save))
9541
    size -= 4;
9542
  if (!htab->plt_static_chain)
9543
    size -= 4;
9544
  if (htab->plt_thread_safe)
9545
    size += 8;
9546
  if (PPC_HA (off) == 0)
9547
    size -= 4;
9548
  if (PPC_HA (off + 8 + 8 * htab->plt_static_chain) != PPC_HA (off))
9549
    size += 4;
9550
  if (stub_entry->h != NULL
9551
      && (stub_entry->h == htab->tls_get_addr_fd
9552
          || stub_entry->h == htab->tls_get_addr)
9553
      && !htab->no_tls_get_addr_opt)
9554
    size += 13 * 4;
9555
  return size;
9556
}
9557
 
9558
/* If this stub would cross fewer 2**plt_stub_align boundaries if we align,
9559
   then return the padding needed to do so.  */
9560
static inline unsigned int
9561
plt_stub_pad (struct ppc_link_hash_table *htab,
9562
              struct ppc_stub_hash_entry *stub_entry,
9563
              bfd_vma plt_off)
9564
{
9565
  int stub_align = 1 << htab->plt_stub_align;
9566
  unsigned stub_size = plt_stub_size (htab, stub_entry, plt_off);
9567
  bfd_vma stub_off = stub_entry->stub_sec->size;
9568
 
9569
  if (((stub_off + stub_size - 1) & -stub_align) - (stub_off & -stub_align)
9570
      > (stub_size & -stub_align))
9571
    return stub_align - (stub_off & (stub_align - 1));
9572
  return 0;
9573
}
9574
 
9575
/* Build a .plt call stub.  */
9576
 
9577
static inline bfd_byte *
9578
build_plt_stub (struct ppc_link_hash_table *htab,
9579
                struct ppc_stub_hash_entry *stub_entry,
9580
                bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
9581
{
9582
  bfd *obfd = htab->stub_bfd;
9583
  bfd_boolean plt_static_chain = htab->plt_static_chain;
9584
  bfd_boolean plt_thread_safe = htab->plt_thread_safe;
9585
  bfd_boolean use_fake_dep = plt_thread_safe;
9586
  bfd_vma cmp_branch_off = 0;
9587
 
9588
  if (!ALWAYS_USE_FAKE_DEP
9589
      && plt_thread_safe
9590
      && !(stub_entry->h != NULL
9591
           && (stub_entry->h == htab->tls_get_addr_fd
9592
               || stub_entry->h == htab->tls_get_addr)
9593
           && !htab->no_tls_get_addr_opt))
9594
    {
9595
      bfd_vma pltoff = stub_entry->plt_ent->plt.offset & ~1;
9596
      bfd_vma pltindex = (pltoff - PLT_INITIAL_ENTRY_SIZE) / PLT_ENTRY_SIZE;
9597
      bfd_vma glinkoff = GLINK_CALL_STUB_SIZE + pltindex * 8;
9598
      bfd_vma to, from;
9599
 
9600
      if (pltindex > 32767)
9601
        glinkoff += (pltindex - 32767) * 4;
9602
      to = (glinkoff
9603
            + htab->glink->output_offset
9604
            + htab->glink->output_section->vma);
9605
      from = (p - stub_entry->stub_sec->contents
9606
              + 4 * (ALWAYS_EMIT_R2SAVE
9607
                     || stub_entry->stub_type == ppc_stub_plt_call_r2save)
9608
              + 4 * (PPC_HA (offset) != 0)
9609
              + 4 * (PPC_HA (offset + 8 + 8 * plt_static_chain)
9610
                     != PPC_HA (offset))
9611
              + 4 * (plt_static_chain != 0)
9612
              + 20
9613
              + stub_entry->stub_sec->output_offset
9614
              + stub_entry->stub_sec->output_section->vma);
9615
      cmp_branch_off = to - from;
9616
      use_fake_dep = cmp_branch_off + (1 << 25) >= (1 << 26);
9617
    }
9618
 
9619 14 khays
  if (PPC_HA (offset) != 0)
9620
    {
9621
      if (r != NULL)
9622
        {
9623 166 khays
          if (ALWAYS_EMIT_R2SAVE
9624
              || stub_entry->stub_type == ppc_stub_plt_call_r2save)
9625
            r[0].r_offset += 4;
9626 14 khays
          r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
9627 163 khays
          r[1].r_offset = r[0].r_offset + 4;
9628 14 khays
          r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
9629
          r[1].r_addend = r[0].r_addend;
9630 161 khays
          if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
9631 14 khays
            {
9632
              r[2].r_offset = r[1].r_offset + 4;
9633
              r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO);
9634
              r[2].r_addend = r[0].r_addend;
9635
            }
9636
          else
9637
            {
9638 166 khays
              r[2].r_offset = r[1].r_offset + 8 + 8 * use_fake_dep;
9639 14 khays
              r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
9640
              r[2].r_addend = r[0].r_addend + 8;
9641 161 khays
              if (plt_static_chain)
9642
                {
9643
                  r[3].r_offset = r[2].r_offset + 4;
9644
                  r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
9645
                  r[3].r_addend = r[0].r_addend + 16;
9646
                }
9647 14 khays
            }
9648
        }
9649 166 khays
      if (ALWAYS_EMIT_R2SAVE
9650
          || stub_entry->stub_type == ppc_stub_plt_call_r2save)
9651
        bfd_put_32 (obfd, STD_R2_40R1, p),                      p += 4;
9652 14 khays
      bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p),     p += 4;
9653
      bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset), p),      p += 4;
9654 161 khays
      if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
9655 14 khays
        {
9656
          bfd_put_32 (obfd, ADDI_R12_R12 | PPC_LO (offset), p), p += 4;
9657
          offset = 0;
9658
        }
9659
      bfd_put_32 (obfd, MTCTR_R11, p),                          p += 4;
9660 166 khays
      if (use_fake_dep)
9661
        {
9662
          bfd_put_32 (obfd, XOR_R11_R11_R11, p),                p += 4;
9663
          bfd_put_32 (obfd, ADD_R12_R12_R11, p),                p += 4;
9664
        }
9665 14 khays
      bfd_put_32 (obfd, LD_R2_0R12 | PPC_LO (offset + 8), p),   p += 4;
9666 161 khays
      if (plt_static_chain)
9667
        bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset + 16), p), p += 4;
9668 14 khays
    }
9669
  else
9670
    {
9671
      if (r != NULL)
9672
        {
9673 166 khays
          if (ALWAYS_EMIT_R2SAVE
9674
              || stub_entry->stub_type == ppc_stub_plt_call_r2save)
9675
            r[0].r_offset += 4;
9676 14 khays
          r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
9677 161 khays
          if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
9678 14 khays
            {
9679
              r[1].r_offset = r[0].r_offset + 4;
9680
              r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16);
9681
              r[1].r_addend = r[0].r_addend;
9682
            }
9683
          else
9684
            {
9685 166 khays
              r[1].r_offset = r[0].r_offset + 8 + 8 * use_fake_dep;
9686 14 khays
              r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
9687 161 khays
              r[1].r_addend = r[0].r_addend + 8 + 8 * plt_static_chain;
9688
              if (plt_static_chain)
9689
                {
9690
                  r[2].r_offset = r[1].r_offset + 4;
9691
                  r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
9692
                  r[2].r_addend = r[0].r_addend + 8;
9693
                }
9694 14 khays
            }
9695
        }
9696 166 khays
      if (ALWAYS_EMIT_R2SAVE
9697
          || stub_entry->stub_type == ppc_stub_plt_call_r2save)
9698
        bfd_put_32 (obfd, STD_R2_40R1, p),                      p += 4;
9699 14 khays
      bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset), p),       p += 4;
9700 161 khays
      if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
9701 14 khays
        {
9702
          bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p),   p += 4;
9703
          offset = 0;
9704
        }
9705
      bfd_put_32 (obfd, MTCTR_R11, p),                          p += 4;
9706 166 khays
      if (use_fake_dep)
9707
        {
9708
          bfd_put_32 (obfd, XOR_R11_R11_R11, p),                p += 4;
9709
          bfd_put_32 (obfd, ADD_R2_R2_R11, p),                  p += 4;
9710
        }
9711 161 khays
      if (plt_static_chain)
9712
        bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p), p += 4;
9713 14 khays
      bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p),    p += 4;
9714
    }
9715 166 khays
  if (plt_thread_safe && !use_fake_dep)
9716
    {
9717
      bfd_put_32 (obfd, CMPLDI_R2_0, p),                        p += 4;
9718
      bfd_put_32 (obfd, BNECTR_P4, p),                          p += 4;
9719
      bfd_put_32 (obfd, B_DOT + cmp_branch_off, p),             p += 4;
9720
    }
9721
  else
9722
    bfd_put_32 (obfd, BCTR, p),                                 p += 4;
9723 14 khays
  return p;
9724
}
9725
 
9726
/* Build a special .plt call stub for __tls_get_addr.  */
9727
 
9728
#define LD_R11_0R3      0xe9630000
9729
#define LD_R12_0R3      0xe9830000
9730
#define MR_R0_R3        0x7c601b78
9731
#define CMPDI_R11_0     0x2c2b0000
9732
#define ADD_R3_R12_R13  0x7c6c6a14
9733
#define BEQLR           0x4d820020
9734
#define MR_R3_R0        0x7c030378
9735
#define MFLR_R11        0x7d6802a6
9736
#define STD_R11_0R1     0xf9610000
9737
#define BCTRL           0x4e800421
9738
#define LD_R11_0R1      0xe9610000
9739
#define LD_R2_0R1       0xe8410000
9740
#define MTLR_R11        0x7d6803a6
9741
 
9742
static inline bfd_byte *
9743 166 khays
build_tls_get_addr_stub (struct ppc_link_hash_table *htab,
9744
                         struct ppc_stub_hash_entry *stub_entry,
9745
                         bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
9746 14 khays
{
9747 166 khays
  bfd *obfd = htab->stub_bfd;
9748
 
9749 14 khays
  bfd_put_32 (obfd, LD_R11_0R3 + 0, p),          p += 4;
9750
  bfd_put_32 (obfd, LD_R12_0R3 + 8, p),         p += 4;
9751
  bfd_put_32 (obfd, MR_R0_R3, p),               p += 4;
9752
  bfd_put_32 (obfd, CMPDI_R11_0, p),            p += 4;
9753
  bfd_put_32 (obfd, ADD_R3_R12_R13, p),         p += 4;
9754
  bfd_put_32 (obfd, BEQLR, p),                  p += 4;
9755
  bfd_put_32 (obfd, MR_R3_R0, p),               p += 4;
9756
  bfd_put_32 (obfd, MFLR_R11, p),               p += 4;
9757
  bfd_put_32 (obfd, STD_R11_0R1 + 32, p),       p += 4;
9758
 
9759
  if (r != NULL)
9760
    r[0].r_offset += 9 * 4;
9761 166 khays
  p = build_plt_stub (htab, stub_entry, p, offset, r);
9762 14 khays
  bfd_put_32 (obfd, BCTRL, p - 4);
9763
 
9764
  bfd_put_32 (obfd, LD_R11_0R1 + 32, p),        p += 4;
9765
  bfd_put_32 (obfd, LD_R2_0R1 + 40, p),         p += 4;
9766
  bfd_put_32 (obfd, MTLR_R11, p),               p += 4;
9767
  bfd_put_32 (obfd, BLR, p),                    p += 4;
9768
 
9769
  return p;
9770
}
9771
 
9772
static Elf_Internal_Rela *
9773
get_relocs (asection *sec, int count)
9774
{
9775
  Elf_Internal_Rela *relocs;
9776
  struct bfd_elf_section_data *elfsec_data;
9777
 
9778
  elfsec_data = elf_section_data (sec);
9779
  relocs = elfsec_data->relocs;
9780
  if (relocs == NULL)
9781
    {
9782
      bfd_size_type relsize;
9783
      relsize = sec->reloc_count * sizeof (*relocs);
9784
      relocs = bfd_alloc (sec->owner, relsize);
9785
      if (relocs == NULL)
9786
        return NULL;
9787
      elfsec_data->relocs = relocs;
9788
      elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
9789
                                          sizeof (Elf_Internal_Shdr));
9790
      if (elfsec_data->rela.hdr == NULL)
9791
        return NULL;
9792
      elfsec_data->rela.hdr->sh_size = (sec->reloc_count
9793
                                        * sizeof (Elf64_External_Rela));
9794
      elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
9795
      sec->reloc_count = 0;
9796
    }
9797
  relocs += sec->reloc_count;
9798
  sec->reloc_count += count;
9799
  return relocs;
9800
}
9801
 
9802
static bfd_vma
9803
get_r2off (struct bfd_link_info *info,
9804
           struct ppc_stub_hash_entry *stub_entry)
9805
{
9806
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
9807
  bfd_vma r2off = htab->stub_group[stub_entry->target_section->id].toc_off;
9808
 
9809
  if (r2off == 0)
9810
    {
9811
      /* Support linking -R objects.  Get the toc pointer from the
9812
         opd entry.  */
9813
      char buf[8];
9814
      asection *opd = stub_entry->h->elf.root.u.def.section;
9815
      bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
9816
 
9817
      if (strcmp (opd->name, ".opd") != 0
9818
          || opd->reloc_count != 0)
9819
        {
9820 161 khays
          info->callbacks->einfo (_("%P: cannot find opd entry toc for %s\n"),
9821 14 khays
                                  stub_entry->h->elf.root.root.string);
9822
          bfd_set_error (bfd_error_bad_value);
9823
          return 0;
9824
        }
9825
      if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
9826
        return 0;
9827
      r2off = bfd_get_64 (opd->owner, buf);
9828
      r2off -= elf_gp (info->output_bfd);
9829
    }
9830
  r2off -= htab->stub_group[stub_entry->id_sec->id].toc_off;
9831
  return r2off;
9832
}
9833
 
9834
static bfd_boolean
9835
ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
9836
{
9837
  struct ppc_stub_hash_entry *stub_entry;
9838
  struct ppc_branch_hash_entry *br_entry;
9839
  struct bfd_link_info *info;
9840
  struct ppc_link_hash_table *htab;
9841
  bfd_byte *loc;
9842
  bfd_byte *p;
9843
  bfd_vma dest, off;
9844
  int size;
9845
  Elf_Internal_Rela *r;
9846
  asection *plt;
9847
 
9848
  /* Massage our args to the form they really have.  */
9849
  stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
9850
  info = in_arg;
9851
 
9852
  htab = ppc_hash_table (info);
9853
  if (htab == NULL)
9854
    return FALSE;
9855
 
9856
  /* Make a note of the offset within the stubs for this entry.  */
9857
  stub_entry->stub_offset = stub_entry->stub_sec->size;
9858
  loc = stub_entry->stub_sec->contents + stub_entry->stub_offset;
9859
 
9860
  htab->stub_count[stub_entry->stub_type - 1] += 1;
9861
  switch (stub_entry->stub_type)
9862
    {
9863
    case ppc_stub_long_branch:
9864
    case ppc_stub_long_branch_r2off:
9865
      /* Branches are relative.  This is where we are going to.  */
9866
      off = dest = (stub_entry->target_value
9867
                    + stub_entry->target_section->output_offset
9868
                    + stub_entry->target_section->output_section->vma);
9869
 
9870
      /* And this is where we are coming from.  */
9871
      off -= (stub_entry->stub_offset
9872
              + stub_entry->stub_sec->output_offset
9873
              + stub_entry->stub_sec->output_section->vma);
9874
 
9875
      size = 4;
9876
      if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
9877
        {
9878
          bfd_vma r2off = get_r2off (info, stub_entry);
9879
 
9880
          if (r2off == 0)
9881
            {
9882
              htab->stub_error = TRUE;
9883
              return FALSE;
9884
            }
9885
          bfd_put_32 (htab->stub_bfd, STD_R2_40R1, loc);
9886
          loc += 4;
9887
          size = 12;
9888
          if (PPC_HA (r2off) != 0)
9889
            {
9890
              size = 16;
9891
              bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
9892
              loc += 4;
9893
            }
9894
          bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
9895
          loc += 4;
9896
          off -= size - 4;
9897
        }
9898
      bfd_put_32 (htab->stub_bfd, B_DOT | (off & 0x3fffffc), loc);
9899
 
9900
      if (off + (1 << 25) >= (bfd_vma) (1 << 26))
9901
        {
9902 161 khays
          info->callbacks->einfo (_("%P: long branch stub `%s' offset overflow\n"),
9903 14 khays
                                  stub_entry->root.string);
9904
          htab->stub_error = TRUE;
9905
          return FALSE;
9906
        }
9907
 
9908
      if (info->emitrelocations)
9909
        {
9910
          r = get_relocs (stub_entry->stub_sec, 1);
9911
          if (r == NULL)
9912
            return FALSE;
9913
          r->r_offset = loc - stub_entry->stub_sec->contents;
9914
          r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
9915
          r->r_addend = dest;
9916
          if (stub_entry->h != NULL)
9917
            {
9918
              struct elf_link_hash_entry **hashes;
9919
              unsigned long symndx;
9920
              struct ppc_link_hash_entry *h;
9921
 
9922
              hashes = elf_sym_hashes (htab->stub_bfd);
9923
              if (hashes == NULL)
9924
                {
9925
                  bfd_size_type hsize;
9926
 
9927
                  hsize = (htab->stub_globals + 1) * sizeof (*hashes);
9928
                  hashes = bfd_zalloc (htab->stub_bfd, hsize);
9929
                  if (hashes == NULL)
9930
                    return FALSE;
9931
                  elf_sym_hashes (htab->stub_bfd) = hashes;
9932
                  htab->stub_globals = 1;
9933
                }
9934
              symndx = htab->stub_globals++;
9935
              h = stub_entry->h;
9936
              hashes[symndx] = &h->elf;
9937
              r->r_info = ELF64_R_INFO (symndx, R_PPC64_REL24);
9938
              if (h->oh != NULL && h->oh->is_func)
9939
                h = ppc_follow_link (h->oh);
9940
              if (h->elf.root.u.def.section != stub_entry->target_section)
9941
                /* H is an opd symbol.  The addend must be zero.  */
9942
                r->r_addend = 0;
9943
              else
9944
                {
9945
                  off = (h->elf.root.u.def.value
9946
                         + h->elf.root.u.def.section->output_offset
9947
                         + h->elf.root.u.def.section->output_section->vma);
9948
                  r->r_addend -= off;
9949
                }
9950
            }
9951
        }
9952
      break;
9953
 
9954
    case ppc_stub_plt_branch:
9955
    case ppc_stub_plt_branch_r2off:
9956
      br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
9957
                                         stub_entry->root.string + 9,
9958
                                         FALSE, FALSE);
9959
      if (br_entry == NULL)
9960
        {
9961 161 khays
          info->callbacks->einfo (_("%P: can't find branch stub `%s'\n"),
9962 14 khays
                                  stub_entry->root.string);
9963
          htab->stub_error = TRUE;
9964
          return FALSE;
9965
        }
9966
 
9967
      dest = (stub_entry->target_value
9968
              + stub_entry->target_section->output_offset
9969
              + stub_entry->target_section->output_section->vma);
9970
 
9971
      bfd_put_64 (htab->brlt->owner, dest,
9972
                  htab->brlt->contents + br_entry->offset);
9973
 
9974
      if (br_entry->iter == htab->stub_iteration)
9975
        {
9976
          br_entry->iter = 0;
9977
 
9978
          if (htab->relbrlt != NULL)
9979
            {
9980
              /* Create a reloc for the branch lookup table entry.  */
9981
              Elf_Internal_Rela rela;
9982
              bfd_byte *rl;
9983
 
9984
              rela.r_offset = (br_entry->offset
9985
                               + htab->brlt->output_offset
9986
                               + htab->brlt->output_section->vma);
9987
              rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
9988
              rela.r_addend = dest;
9989
 
9990
              rl = htab->relbrlt->contents;
9991
              rl += (htab->relbrlt->reloc_count++
9992
                     * sizeof (Elf64_External_Rela));
9993
              bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
9994
            }
9995
          else if (info->emitrelocations)
9996
            {
9997
              r = get_relocs (htab->brlt, 1);
9998
              if (r == NULL)
9999
                return FALSE;
10000
              /* brlt, being SEC_LINKER_CREATED does not go through the
10001
                 normal reloc processing.  Symbols and offsets are not
10002
                 translated from input file to output file form, so
10003
                 set up the offset per the output file.  */
10004
              r->r_offset = (br_entry->offset
10005
                             + htab->brlt->output_offset
10006
                             + htab->brlt->output_section->vma);
10007
              r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
10008
              r->r_addend = dest;
10009
            }
10010
        }
10011
 
10012
      dest = (br_entry->offset
10013
              + htab->brlt->output_offset
10014
              + htab->brlt->output_section->vma);
10015
 
10016
      off = (dest
10017
             - elf_gp (htab->brlt->output_section->owner)
10018
             - htab->stub_group[stub_entry->id_sec->id].toc_off);
10019
 
10020
      if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
10021
        {
10022
          info->callbacks->einfo
10023 161 khays
            (_("%P: linkage table error against `%s'\n"),
10024 14 khays
             stub_entry->root.string);
10025
          bfd_set_error (bfd_error_bad_value);
10026
          htab->stub_error = TRUE;
10027
          return FALSE;
10028
        }
10029
 
10030
      if (info->emitrelocations)
10031
        {
10032
          r = get_relocs (stub_entry->stub_sec, 1 + (PPC_HA (off) != 0));
10033
          if (r == NULL)
10034
            return FALSE;
10035
          r[0].r_offset = loc - stub_entry->stub_sec->contents;
10036
          if (bfd_big_endian (info->output_bfd))
10037
            r[0].r_offset += 2;
10038
          if (stub_entry->stub_type == ppc_stub_plt_branch_r2off)
10039
            r[0].r_offset += 4;
10040
          r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10041
          r[0].r_addend = dest;
10042
          if (PPC_HA (off) != 0)
10043
            {
10044
              r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
10045
              r[1].r_offset = r[0].r_offset + 4;
10046
              r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10047
              r[1].r_addend = r[0].r_addend;
10048
            }
10049
        }
10050
 
10051
      if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
10052
        {
10053
          if (PPC_HA (off) != 0)
10054
            {
10055
              size = 16;
10056
              bfd_put_32 (htab->stub_bfd, ADDIS_R12_R2 | PPC_HA (off), loc);
10057
              loc += 4;
10058
              bfd_put_32 (htab->stub_bfd, LD_R11_0R12 | PPC_LO (off), loc);
10059
            }
10060
          else
10061
            {
10062
              size = 12;
10063
              bfd_put_32 (htab->stub_bfd, LD_R11_0R2 | PPC_LO (off), loc);
10064
            }
10065
        }
10066
      else
10067
        {
10068
          bfd_vma r2off = get_r2off (info, stub_entry);
10069
 
10070
          if (r2off == 0)
10071
            {
10072
              htab->stub_error = TRUE;
10073
              return FALSE;
10074
            }
10075
 
10076
          bfd_put_32 (htab->stub_bfd, STD_R2_40R1, loc);
10077
          loc += 4;
10078
          size = 20;
10079
          if (PPC_HA (off) != 0)
10080
            {
10081
              size += 4;
10082
              bfd_put_32 (htab->stub_bfd, ADDIS_R12_R2 | PPC_HA (off), loc);
10083
              loc += 4;
10084
              bfd_put_32 (htab->stub_bfd, LD_R11_0R12 | PPC_LO (off), loc);
10085
              loc += 4;
10086
            }
10087
          else
10088
            {
10089
              bfd_put_32 (htab->stub_bfd, LD_R11_0R2 | PPC_LO (off), loc);
10090
              loc += 4;
10091
            }
10092
 
10093
          if (PPC_HA (r2off) != 0)
10094
            {
10095
              size += 4;
10096
              bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
10097
              loc += 4;
10098
            }
10099
          bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
10100
        }
10101
      loc += 4;
10102
      bfd_put_32 (htab->stub_bfd, MTCTR_R11, loc);
10103
      loc += 4;
10104
      bfd_put_32 (htab->stub_bfd, BCTR, loc);
10105
      break;
10106
 
10107
    case ppc_stub_plt_call:
10108 166 khays
    case ppc_stub_plt_call_r2save:
10109 14 khays
      if (stub_entry->h != NULL
10110
          && stub_entry->h->is_func_descriptor
10111
          && stub_entry->h->oh != NULL)
10112
        {
10113
          struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
10114
 
10115
          /* If the old-ABI "dot-symbol" is undefined make it weak so
10116
             we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL.
10117
             FIXME: We used to define the symbol on one of the call
10118
             stubs instead, which is why we test symbol section id
10119
             against htab->top_id in various places.  Likely all
10120
             these checks could now disappear.  */
10121
          if (fh->elf.root.type == bfd_link_hash_undefined)
10122
            fh->elf.root.type = bfd_link_hash_undefweak;
10123
          /* Stop undo_symbol_twiddle changing it back to undefined.  */
10124
          fh->was_undefined = 0;
10125
        }
10126
 
10127
      /* Now build the stub.  */
10128
      dest = stub_entry->plt_ent->plt.offset & ~1;
10129
      if (dest >= (bfd_vma) -2)
10130
        abort ();
10131
 
10132
      plt = htab->plt;
10133
      if (!htab->elf.dynamic_sections_created
10134
          || stub_entry->h == NULL
10135
          || stub_entry->h->elf.dynindx == -1)
10136
        plt = htab->iplt;
10137
 
10138
      dest += plt->output_offset + plt->output_section->vma;
10139
 
10140
      if (stub_entry->h == NULL
10141
          && (stub_entry->plt_ent->plt.offset & 1) == 0)
10142
        {
10143
          Elf_Internal_Rela rela;
10144
          bfd_byte *rl;
10145
 
10146
          rela.r_offset = dest;
10147
          rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
10148
          rela.r_addend = (stub_entry->target_value
10149
                           + stub_entry->target_section->output_offset
10150
                           + stub_entry->target_section->output_section->vma);
10151
 
10152
          rl = (htab->reliplt->contents
10153
                + (htab->reliplt->reloc_count++
10154
                   * sizeof (Elf64_External_Rela)));
10155
          bfd_elf64_swap_reloca_out (info->output_bfd, &rela, rl);
10156
          stub_entry->plt_ent->plt.offset |= 1;
10157
        }
10158
 
10159
      off = (dest
10160
             - elf_gp (plt->output_section->owner)
10161
             - htab->stub_group[stub_entry->id_sec->id].toc_off);
10162
 
10163
      if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
10164
        {
10165
          info->callbacks->einfo
10166 161 khays
            (_("%P: linkage table error against `%s'\n"),
10167 14 khays
             stub_entry->h != NULL
10168
             ? stub_entry->h->elf.root.root.string
10169
             : "<local sym>");
10170
          bfd_set_error (bfd_error_bad_value);
10171
          htab->stub_error = TRUE;
10172
          return FALSE;
10173
        }
10174
 
10175 166 khays
      if (htab->plt_stub_align != 0)
10176
        {
10177
          unsigned pad = plt_stub_pad (htab, stub_entry, off);
10178
 
10179
          stub_entry->stub_sec->size += pad;
10180
          stub_entry->stub_offset = stub_entry->stub_sec->size;
10181
          loc += pad;
10182
        }
10183
 
10184 14 khays
      r = NULL;
10185
      if (info->emitrelocations)
10186
        {
10187
          r = get_relocs (stub_entry->stub_sec,
10188 161 khays
                          (2
10189
                           + (PPC_HA (off) != 0)
10190
                           + (htab->plt_static_chain
10191
                              && PPC_HA (off + 16) == PPC_HA (off))));
10192 14 khays
          if (r == NULL)
10193
            return FALSE;
10194
          r[0].r_offset = loc - stub_entry->stub_sec->contents;
10195
          if (bfd_big_endian (info->output_bfd))
10196
            r[0].r_offset += 2;
10197
          r[0].r_addend = dest;
10198
        }
10199
      if (stub_entry->h != NULL
10200
          && (stub_entry->h == htab->tls_get_addr_fd
10201
              || stub_entry->h == htab->tls_get_addr)
10202
          && !htab->no_tls_get_addr_opt)
10203 166 khays
        p = build_tls_get_addr_stub (htab, stub_entry, loc, off, r);
10204 14 khays
      else
10205 166 khays
        p = build_plt_stub (htab, stub_entry, loc, off, r);
10206 14 khays
      size = p - loc;
10207
      break;
10208
 
10209
    default:
10210
      BFD_FAIL ();
10211
      return FALSE;
10212
    }
10213
 
10214
  stub_entry->stub_sec->size += size;
10215
 
10216
  if (htab->emit_stub_syms)
10217
    {
10218
      struct elf_link_hash_entry *h;
10219
      size_t len1, len2;
10220
      char *name;
10221
      const char *const stub_str[] = { "long_branch",
10222
                                       "long_branch_r2off",
10223
                                       "plt_branch",
10224
                                       "plt_branch_r2off",
10225 166 khays
                                       "plt_call",
10226 14 khays
                                       "plt_call" };
10227
 
10228
      len1 = strlen (stub_str[stub_entry->stub_type - 1]);
10229
      len2 = strlen (stub_entry->root.string);
10230
      name = bfd_malloc (len1 + len2 + 2);
10231
      if (name == NULL)
10232
        return FALSE;
10233
      memcpy (name, stub_entry->root.string, 9);
10234
      memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
10235
      memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
10236
      h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
10237
      if (h == NULL)
10238
        return FALSE;
10239
      if (h->root.type == bfd_link_hash_new)
10240
        {
10241
          h->root.type = bfd_link_hash_defined;
10242
          h->root.u.def.section = stub_entry->stub_sec;
10243
          h->root.u.def.value = stub_entry->stub_offset;
10244
          h->ref_regular = 1;
10245
          h->def_regular = 1;
10246
          h->ref_regular_nonweak = 1;
10247
          h->forced_local = 1;
10248
          h->non_elf = 0;
10249
        }
10250
    }
10251
 
10252
  return TRUE;
10253
}
10254
 
10255
/* As above, but don't actually build the stub.  Just bump offset so
10256
   we know stub section sizes, and select plt_branch stubs where
10257
   long_branch stubs won't do.  */
10258
 
10259
static bfd_boolean
10260
ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
10261
{
10262
  struct ppc_stub_hash_entry *stub_entry;
10263
  struct bfd_link_info *info;
10264
  struct ppc_link_hash_table *htab;
10265
  bfd_vma off;
10266
  int size;
10267
 
10268
  /* Massage our args to the form they really have.  */
10269
  stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
10270
  info = in_arg;
10271
 
10272
  htab = ppc_hash_table (info);
10273
  if (htab == NULL)
10274
    return FALSE;
10275
 
10276 166 khays
  if (stub_entry->stub_type == ppc_stub_plt_call
10277
      || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10278 14 khays
    {
10279
      asection *plt;
10280
      off = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
10281
      if (off >= (bfd_vma) -2)
10282
        abort ();
10283
      plt = htab->plt;
10284
      if (!htab->elf.dynamic_sections_created
10285
          || stub_entry->h == NULL
10286
          || stub_entry->h->elf.dynindx == -1)
10287
        plt = htab->iplt;
10288
      off += (plt->output_offset
10289
              + plt->output_section->vma
10290
              - elf_gp (plt->output_section->owner)
10291
              - htab->stub_group[stub_entry->id_sec->id].toc_off);
10292
 
10293 166 khays
      size = plt_stub_size (htab, stub_entry, off);
10294
      if (htab->plt_stub_align)
10295
        size += plt_stub_pad (htab, stub_entry, off);
10296 14 khays
      if (info->emitrelocations)
10297
        {
10298
          stub_entry->stub_sec->reloc_count
10299 161 khays
            += (2
10300
                + (PPC_HA (off) != 0)
10301
                + (htab->plt_static_chain
10302
                   && PPC_HA (off + 16) == PPC_HA (off)));
10303 14 khays
          stub_entry->stub_sec->flags |= SEC_RELOC;
10304
        }
10305
    }
10306
  else
10307
    {
10308
      /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
10309
         variants.  */
10310
      bfd_vma r2off = 0;
10311
 
10312
      off = (stub_entry->target_value
10313
             + stub_entry->target_section->output_offset
10314
             + stub_entry->target_section->output_section->vma);
10315
      off -= (stub_entry->stub_sec->size
10316
              + stub_entry->stub_sec->output_offset
10317
              + stub_entry->stub_sec->output_section->vma);
10318
 
10319
      /* Reset the stub type from the plt variant in case we now
10320
         can reach with a shorter stub.  */
10321
      if (stub_entry->stub_type >= ppc_stub_plt_branch)
10322
        stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
10323
 
10324
      size = 4;
10325
      if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
10326
        {
10327
          r2off = get_r2off (info, stub_entry);
10328
          if (r2off == 0)
10329
            {
10330
              htab->stub_error = TRUE;
10331
              return FALSE;
10332
            }
10333
          size = 12;
10334
          if (PPC_HA (r2off) != 0)
10335
            size = 16;
10336
          off -= size - 4;
10337
        }
10338
 
10339
      /* If the branch offset if too big, use a ppc_stub_plt_branch.  */
10340
      if (off + (1 << 25) >= (bfd_vma) (1 << 26))
10341
        {
10342
          struct ppc_branch_hash_entry *br_entry;
10343
 
10344
          br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
10345
                                             stub_entry->root.string + 9,
10346
                                             TRUE, FALSE);
10347
          if (br_entry == NULL)
10348
            {
10349 161 khays
              info->callbacks->einfo (_("%P: can't build branch stub `%s'\n"),
10350 14 khays
                                      stub_entry->root.string);
10351
              htab->stub_error = TRUE;
10352
              return FALSE;
10353
            }
10354
 
10355
          if (br_entry->iter != htab->stub_iteration)
10356
            {
10357
              br_entry->iter = htab->stub_iteration;
10358
              br_entry->offset = htab->brlt->size;
10359
              htab->brlt->size += 8;
10360
 
10361
              if (htab->relbrlt != NULL)
10362
                htab->relbrlt->size += sizeof (Elf64_External_Rela);
10363
              else if (info->emitrelocations)
10364
                {
10365
                  htab->brlt->reloc_count += 1;
10366
                  htab->brlt->flags |= SEC_RELOC;
10367
                }
10368
            }
10369
 
10370
          stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
10371
          off = (br_entry->offset
10372
                 + htab->brlt->output_offset
10373
                 + htab->brlt->output_section->vma
10374
                 - elf_gp (htab->brlt->output_section->owner)
10375
                 - htab->stub_group[stub_entry->id_sec->id].toc_off);
10376
 
10377
          if (info->emitrelocations)
10378
            {
10379
              stub_entry->stub_sec->reloc_count += 1 + (PPC_HA (off) != 0);
10380
              stub_entry->stub_sec->flags |= SEC_RELOC;
10381
            }
10382
 
10383
          if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
10384
            {
10385
              size = 12;
10386
              if (PPC_HA (off) != 0)
10387
                size = 16;
10388
            }
10389
          else
10390
            {
10391
              size = 20;
10392
              if (PPC_HA (off) != 0)
10393
                size += 4;
10394
 
10395
              if (PPC_HA (r2off) != 0)
10396
                size += 4;
10397
            }
10398
        }
10399
      else if (info->emitrelocations)
10400
        {
10401
          stub_entry->stub_sec->reloc_count += 1;
10402
          stub_entry->stub_sec->flags |= SEC_RELOC;
10403
        }
10404
    }
10405
 
10406
  stub_entry->stub_sec->size += size;
10407
  return TRUE;
10408
}
10409
 
10410
/* Set up various things so that we can make a list of input sections
10411
   for each output section included in the link.  Returns -1 on error,
10412
 
10413
 
10414
int
10415
ppc64_elf_setup_section_lists
10416
  (struct bfd_link_info *info,
10417
   asection *(*add_stub_section) (const char *, asection *),
10418
   void (*layout_sections_again) (void))
10419
{
10420
  bfd *input_bfd;
10421
  int top_id, top_index, id;
10422
  asection *section;
10423
  asection **input_list;
10424
  bfd_size_type amt;
10425
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
10426
 
10427
  if (htab == NULL)
10428
    return -1;
10429
  /* Stash our params away.  */
10430
  htab->add_stub_section = add_stub_section;
10431
  htab->layout_sections_again = layout_sections_again;
10432
 
10433
  if (htab->brlt == NULL)
10434
    return 0;
10435
 
10436
  /* Find the top input section id.  */
10437
  for (input_bfd = info->input_bfds, top_id = 3;
10438
       input_bfd != NULL;
10439
       input_bfd = input_bfd->link_next)
10440
    {
10441
      for (section = input_bfd->sections;
10442
           section != NULL;
10443
           section = section->next)
10444
        {
10445
          if (top_id < section->id)
10446
            top_id = section->id;
10447
        }
10448
    }
10449
 
10450
  htab->top_id = top_id;
10451
  amt = sizeof (struct map_stub) * (top_id + 1);
10452
  htab->stub_group = bfd_zmalloc (amt);
10453
  if (htab->stub_group == NULL)
10454
    return -1;
10455
 
10456
  /* Set toc_off for com, und, abs and ind sections.  */
10457
  for (id = 0; id < 3; id++)
10458
    htab->stub_group[id].toc_off = TOC_BASE_OFF;
10459
 
10460
  /* We can't use output_bfd->section_count here to find the top output
10461
     section index as some sections may have been removed, and
10462
     strip_excluded_output_sections doesn't renumber the indices.  */
10463
  for (section = info->output_bfd->sections, top_index = 0;
10464
       section != NULL;
10465
       section = section->next)
10466
    {
10467
      if (top_index < section->index)
10468
        top_index = section->index;
10469
    }
10470
 
10471
  htab->top_index = top_index;
10472
  amt = sizeof (asection *) * (top_index + 1);
10473
  input_list = bfd_zmalloc (amt);
10474
  htab->input_list = input_list;
10475
  if (input_list == NULL)
10476
    return -1;
10477
 
10478
  return 1;
10479
}
10480
 
10481
/* Set up for first pass at multitoc partitioning.  */
10482
 
10483
void
10484
ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
10485
{
10486
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
10487
 
10488
  elf_gp (info->output_bfd) = ppc64_elf_toc (info->output_bfd);
10489
  htab->toc_curr = elf_gp (info->output_bfd);
10490
  htab->toc_bfd = NULL;
10491
  htab->toc_first_sec = NULL;
10492
}
10493
 
10494
/* The linker repeatedly calls this function for each TOC input section
10495
   and linker generated GOT section.  Group input bfds such that the toc
10496
   within a group is less than 64k in size.  */
10497
 
10498
bfd_boolean
10499
ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
10500
{
10501
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
10502
  bfd_vma addr, off, limit;
10503
 
10504
  if (htab == NULL)
10505
    return FALSE;
10506
 
10507
  if (!htab->second_toc_pass)
10508
    {
10509
      /* Keep track of the first .toc or .got section for this input bfd.  */
10510
      if (htab->toc_bfd != isec->owner)
10511
        {
10512
          htab->toc_bfd = isec->owner;
10513
          htab->toc_first_sec = isec;
10514
        }
10515
 
10516
      addr = isec->output_offset + isec->output_section->vma;
10517
      off = addr - htab->toc_curr;
10518
      limit = 0x80008000;
10519
      if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
10520
        limit = 0x10000;
10521
      if (off + isec->size > limit)
10522
        {
10523
          addr = (htab->toc_first_sec->output_offset
10524
                  + htab->toc_first_sec->output_section->vma);
10525
          htab->toc_curr = addr;
10526
        }
10527
 
10528
      /* toc_curr is the base address of this toc group.  Set elf_gp
10529
         for the input section to be the offset relative to the
10530
         output toc base plus 0x8000.  Making the input elf_gp an
10531
         offset allows us to move the toc as a whole without
10532
         recalculating input elf_gp.  */
10533
      off = htab->toc_curr - elf_gp (isec->output_section->owner);
10534
      off += TOC_BASE_OFF;
10535
 
10536
      /* Die if someone uses a linker script that doesn't keep input
10537
         file .toc and .got together.  */
10538
      if (elf_gp (isec->owner) != 0
10539
          && elf_gp (isec->owner) != off)
10540
        return FALSE;
10541
 
10542
      elf_gp (isec->owner) = off;
10543
      return TRUE;
10544
    }
10545
 
10546
  /* During the second pass toc_first_sec points to the start of
10547
     a toc group, and toc_curr is used to track the old elf_gp.
10548
     We use toc_bfd to ensure we only look at each bfd once.  */
10549
  if (htab->toc_bfd == isec->owner)
10550
    return TRUE;
10551
  htab->toc_bfd = isec->owner;
10552
 
10553
  if (htab->toc_first_sec == NULL
10554
      || htab->toc_curr != elf_gp (isec->owner))
10555
    {
10556
      htab->toc_curr = elf_gp (isec->owner);
10557
      htab->toc_first_sec = isec;
10558
    }
10559
  addr = (htab->toc_first_sec->output_offset
10560
          + htab->toc_first_sec->output_section->vma);
10561
  off = addr - elf_gp (isec->output_section->owner) + TOC_BASE_OFF;
10562
  elf_gp (isec->owner) = off;
10563
 
10564
  return TRUE;
10565
}
10566
 
10567
/* Called via elf_link_hash_traverse to merge GOT entries for global
10568
   symbol H.  */
10569
 
10570
static bfd_boolean
10571
merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
10572
{
10573
  if (h->root.type == bfd_link_hash_indirect)
10574
    return TRUE;
10575
 
10576
  merge_got_entries (&h->got.glist);
10577
 
10578
  return TRUE;
10579
}
10580
 
10581
/* Called via elf_link_hash_traverse to allocate GOT entries for global
10582
   symbol H.  */
10583
 
10584
static bfd_boolean
10585
reallocate_got (struct elf_link_hash_entry *h, void *inf)
10586
{
10587
  struct got_entry *gent;
10588
 
10589
  if (h->root.type == bfd_link_hash_indirect)
10590
    return TRUE;
10591
 
10592
  for (gent = h->got.glist; gent != NULL; gent = gent->next)
10593
    if (!gent->is_indirect)
10594
      allocate_got (h, (struct bfd_link_info *) inf, gent);
10595
  return TRUE;
10596
}
10597
 
10598
/* Called on the first multitoc pass after the last call to
10599
   ppc64_elf_next_toc_section.  This function removes duplicate GOT
10600
   entries.  */
10601
 
10602
bfd_boolean
10603
ppc64_elf_layout_multitoc (struct bfd_link_info *info)
10604
{
10605
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
10606
  struct bfd *ibfd, *ibfd2;
10607
  bfd_boolean done_something;
10608
 
10609
  htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
10610
 
10611
  if (!htab->do_multi_toc)
10612
    return FALSE;
10613
 
10614
  /* Merge global sym got entries within a toc group.  */
10615
  elf_link_hash_traverse (&htab->elf, merge_global_got, info);
10616
 
10617
  /* And tlsld_got.  */
10618
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10619
    {
10620
      struct got_entry *ent, *ent2;
10621
 
10622
      if (!is_ppc64_elf (ibfd))
10623
        continue;
10624
 
10625
      ent = ppc64_tlsld_got (ibfd);
10626
      if (!ent->is_indirect
10627
          && ent->got.offset != (bfd_vma) -1)
10628
        {
10629
          for (ibfd2 = ibfd->link_next; ibfd2 != NULL; ibfd2 = ibfd2->link_next)
10630
            {
10631
              if (!is_ppc64_elf (ibfd2))
10632
                continue;
10633
 
10634
              ent2 = ppc64_tlsld_got (ibfd2);
10635
              if (!ent2->is_indirect
10636
                  && ent2->got.offset != (bfd_vma) -1
10637
                  && elf_gp (ibfd2) == elf_gp (ibfd))
10638
                {
10639
                  ent2->is_indirect = TRUE;
10640
                  ent2->got.ent = ent;
10641
                }
10642
            }
10643
        }
10644
    }
10645
 
10646
  /* Zap sizes of got sections.  */
10647
  htab->reliplt->rawsize = htab->reliplt->size;
10648
  htab->reliplt->size -= htab->got_reli_size;
10649
  htab->got_reli_size = 0;
10650
 
10651
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10652
    {
10653
      asection *got, *relgot;
10654
 
10655
      if (!is_ppc64_elf (ibfd))
10656
        continue;
10657
 
10658
      got = ppc64_elf_tdata (ibfd)->got;
10659
      if (got != NULL)
10660
        {
10661
          got->rawsize = got->size;
10662
          got->size = 0;
10663
          relgot = ppc64_elf_tdata (ibfd)->relgot;
10664
          relgot->rawsize = relgot->size;
10665
          relgot->size = 0;
10666
        }
10667
    }
10668
 
10669
  /* Now reallocate the got, local syms first.  We don't need to
10670
     allocate section contents again since we never increase size.  */
10671
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10672
    {
10673
      struct got_entry **lgot_ents;
10674
      struct got_entry **end_lgot_ents;
10675
      struct plt_entry **local_plt;
10676
      struct plt_entry **end_local_plt;
10677
      unsigned char *lgot_masks;
10678
      bfd_size_type locsymcount;
10679
      Elf_Internal_Shdr *symtab_hdr;
10680
      asection *s, *srel;
10681
 
10682
      if (!is_ppc64_elf (ibfd))
10683
        continue;
10684
 
10685
      lgot_ents = elf_local_got_ents (ibfd);
10686
      if (!lgot_ents)
10687
        continue;
10688
 
10689
      symtab_hdr = &elf_symtab_hdr (ibfd);
10690
      locsymcount = symtab_hdr->sh_info;
10691
      end_lgot_ents = lgot_ents + locsymcount;
10692
      local_plt = (struct plt_entry **) end_lgot_ents;
10693
      end_local_plt = local_plt + locsymcount;
10694
      lgot_masks = (unsigned char *) end_local_plt;
10695
      s = ppc64_elf_tdata (ibfd)->got;
10696
      srel = ppc64_elf_tdata (ibfd)->relgot;
10697
      for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
10698
        {
10699
          struct got_entry *ent;
10700
 
10701
          for (ent = *lgot_ents; ent != NULL; ent = ent->next)
10702
            {
10703
              unsigned int num = 1;
10704
              ent->got.offset = s->size;
10705
              if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
10706
                num = 2;
10707
              s->size += num * 8;
10708
              if (info->shared)
10709
                srel->size += num * sizeof (Elf64_External_Rela);
10710
              else if ((*lgot_masks & PLT_IFUNC) != 0)
10711
                {
10712
                  htab->reliplt->size
10713
                    += num * sizeof (Elf64_External_Rela);
10714
                  htab->got_reli_size
10715
                    += num * sizeof (Elf64_External_Rela);
10716
                }
10717
            }
10718
        }
10719
    }
10720
 
10721
  elf_link_hash_traverse (&htab->elf, reallocate_got, info);
10722
 
10723
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10724
    {
10725
      struct got_entry *ent;
10726
 
10727
      if (!is_ppc64_elf (ibfd))
10728
        continue;
10729
 
10730
      ent = ppc64_tlsld_got (ibfd);
10731
      if (!ent->is_indirect
10732
          && ent->got.offset != (bfd_vma) -1)
10733
        {
10734
          asection *s = ppc64_elf_tdata (ibfd)->got;
10735
          ent->got.offset = s->size;
10736
          s->size += 16;
10737
          if (info->shared)
10738
            {
10739
              asection *srel = ppc64_elf_tdata (ibfd)->relgot;
10740
              srel->size += sizeof (Elf64_External_Rela);
10741
            }
10742
        }
10743
    }
10744
 
10745
  done_something = htab->reliplt->rawsize != htab->reliplt->size;
10746
  if (!done_something)
10747
    for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
10748
      {
10749
        asection *got;
10750
 
10751
        if (!is_ppc64_elf (ibfd))
10752
          continue;
10753
 
10754
        got = ppc64_elf_tdata (ibfd)->got;
10755
        if (got != NULL)
10756
          {
10757
            done_something = got->rawsize != got->size;
10758
            if (done_something)
10759
              break;
10760
          }
10761
      }
10762
 
10763
  if (done_something)
10764
    (*htab->layout_sections_again) ();
10765
 
10766
  /* Set up for second pass over toc sections to recalculate elf_gp
10767
     on input sections.  */
10768
  htab->toc_bfd = NULL;
10769
  htab->toc_first_sec = NULL;
10770
  htab->second_toc_pass = TRUE;
10771
  return done_something;
10772
}
10773
 
10774
/* Called after second pass of multitoc partitioning.  */
10775
 
10776
void
10777
ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
10778
{
10779
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
10780
 
10781
  /* After the second pass, toc_curr tracks the TOC offset used
10782
     for code sections below in ppc64_elf_next_input_section.  */
10783
  htab->toc_curr = TOC_BASE_OFF;
10784
}
10785
 
10786
/* No toc references were found in ISEC.  If the code in ISEC makes no
10787
   calls, then there's no need to use toc adjusting stubs when branching
10788
   into ISEC.  Actually, indirect calls from ISEC are OK as they will
10789
   load r2.  Returns -1 on error, 0 for no stub needed, 1 for stub
10790
   needed, and 2 if a cyclical call-graph was found but no other reason
10791
   for a stub was detected.  If called from the top level, a return of
10792
   2 means the same as a return of 0.  */
10793
 
10794
static int
10795
toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
10796
{
10797
  int ret;
10798
 
10799
  /* Mark this section as checked.  */
10800
  isec->call_check_done = 1;
10801
 
10802
  /* We know none of our code bearing sections will need toc stubs.  */
10803
  if ((isec->flags & SEC_LINKER_CREATED) != 0)
10804
    return 0;
10805
 
10806
  if (isec->size == 0)
10807
    return 0;
10808
 
10809
  if (isec->output_section == NULL)
10810
    return 0;
10811
 
10812
  ret = 0;
10813
  if (isec->reloc_count != 0)
10814
    {
10815
      Elf_Internal_Rela *relstart, *rel;
10816
      Elf_Internal_Sym *local_syms;
10817
      struct ppc_link_hash_table *htab;
10818
 
10819
      relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
10820
                                            info->keep_memory);
10821
      if (relstart == NULL)
10822
        return -1;
10823
 
10824
      /* Look for branches to outside of this section.  */
10825
      local_syms = NULL;
10826
      htab = ppc_hash_table (info);
10827
      if (htab == NULL)
10828
        return -1;
10829
 
10830
      for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
10831
        {
10832
          enum elf_ppc64_reloc_type r_type;
10833
          unsigned long r_symndx;
10834
          struct elf_link_hash_entry *h;
10835
          struct ppc_link_hash_entry *eh;
10836
          Elf_Internal_Sym *sym;
10837
          asection *sym_sec;
10838
          struct _opd_sec_data *opd;
10839
          bfd_vma sym_value;
10840
          bfd_vma dest;
10841
 
10842
          r_type = ELF64_R_TYPE (rel->r_info);
10843
          if (r_type != R_PPC64_REL24
10844
              && r_type != R_PPC64_REL14
10845
              && r_type != R_PPC64_REL14_BRTAKEN
10846
              && r_type != R_PPC64_REL14_BRNTAKEN)
10847
            continue;
10848
 
10849
          r_symndx = ELF64_R_SYM (rel->r_info);
10850
          if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
10851
                          isec->owner))
10852
            {
10853
              ret = -1;
10854
              break;
10855
            }
10856
 
10857
          /* Calls to dynamic lib functions go through a plt call stub
10858
             that uses r2.  */
10859
          eh = (struct ppc_link_hash_entry *) h;
10860
          if (eh != NULL
10861
              && (eh->elf.plt.plist != NULL
10862
                  || (eh->oh != NULL
10863
                      && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
10864
            {
10865
              ret = 1;
10866
              break;
10867
            }
10868
 
10869
          if (sym_sec == NULL)
10870
            /* Ignore other undefined symbols.  */
10871
            continue;
10872
 
10873
          /* Assume branches to other sections not included in the
10874
             link need stubs too, to cover -R and absolute syms.  */
10875
          if (sym_sec->output_section == NULL)
10876
            {
10877
              ret = 1;
10878
              break;
10879
            }
10880
 
10881
          if (h == NULL)
10882
            sym_value = sym->st_value;
10883
          else
10884
            {
10885
              if (h->root.type != bfd_link_hash_defined
10886
                  && h->root.type != bfd_link_hash_defweak)
10887
                abort ();
10888
              sym_value = h->root.u.def.value;
10889
            }
10890
          sym_value += rel->r_addend;
10891
 
10892
          /* If this branch reloc uses an opd sym, find the code section.  */
10893
          opd = get_opd_info (sym_sec);
10894
          if (opd != NULL)
10895
            {
10896
              if (h == NULL && opd->adjust != NULL)
10897
                {
10898
                  long adjust;
10899
 
10900
                  adjust = opd->adjust[sym->st_value / 8];
10901
                  if (adjust == -1)
10902
                    /* Assume deleted functions won't ever be called.  */
10903
                    continue;
10904
                  sym_value += adjust;
10905
                }
10906
 
10907
              dest = opd_entry_value (sym_sec, sym_value, &sym_sec, NULL);
10908
              if (dest == (bfd_vma) -1)
10909
                continue;
10910
            }
10911
          else
10912
            dest = (sym_value
10913
                    + sym_sec->output_offset
10914
                    + sym_sec->output_section->vma);
10915
 
10916
          /* Ignore branch to self.  */
10917
          if (sym_sec == isec)
10918
            continue;
10919
 
10920
          /* If the called function uses the toc, we need a stub.  */
10921
          if (sym_sec->has_toc_reloc
10922
              || sym_sec->makes_toc_func_call)
10923
            {
10924
              ret = 1;
10925
              break;
10926
            }
10927
 
10928
          /* Assume any branch that needs a long branch stub might in fact
10929
             need a plt_branch stub.  A plt_branch stub uses r2.  */
10930
          else if (dest - (isec->output_offset
10931
                           + isec->output_section->vma
10932
                           + rel->r_offset) + (1 << 25) >= (2 << 25))
10933
            {
10934
              ret = 1;
10935
              break;
10936
            }
10937
 
10938
          /* If calling back to a section in the process of being
10939
             tested, we can't say for sure that no toc adjusting stubs
10940
             are needed, so don't return zero.  */
10941
          else if (sym_sec->call_check_in_progress)
10942
            ret = 2;
10943
 
10944
          /* Branches to another section that itself doesn't have any TOC
10945
             references are OK.  Recursively call ourselves to check.  */
10946
          else if (!sym_sec->call_check_done)
10947
            {
10948
              int recur;
10949
 
10950
              /* Mark current section as indeterminate, so that other
10951
                 sections that call back to current won't be marked as
10952
                 known.  */
10953
              isec->call_check_in_progress = 1;
10954
              recur = toc_adjusting_stub_needed (info, sym_sec);
10955
              isec->call_check_in_progress = 0;
10956
 
10957
              if (recur != 0)
10958
                {
10959
                  ret = recur;
10960
                  if (recur != 2)
10961
                    break;
10962
                }
10963
            }
10964
        }
10965
 
10966
      if (local_syms != NULL
10967
          && (elf_symtab_hdr (isec->owner).contents
10968
              != (unsigned char *) local_syms))
10969
        free (local_syms);
10970
      if (elf_section_data (isec)->relocs != relstart)
10971
        free (relstart);
10972
    }
10973
 
10974
  if ((ret & 1) == 0
10975
      && isec->map_head.s != NULL
10976
      && (strcmp (isec->output_section->name, ".init") == 0
10977
          || strcmp (isec->output_section->name, ".fini") == 0))
10978
    {
10979
      if (isec->map_head.s->has_toc_reloc
10980
          || isec->map_head.s->makes_toc_func_call)
10981
        ret = 1;
10982
      else if (!isec->map_head.s->call_check_done)
10983
        {
10984
          int recur;
10985
          isec->call_check_in_progress = 1;
10986
          recur = toc_adjusting_stub_needed (info, isec->map_head.s);
10987
          isec->call_check_in_progress = 0;
10988
          if (recur != 0)
10989
            ret = recur;
10990
        }
10991
    }
10992
 
10993
  if (ret == 1)
10994
    isec->makes_toc_func_call = 1;
10995
 
10996
  return ret;
10997
}
10998
 
10999
/* The linker repeatedly calls this function for each input section,
11000
   in the order that input sections are linked into output sections.
11001
   Build lists of input sections to determine groupings between which
11002
   we may insert linker stubs.  */
11003
 
11004
bfd_boolean
11005
ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
11006
{
11007
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
11008
 
11009
  if (htab == NULL)
11010
    return FALSE;
11011
 
11012
  if ((isec->output_section->flags & SEC_CODE) != 0
11013
      && isec->output_section->index <= htab->top_index)
11014
    {
11015
      asection **list = htab->input_list + isec->output_section->index;
11016
      /* Steal the link_sec pointer for our list.  */
11017
#define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
11018
      /* This happens to make the list in reverse order,
11019
         which is what we want.  */
11020
      PREV_SEC (isec) = *list;
11021
      *list = isec;
11022
    }
11023
 
11024
  if (htab->multi_toc_needed)
11025
    {
11026
      /* If a code section has a function that uses the TOC then we need
11027
         to use the right TOC (obviously).  Also, make sure that .opd gets
11028
         the correct TOC value for R_PPC64_TOC relocs that don't have or
11029
         can't find their function symbol (shouldn't ever happen now).
11030
         Also specially treat .fixup for the linux kernel.  .fixup
11031
         contains branches, but only back to the function that hit an
11032
         exception.  */
11033
      if (isec->has_toc_reloc
11034
          || (isec->flags & SEC_CODE) == 0
11035
          || strcmp (isec->name, ".fixup") == 0)
11036
        {
11037
          if (elf_gp (isec->owner) != 0)
11038
            htab->toc_curr = elf_gp (isec->owner);
11039
        }
11040
      else
11041
        {
11042
          if (!isec->call_check_done
11043
              && toc_adjusting_stub_needed (info, isec) < 0)
11044
            return FALSE;
11045
          /* If we make a local call from this section, ie. a branch
11046
             without a following nop, then we have no place to put a
11047
             toc restoring insn.  We must use the same toc group as
11048
             the callee.
11049
             Testing makes_toc_func_call actually tests for *any*
11050
             calls to functions that need a good toc pointer.  A more
11051
             precise test would be better, as this one will set
11052
             incorrect values for pasted .init/.fini fragments.
11053
             (Fixed later in check_pasted_section.)  */
11054
          if (isec->makes_toc_func_call
11055
              && elf_gp (isec->owner) != 0)
11056
            htab->toc_curr = elf_gp (isec->owner);
11057
        }
11058
    }
11059
 
11060
  /* Functions that don't use the TOC can belong in any TOC group.
11061
     Use the last TOC base.  */
11062
  htab->stub_group[isec->id].toc_off = htab->toc_curr;
11063
  return TRUE;
11064
}
11065
 
11066
/* Check that all .init and .fini sections use the same toc, if they
11067
   have toc relocs.  */
11068
 
11069
static bfd_boolean
11070
check_pasted_section (struct bfd_link_info *info, const char *name)
11071
{
11072
  asection *o = bfd_get_section_by_name (info->output_bfd, name);
11073
 
11074
  if (o != NULL)
11075
    {
11076
      struct ppc_link_hash_table *htab = ppc_hash_table (info);
11077
      bfd_vma toc_off = 0;
11078
      asection *i;
11079
 
11080
      for (i = o->map_head.s; i != NULL; i = i->map_head.s)
11081
        if (i->has_toc_reloc)
11082
          {
11083
            if (toc_off == 0)
11084
              toc_off = htab->stub_group[i->id].toc_off;
11085
            else if (toc_off != htab->stub_group[i->id].toc_off)
11086
              return FALSE;
11087
          }
11088
 
11089
      if (toc_off == 0)
11090
        for (i = o->map_head.s; i != NULL; i = i->map_head.s)
11091
          if (i->makes_toc_func_call)
11092
            {
11093
              toc_off = htab->stub_group[i->id].toc_off;
11094
              break;
11095
            }
11096
 
11097
      /* Make sure the whole pasted function uses the same toc offset.  */
11098
      if (toc_off != 0)
11099
        for (i = o->map_head.s; i != NULL; i = i->map_head.s)
11100
          htab->stub_group[i->id].toc_off = toc_off;
11101
    }
11102
  return TRUE;
11103
}
11104
 
11105
bfd_boolean
11106
ppc64_elf_check_init_fini (struct bfd_link_info *info)
11107
{
11108
  return (check_pasted_section (info, ".init")
11109
          & check_pasted_section (info, ".fini"));
11110
}
11111
 
11112
/* See whether we can group stub sections together.  Grouping stub
11113
   sections may result in fewer stubs.  More importantly, we need to
11114
   put all .init* and .fini* stubs at the beginning of the .init or
11115
   .fini output sections respectively, because glibc splits the
11116
   _init and _fini functions into multiple parts.  Putting a stub in
11117
   the middle of a function is not a good idea.  */
11118
 
11119
static void
11120
group_sections (struct ppc_link_hash_table *htab,
11121
                bfd_size_type stub_group_size,
11122
                bfd_boolean stubs_always_before_branch)
11123
{
11124
  asection **list;
11125
  bfd_size_type stub14_group_size;
11126
  bfd_boolean suppress_size_errors;
11127
 
11128
  suppress_size_errors = FALSE;
11129
  stub14_group_size = stub_group_size;
11130
  if (stub_group_size == 1)
11131
    {
11132
      /* Default values.  */
11133
      if (stubs_always_before_branch)
11134
        {
11135
          stub_group_size = 0x1e00000;
11136
          stub14_group_size = 0x7800;
11137
        }
11138
      else
11139
        {
11140
          stub_group_size = 0x1c00000;
11141
          stub14_group_size = 0x7000;
11142
        }
11143
      suppress_size_errors = TRUE;
11144
    }
11145
 
11146
  list = htab->input_list + htab->top_index;
11147
  do
11148
    {
11149
      asection *tail = *list;
11150
      while (tail != NULL)
11151
        {
11152
          asection *curr;
11153
          asection *prev;
11154
          bfd_size_type total;
11155
          bfd_boolean big_sec;
11156
          bfd_vma curr_toc;
11157
 
11158
          curr = tail;
11159
          total = tail->size;
11160
          big_sec = total > (ppc64_elf_section_data (tail) != NULL
11161
                             && ppc64_elf_section_data (tail)->has_14bit_branch
11162
                             ? stub14_group_size : stub_group_size);
11163
          if (big_sec && !suppress_size_errors)
11164
            (*_bfd_error_handler) (_("%B section %A exceeds stub group size"),
11165
                                     tail->owner, tail);
11166
          curr_toc = htab->stub_group[tail->id].toc_off;
11167
 
11168
          while ((prev = PREV_SEC (curr)) != NULL
11169
                 && ((total += curr->output_offset - prev->output_offset)
11170
                     < (ppc64_elf_section_data (prev) != NULL
11171
                        && ppc64_elf_section_data (prev)->has_14bit_branch
11172
                        ? stub14_group_size : stub_group_size))
11173
                 && htab->stub_group[prev->id].toc_off == curr_toc)
11174
            curr = prev;
11175
 
11176
          /* OK, the size from the start of CURR to the end is less
11177
             than stub_group_size and thus can be handled by one stub
11178
             section.  (or the tail section is itself larger than
11179
             stub_group_size, in which case we may be toast.)  We
11180
             should really be keeping track of the total size of stubs
11181
             added here, as stubs contribute to the final output
11182
             section size.  That's a little tricky, and this way will
11183
             only break if stubs added make the total size more than
11184
             2^25, ie. for the default stub_group_size, if stubs total
11185
             more than 2097152 bytes, or nearly 75000 plt call stubs.  */
11186
          do
11187
            {
11188
              prev = PREV_SEC (tail);
11189
              /* Set up this stub group.  */
11190
              htab->stub_group[tail->id].link_sec = curr;
11191
            }
11192
          while (tail != curr && (tail = prev) != NULL);
11193
 
11194
          /* But wait, there's more!  Input sections up to stub_group_size
11195
             bytes before the stub section can be handled by it too.
11196
             Don't do this if we have a really large section after the
11197
             stubs, as adding more stubs increases the chance that
11198
             branches may not reach into the stub section.  */
11199
          if (!stubs_always_before_branch && !big_sec)
11200
            {
11201
              total = 0;
11202
              while (prev != NULL
11203
                     && ((total += tail->output_offset - prev->output_offset)
11204
                         < (ppc64_elf_section_data (prev) != NULL
11205
                            && ppc64_elf_section_data (prev)->has_14bit_branch
11206
                            ? stub14_group_size : stub_group_size))
11207
                     && htab->stub_group[prev->id].toc_off == curr_toc)
11208
                {
11209
                  tail = prev;
11210
                  prev = PREV_SEC (tail);
11211
                  htab->stub_group[tail->id].link_sec = curr;
11212
                }
11213
            }
11214
          tail = prev;
11215
        }
11216
    }
11217
  while (list-- != htab->input_list);
11218
  free (htab->input_list);
11219
#undef PREV_SEC
11220
}
11221
 
11222 161 khays
static const unsigned char glink_eh_frame_cie[] =
11223
{
11224
  0, 0, 0, 16,                             /* length.  */
11225
  0, 0, 0, 0,                               /* id.  */
11226
  1,                                    /* CIE version.  */
11227
  'z', 'R', 0,                           /* Augmentation string.  */
11228
  4,                                    /* Code alignment.  */
11229
  0x78,                                 /* Data alignment.  */
11230
  65,                                   /* RA reg.  */
11231
  1,                                    /* Augmentation size.  */
11232
  DW_EH_PE_pcrel | DW_EH_PE_sdata4,     /* FDE encoding.  */
11233
  DW_CFA_def_cfa, 1, 0                   /* def_cfa: r1 offset 0.  */
11234
};
11235
 
11236
/* Stripping output sections is normally done before dynamic section
11237
   symbols have been allocated.  This function is called later, and
11238
   handles cases like htab->brlt which is mapped to its own output
11239
   section.  */
11240
 
11241
static void
11242
maybe_strip_output (struct bfd_link_info *info, asection *isec)
11243
{
11244
  if (isec->size == 0
11245
      && isec->output_section->size == 0
11246
      && !bfd_section_removed_from_list (info->output_bfd,
11247
                                         isec->output_section)
11248
      && elf_section_data (isec->output_section)->dynindx == 0)
11249
    {
11250
      isec->output_section->flags |= SEC_EXCLUDE;
11251
      bfd_section_list_remove (info->output_bfd, isec->output_section);
11252
      info->output_bfd->section_count--;
11253
    }
11254
}
11255
 
11256 14 khays
/* Determine and set the size of the stub section for a final link.
11257
 
11258
   The basic idea here is to examine all the relocations looking for
11259
   PC-relative calls to a target that is unreachable with a "bl"
11260
   instruction.  */
11261
 
11262
bfd_boolean
11263 161 khays
ppc64_elf_size_stubs (struct bfd_link_info *info, bfd_signed_vma group_size,
11264 166 khays
                      bfd_boolean plt_static_chain, int plt_thread_safe,
11265
                      int plt_stub_align)
11266 14 khays
{
11267
  bfd_size_type stub_group_size;
11268
  bfd_boolean stubs_always_before_branch;
11269
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
11270
 
11271
  if (htab == NULL)
11272
    return FALSE;
11273
 
11274 161 khays
  htab->plt_static_chain = plt_static_chain;
11275 166 khays
  htab->plt_stub_align = plt_stub_align;
11276
  if (plt_thread_safe == -1)
11277
    {
11278
      const char *const thread_starter[] =
11279
        {
11280
          "pthread_create",
11281
          /* libstdc++ */
11282
          "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE",
11283
          /* librt */
11284
          "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio",
11285
          "mq_notify", "create_timer",
11286
          /* libanl */
11287
          "getaddrinfo_a",
11288
          /* libgomp */
11289
          "GOMP_parallel_start",
11290
          "GOMP_parallel_loop_static_start",
11291
          "GOMP_parallel_loop_dynamic_start",
11292
          "GOMP_parallel_loop_guided_start",
11293
          "GOMP_parallel_loop_runtime_start",
11294
          "GOMP_parallel_sections_start",
11295
        };
11296
      unsigned i;
11297
 
11298
      for (i = 0; i < sizeof (thread_starter)/ sizeof (thread_starter[0]); i++)
11299
        {
11300
          struct elf_link_hash_entry *h;
11301
          h = elf_link_hash_lookup (&htab->elf, thread_starter[i],
11302
                                    FALSE, FALSE, TRUE);
11303
          plt_thread_safe = h != NULL && h->ref_regular;
11304
          if (plt_thread_safe)
11305
            break;
11306
        }
11307
    }
11308
  htab->plt_thread_safe = plt_thread_safe;
11309 14 khays
  stubs_always_before_branch = group_size < 0;
11310
  if (group_size < 0)
11311
    stub_group_size = -group_size;
11312
  else
11313
    stub_group_size = group_size;
11314
 
11315
  group_sections (htab, stub_group_size, stubs_always_before_branch);
11316
 
11317
  while (1)
11318
    {
11319
      bfd *input_bfd;
11320
      unsigned int bfd_indx;
11321
      asection *stub_sec;
11322
 
11323
      htab->stub_iteration += 1;
11324
 
11325
      for (input_bfd = info->input_bfds, bfd_indx = 0;
11326
           input_bfd != NULL;
11327
           input_bfd = input_bfd->link_next, bfd_indx++)
11328
        {
11329
          Elf_Internal_Shdr *symtab_hdr;
11330
          asection *section;
11331
          Elf_Internal_Sym *local_syms = NULL;
11332
 
11333
          if (!is_ppc64_elf (input_bfd))
11334
            continue;
11335
 
11336
          /* We'll need the symbol table in a second.  */
11337
          symtab_hdr = &elf_symtab_hdr (input_bfd);
11338
          if (symtab_hdr->sh_info == 0)
11339
            continue;
11340
 
11341
          /* Walk over each section attached to the input bfd.  */
11342
          for (section = input_bfd->sections;
11343
               section != NULL;
11344
               section = section->next)
11345
            {
11346
              Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
11347
 
11348
              /* If there aren't any relocs, then there's nothing more
11349
                 to do.  */
11350
              if ((section->flags & SEC_RELOC) == 0
11351
                  || (section->flags & SEC_ALLOC) == 0
11352
                  || (section->flags & SEC_LOAD) == 0
11353
                  || (section->flags & SEC_CODE) == 0
11354
                  || section->reloc_count == 0)
11355
                continue;
11356
 
11357
              /* If this section is a link-once section that will be
11358
                 discarded, then don't create any stubs.  */
11359
              if (section->output_section == NULL
11360
                  || section->output_section->owner != info->output_bfd)
11361
                continue;
11362
 
11363
              /* Get the relocs.  */
11364
              internal_relocs
11365
                = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
11366
                                             info->keep_memory);
11367
              if (internal_relocs == NULL)
11368
                goto error_ret_free_local;
11369
 
11370
              /* Now examine each relocation.  */
11371
              irela = internal_relocs;
11372
              irelaend = irela + section->reloc_count;
11373
              for (; irela < irelaend; irela++)
11374
                {
11375
                  enum elf_ppc64_reloc_type r_type;
11376
                  unsigned int r_indx;
11377
                  enum ppc_stub_type stub_type;
11378
                  struct ppc_stub_hash_entry *stub_entry;
11379
                  asection *sym_sec, *code_sec;
11380
                  bfd_vma sym_value, code_value;
11381
                  bfd_vma destination;
11382
                  bfd_boolean ok_dest;
11383
                  struct ppc_link_hash_entry *hash;
11384
                  struct ppc_link_hash_entry *fdh;
11385
                  struct elf_link_hash_entry *h;
11386
                  Elf_Internal_Sym *sym;
11387
                  char *stub_name;
11388
                  const asection *id_sec;
11389
                  struct _opd_sec_data *opd;
11390
                  struct plt_entry *plt_ent;
11391
 
11392
                  r_type = ELF64_R_TYPE (irela->r_info);
11393
                  r_indx = ELF64_R_SYM (irela->r_info);
11394
 
11395
                  if (r_type >= R_PPC64_max)
11396
                    {
11397
                      bfd_set_error (bfd_error_bad_value);
11398
                      goto error_ret_free_internal;
11399
                    }
11400
 
11401
                  /* Only look for stubs on branch instructions.  */
11402
                  if (r_type != R_PPC64_REL24
11403
                      && r_type != R_PPC64_REL14
11404
                      && r_type != R_PPC64_REL14_BRTAKEN
11405
                      && r_type != R_PPC64_REL14_BRNTAKEN)
11406
                    continue;
11407
 
11408
                  /* Now determine the call target, its name, value,
11409
                     section.  */
11410
                  if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
11411
                                  r_indx, input_bfd))
11412
                    goto error_ret_free_internal;
11413
                  hash = (struct ppc_link_hash_entry *) h;
11414
 
11415
                  ok_dest = FALSE;
11416
                  fdh = NULL;
11417
                  sym_value = 0;
11418
                  if (hash == NULL)
11419
                    {
11420
                      sym_value = sym->st_value;
11421
                      ok_dest = TRUE;
11422
                    }
11423
                  else if (hash->elf.root.type == bfd_link_hash_defined
11424
                           || hash->elf.root.type == bfd_link_hash_defweak)
11425
                    {
11426
                      sym_value = hash->elf.root.u.def.value;
11427
                      if (sym_sec->output_section != NULL)
11428
                        ok_dest = TRUE;
11429
                    }
11430
                  else if (hash->elf.root.type == bfd_link_hash_undefweak
11431
                           || hash->elf.root.type == bfd_link_hash_undefined)
11432
                    {
11433
                      /* Recognise an old ABI func code entry sym, and
11434
                         use the func descriptor sym instead if it is
11435
                         defined.  */
11436
                      if (hash->elf.root.root.string[0] == '.'
11437
                          && (fdh = lookup_fdh (hash, htab)) != NULL)
11438
                        {
11439
                          if (fdh->elf.root.type == bfd_link_hash_defined
11440
                              || fdh->elf.root.type == bfd_link_hash_defweak)
11441
                            {
11442
                              sym_sec = fdh->elf.root.u.def.section;
11443
                              sym_value = fdh->elf.root.u.def.value;
11444
                              if (sym_sec->output_section != NULL)
11445
                                ok_dest = TRUE;
11446
                            }
11447
                          else
11448
                            fdh = NULL;
11449
                        }
11450
                    }
11451
                  else
11452
                    {
11453
                      bfd_set_error (bfd_error_bad_value);
11454
                      goto error_ret_free_internal;
11455
                    }
11456
 
11457
                  destination = 0;
11458
                  if (ok_dest)
11459
                    {
11460
                      sym_value += irela->r_addend;
11461
                      destination = (sym_value
11462
                                     + sym_sec->output_offset
11463
                                     + sym_sec->output_section->vma);
11464
                    }
11465
 
11466
                  code_sec = sym_sec;
11467
                  code_value = sym_value;
11468
                  opd = get_opd_info (sym_sec);
11469
                  if (opd != NULL)
11470
                    {
11471
                      bfd_vma dest;
11472
 
11473
                      if (hash == NULL && opd->adjust != NULL)
11474
                        {
11475
                          long adjust = opd->adjust[sym_value / 8];
11476
                          if (adjust == -1)
11477
                            continue;
11478
                          code_value += adjust;
11479
                          sym_value += adjust;
11480
                        }
11481
                      dest = opd_entry_value (sym_sec, sym_value,
11482
                                              &code_sec, &code_value);
11483
                      if (dest != (bfd_vma) -1)
11484
                        {
11485
                          destination = dest;
11486
                          if (fdh != NULL)
11487
                            {
11488
                              /* Fixup old ABI sym to point at code
11489
                                 entry.  */
11490
                              hash->elf.root.type = bfd_link_hash_defweak;
11491
                              hash->elf.root.u.def.section = code_sec;
11492
                              hash->elf.root.u.def.value = code_value;
11493
                            }
11494
                        }
11495
                    }
11496
 
11497
                  /* Determine what (if any) linker stub is needed.  */
11498
                  plt_ent = NULL;
11499
                  stub_type = ppc_type_of_stub (section, irela, &hash,
11500
                                                &plt_ent, destination);
11501
 
11502
                  if (stub_type != ppc_stub_plt_call)
11503
                    {
11504
                      /* Check whether we need a TOC adjusting stub.
11505
                         Since the linker pastes together pieces from
11506
                         different object files when creating the
11507
                         _init and _fini functions, it may be that a
11508
                         call to what looks like a local sym is in
11509
                         fact a call needing a TOC adjustment.  */
11510
                      if (code_sec != NULL
11511
                          && code_sec->output_section != NULL
11512
                          && (htab->stub_group[code_sec->id].toc_off
11513
                              != htab->stub_group[section->id].toc_off)
11514
                          && (code_sec->has_toc_reloc
11515
                              || code_sec->makes_toc_func_call))
11516
                        stub_type = ppc_stub_long_branch_r2off;
11517
                    }
11518
 
11519
                  if (stub_type == ppc_stub_none)
11520
                    continue;
11521
 
11522
                  /* __tls_get_addr calls might be eliminated.  */
11523
                  if (stub_type != ppc_stub_plt_call
11524
                      && hash != NULL
11525
                      && (hash == htab->tls_get_addr
11526
                          || hash == htab->tls_get_addr_fd)
11527
                      && section->has_tls_reloc
11528
                      && irela != internal_relocs)
11529
                    {
11530
                      /* Get tls info.  */
11531
                      unsigned char *tls_mask;
11532
 
11533
                      if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
11534
                                         irela - 1, input_bfd))
11535
                        goto error_ret_free_internal;
11536
                      if (*tls_mask != 0)
11537
                        continue;
11538
                    }
11539
 
11540 163 khays
                  if (stub_type == ppc_stub_plt_call
11541
                      && irela + 1 < irelaend
11542
                      && irela[1].r_offset == irela->r_offset + 4
11543 166 khays
                      && ELF64_R_TYPE (irela[1].r_info) == R_PPC64_TOCSAVE)
11544
                    {
11545
                      if (!tocsave_find (htab, INSERT,
11546
                                         &local_syms, irela + 1, input_bfd))
11547
                        goto error_ret_free_internal;
11548
                    }
11549
                  else if (stub_type == ppc_stub_plt_call)
11550
                    stub_type = ppc_stub_plt_call_r2save;
11551 163 khays
 
11552 14 khays
                  /* Support for grouping stub sections.  */
11553
                  id_sec = htab->stub_group[section->id].link_sec;
11554
 
11555
                  /* Get the name of this stub.  */
11556
                  stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
11557
                  if (!stub_name)
11558
                    goto error_ret_free_internal;
11559
 
11560
                  stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
11561
                                                     stub_name, FALSE, FALSE);
11562
                  if (stub_entry != NULL)
11563
                    {
11564
                      /* The proper stub has already been created.  */
11565
                      free (stub_name);
11566 166 khays
                      if (stub_type == ppc_stub_plt_call_r2save)
11567
                        stub_entry->stub_type = stub_type;
11568 14 khays
                      continue;
11569
                    }
11570
 
11571
                  stub_entry = ppc_add_stub (stub_name, section, info);
11572
                  if (stub_entry == NULL)
11573
                    {
11574
                      free (stub_name);
11575
                    error_ret_free_internal:
11576
                      if (elf_section_data (section)->relocs == NULL)
11577
                        free (internal_relocs);
11578
                    error_ret_free_local:
11579
                      if (local_syms != NULL
11580
                          && (symtab_hdr->contents
11581
                              != (unsigned char *) local_syms))
11582
                        free (local_syms);
11583
                      return FALSE;
11584
                    }
11585
 
11586
                  stub_entry->stub_type = stub_type;
11587 166 khays
                  if (stub_type != ppc_stub_plt_call
11588
                      && stub_type != ppc_stub_plt_call_r2save)
11589 14 khays
                    {
11590
                      stub_entry->target_value = code_value;
11591
                      stub_entry->target_section = code_sec;
11592
                    }
11593
                  else
11594
                    {
11595
                      stub_entry->target_value = sym_value;
11596
                      stub_entry->target_section = sym_sec;
11597
                    }
11598
                  stub_entry->h = hash;
11599
                  stub_entry->plt_ent = plt_ent;
11600
                  stub_entry->addend = irela->r_addend;
11601
 
11602
                  if (stub_entry->h != NULL)
11603
                    htab->stub_globals += 1;
11604
                }
11605
 
11606
              /* We're done with the internal relocs, free them.  */
11607
              if (elf_section_data (section)->relocs != internal_relocs)
11608
                free (internal_relocs);
11609
            }
11610
 
11611
          if (local_syms != NULL
11612
              && symtab_hdr->contents != (unsigned char *) local_syms)
11613
            {
11614
              if (!info->keep_memory)
11615
                free (local_syms);
11616
              else
11617
                symtab_hdr->contents = (unsigned char *) local_syms;
11618
            }
11619
        }
11620
 
11621
      /* We may have added some stubs.  Find out the new size of the
11622
         stub sections.  */
11623
      for (stub_sec = htab->stub_bfd->sections;
11624
           stub_sec != NULL;
11625
           stub_sec = stub_sec->next)
11626
        if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
11627
          {
11628
            stub_sec->rawsize = stub_sec->size;
11629
            stub_sec->size = 0;
11630
            stub_sec->reloc_count = 0;
11631
            stub_sec->flags &= ~SEC_RELOC;
11632
          }
11633
 
11634
      htab->brlt->size = 0;
11635
      htab->brlt->reloc_count = 0;
11636
      htab->brlt->flags &= ~SEC_RELOC;
11637
      if (htab->relbrlt != NULL)
11638
        htab->relbrlt->size = 0;
11639
 
11640
      bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
11641
 
11642
      if (info->emitrelocations
11643
          && htab->glink != NULL && htab->glink->size != 0)
11644
        {
11645
          htab->glink->reloc_count = 1;
11646
          htab->glink->flags |= SEC_RELOC;
11647
        }
11648
 
11649 161 khays
      if (htab->glink_eh_frame != NULL
11650
          && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
11651
          && (htab->glink_eh_frame->flags & SEC_EXCLUDE) == 0)
11652
        {
11653
          bfd_size_type size = 0;
11654
 
11655
          for (stub_sec = htab->stub_bfd->sections;
11656
               stub_sec != NULL;
11657
               stub_sec = stub_sec->next)
11658
            if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
11659
              size += 20;
11660
          if (htab->glink != NULL && htab->glink->size != 0)
11661
            size += 24;
11662
          if (size != 0)
11663
            size += sizeof (glink_eh_frame_cie);
11664
          htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
11665
          htab->glink_eh_frame->size = size;
11666
        }
11667
 
11668 166 khays
      if (htab->plt_stub_align != 0)
11669
        for (stub_sec = htab->stub_bfd->sections;
11670
             stub_sec != NULL;
11671
             stub_sec = stub_sec->next)
11672
          if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
11673
            stub_sec->size = ((stub_sec->size + (1 << htab->plt_stub_align) - 1)
11674
                              & (-1 << htab->plt_stub_align));
11675
 
11676 14 khays
      for (stub_sec = htab->stub_bfd->sections;
11677
           stub_sec != NULL;
11678
           stub_sec = stub_sec->next)
11679
        if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
11680
            && stub_sec->rawsize != stub_sec->size)
11681
          break;
11682
 
11683
      /* Exit from this loop when no stubs have been added, and no stubs
11684
         have changed size.  */
11685 161 khays
      if (stub_sec == NULL
11686
          && (htab->glink_eh_frame == NULL
11687
              || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size))
11688 14 khays
        break;
11689
 
11690
      /* Ask the linker to do its stuff.  */
11691
      (*htab->layout_sections_again) ();
11692
    }
11693
 
11694 161 khays
  maybe_strip_output (info, htab->brlt);
11695
  if (htab->glink_eh_frame != NULL)
11696
    maybe_strip_output (info, htab->glink_eh_frame);
11697 14 khays
 
11698
  return TRUE;
11699
}
11700
 
11701
/* Called after we have determined section placement.  If sections
11702
   move, we'll be called again.  Provide a value for TOCstart.  */
11703
 
11704
bfd_vma
11705
ppc64_elf_toc (bfd *obfd)
11706
{
11707
  asection *s;
11708
  bfd_vma TOCstart;
11709
 
11710
  /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
11711
     order.  The TOC starts where the first of these sections starts.  */
11712
  s = bfd_get_section_by_name (obfd, ".got");
11713
  if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
11714
    s = bfd_get_section_by_name (obfd, ".toc");
11715
  if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
11716
    s = bfd_get_section_by_name (obfd, ".tocbss");
11717
  if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
11718
    s = bfd_get_section_by_name (obfd, ".plt");
11719
  if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
11720
    {
11721
      /* This may happen for
11722
         o  references to TOC base (SYM@toc / TOC[tc0]) without a
11723
         .toc directive
11724
         o  bad linker script
11725
         o --gc-sections and empty TOC sections
11726
 
11727
         FIXME: Warn user?  */
11728
 
11729
      /* Look for a likely section.  We probably won't even be
11730
         using TOCstart.  */
11731
      for (s = obfd->sections; s != NULL; s = s->next)
11732
        if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
11733
                         | SEC_EXCLUDE))
11734
            == (SEC_ALLOC | SEC_SMALL_DATA))
11735
          break;
11736
      if (s == NULL)
11737
        for (s = obfd->sections; s != NULL; s = s->next)
11738
          if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
11739
              == (SEC_ALLOC | SEC_SMALL_DATA))
11740
            break;
11741
      if (s == NULL)
11742
        for (s = obfd->sections; s != NULL; s = s->next)
11743
          if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
11744
              == SEC_ALLOC)
11745
            break;
11746
      if (s == NULL)
11747
        for (s = obfd->sections; s != NULL; s = s->next)
11748
          if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
11749
            break;
11750
    }
11751
 
11752
  TOCstart = 0;
11753
  if (s != NULL)
11754
    TOCstart = s->output_section->vma + s->output_offset;
11755
 
11756
  return TOCstart;
11757
}
11758
 
11759
/* Build all the stubs associated with the current output file.
11760
   The stubs are kept in a hash table attached to the main linker
11761
   hash table.  This function is called via gldelf64ppc_finish.  */
11762
 
11763
bfd_boolean
11764
ppc64_elf_build_stubs (bfd_boolean emit_stub_syms,
11765
                       struct bfd_link_info *info,
11766
                       char **stats)
11767
{
11768
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
11769
  asection *stub_sec;
11770
  bfd_byte *p;
11771
  int stub_sec_count = 0;
11772
 
11773
  if (htab == NULL)
11774
    return FALSE;
11775
 
11776
  htab->emit_stub_syms = emit_stub_syms;
11777
 
11778
  /* Allocate memory to hold the linker stubs.  */
11779
  for (stub_sec = htab->stub_bfd->sections;
11780
       stub_sec != NULL;
11781
       stub_sec = stub_sec->next)
11782
    if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
11783
        && stub_sec->size != 0)
11784
      {
11785
        stub_sec->contents = bfd_zalloc (htab->stub_bfd, stub_sec->size);
11786
        if (stub_sec->contents == NULL)
11787
          return FALSE;
11788
        /* We want to check that built size is the same as calculated
11789
           size.  rawsize is a convenient location to use.  */
11790
        stub_sec->rawsize = stub_sec->size;
11791
        stub_sec->size = 0;
11792
      }
11793
 
11794
  if (htab->glink != NULL && htab->glink->size != 0)
11795
    {
11796
      unsigned int indx;
11797
      bfd_vma plt0;
11798
 
11799
      /* Build the .glink plt call stub.  */
11800
      if (htab->emit_stub_syms)
11801
        {
11802
          struct elf_link_hash_entry *h;
11803
          h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
11804
                                    TRUE, FALSE, FALSE);
11805
          if (h == NULL)
11806
            return FALSE;
11807
          if (h->root.type == bfd_link_hash_new)
11808
            {
11809
              h->root.type = bfd_link_hash_defined;
11810
              h->root.u.def.section = htab->glink;
11811
              h->root.u.def.value = 8;
11812
              h->ref_regular = 1;
11813
              h->def_regular = 1;
11814
              h->ref_regular_nonweak = 1;
11815
              h->forced_local = 1;
11816
              h->non_elf = 0;
11817
            }
11818
        }
11819
      plt0 = htab->plt->output_section->vma + htab->plt->output_offset - 16;
11820
      if (info->emitrelocations)
11821
        {
11822
          Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
11823
          if (r == NULL)
11824
            return FALSE;
11825
          r->r_offset = (htab->glink->output_offset
11826
                         + htab->glink->output_section->vma);
11827
          r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
11828
          r->r_addend = plt0;
11829
        }
11830
      p = htab->glink->contents;
11831
      plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
11832
      bfd_put_64 (htab->glink->owner, plt0, p);
11833
      p += 8;
11834
      bfd_put_32 (htab->glink->owner, MFLR_R12, p);
11835
      p += 4;
11836
      bfd_put_32 (htab->glink->owner, BCL_20_31, p);
11837
      p += 4;
11838
      bfd_put_32 (htab->glink->owner, MFLR_R11, p);
11839
      p += 4;
11840
      bfd_put_32 (htab->glink->owner, LD_R2_M16R11, p);
11841
      p += 4;
11842
      bfd_put_32 (htab->glink->owner, MTLR_R12, p);
11843
      p += 4;
11844
      bfd_put_32 (htab->glink->owner, ADD_R12_R2_R11, p);
11845
      p += 4;
11846
      bfd_put_32 (htab->glink->owner, LD_R11_0R12, p);
11847
      p += 4;
11848
      bfd_put_32 (htab->glink->owner, LD_R2_0R12 | 8, p);
11849
      p += 4;
11850
      bfd_put_32 (htab->glink->owner, MTCTR_R11, p);
11851
      p += 4;
11852
      bfd_put_32 (htab->glink->owner, LD_R11_0R12 | 16, p);
11853
      p += 4;
11854
      bfd_put_32 (htab->glink->owner, BCTR, p);
11855
      p += 4;
11856
      while (p - htab->glink->contents < GLINK_CALL_STUB_SIZE)
11857
        {
11858
          bfd_put_32 (htab->glink->owner, NOP, p);
11859
          p += 4;
11860
        }
11861
 
11862
      /* Build the .glink lazy link call stubs.  */
11863
      indx = 0;
11864
      while (p < htab->glink->contents + htab->glink->size)
11865
        {
11866
          if (indx < 0x8000)
11867
            {
11868
              bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
11869
              p += 4;
11870
            }
11871
          else
11872
            {
11873
              bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
11874
              p += 4;
11875
              bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx), p);
11876
              p += 4;
11877
            }
11878
          bfd_put_32 (htab->glink->owner,
11879
                      B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
11880
          indx++;
11881
          p += 4;
11882
        }
11883
      htab->glink->rawsize = p - htab->glink->contents;
11884
    }
11885
 
11886
  if (htab->brlt->size != 0)
11887
    {
11888
      htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
11889
                                         htab->brlt->size);
11890
      if (htab->brlt->contents == NULL)
11891
        return FALSE;
11892
    }
11893
  if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
11894
    {
11895
      htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
11896
                                            htab->relbrlt->size);
11897
      if (htab->relbrlt->contents == NULL)
11898
        return FALSE;
11899
    }
11900
 
11901 161 khays
  if (htab->glink_eh_frame != NULL
11902
      && htab->glink_eh_frame->size != 0)
11903
    {
11904
      bfd_vma val;
11905
 
11906
      p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size);
11907
      if (p == NULL)
11908
        return FALSE;
11909
      htab->glink_eh_frame->contents = p;
11910
 
11911
      htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
11912
 
11913
      memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
11914
      /* CIE length (rewrite in case little-endian).  */
11915
      bfd_put_32 (htab->elf.dynobj, sizeof (glink_eh_frame_cie) - 4, p);
11916
      p += sizeof (glink_eh_frame_cie);
11917
 
11918
      for (stub_sec = htab->stub_bfd->sections;
11919
           stub_sec != NULL;
11920
           stub_sec = stub_sec->next)
11921
        if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
11922
          {
11923
            /* FDE length.  */
11924
            bfd_put_32 (htab->elf.dynobj, 16, p);
11925
            p += 4;
11926
            /* CIE pointer.  */
11927
            val = p - htab->glink_eh_frame->contents;
11928
            bfd_put_32 (htab->elf.dynobj, val, p);
11929
            p += 4;
11930
            /* Offset to stub section.  */
11931
            val = (stub_sec->output_section->vma
11932
                   + stub_sec->output_offset);
11933
            val -= (htab->glink_eh_frame->output_section->vma
11934
                    + htab->glink_eh_frame->output_offset);
11935
            val -= p - htab->glink_eh_frame->contents;
11936
            if (val + 0x80000000 > 0xffffffff)
11937
              {
11938
                info->callbacks->einfo
11939
                  (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
11940
                   stub_sec->name);
11941
                return FALSE;
11942
              }
11943
            bfd_put_32 (htab->elf.dynobj, val, p);
11944
            p += 4;
11945
            /* stub section size.  */
11946
            bfd_put_32 (htab->elf.dynobj, stub_sec->rawsize, p);
11947
            p += 4;
11948
            /* Augmentation.  */
11949
            p += 1;
11950
            /* Pad.  */
11951
            p += 3;
11952
          }
11953
      if (htab->glink != NULL && htab->glink->size != 0)
11954
        {
11955
          /* FDE length.  */
11956
          bfd_put_32 (htab->elf.dynobj, 20, p);
11957
          p += 4;
11958
          /* CIE pointer.  */
11959
          val = p - htab->glink_eh_frame->contents;
11960
          bfd_put_32 (htab->elf.dynobj, val, p);
11961
          p += 4;
11962
          /* Offset to .glink.  */
11963
          val = (htab->glink->output_section->vma
11964
                 + htab->glink->output_offset
11965
                 + 8);
11966
          val -= (htab->glink_eh_frame->output_section->vma
11967
                  + htab->glink_eh_frame->output_offset);
11968
          val -= p - htab->glink_eh_frame->contents;
11969
          if (val + 0x80000000 > 0xffffffff)
11970
            {
11971
              info->callbacks->einfo
11972
                (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
11973
                 htab->glink->name);
11974
              return FALSE;
11975
            }
11976
          bfd_put_32 (htab->elf.dynobj, val, p);
11977
          p += 4;
11978
          /* .glink size.  */
11979
          bfd_put_32 (htab->elf.dynobj, htab->glink->rawsize - 8, p);
11980
          p += 4;
11981
          /* Augmentation.  */
11982
          p += 1;
11983
 
11984
          *p++ = DW_CFA_advance_loc + 1;
11985
          *p++ = DW_CFA_register;
11986
          *p++ = 65;
11987
          *p++ = 12;
11988
          *p++ = DW_CFA_advance_loc + 4;
11989
          *p++ = DW_CFA_restore_extended;
11990
          *p++ = 65;
11991
        }
11992
      htab->glink_eh_frame->size = p - htab->glink_eh_frame->contents;
11993
    }
11994
 
11995 14 khays
  /* Build the stubs as directed by the stub hash table.  */
11996
  bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
11997
 
11998
  if (htab->relbrlt != NULL)
11999
    htab->relbrlt->reloc_count = 0;
12000
 
12001 166 khays
  if (htab->plt_stub_align != 0)
12002
    for (stub_sec = htab->stub_bfd->sections;
12003
         stub_sec != NULL;
12004
         stub_sec = stub_sec->next)
12005
      if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12006
        stub_sec->size = ((stub_sec->size + (1 << htab->plt_stub_align) - 1)
12007
                          & (-1 << htab->plt_stub_align));
12008
 
12009 14 khays
  for (stub_sec = htab->stub_bfd->sections;
12010
       stub_sec != NULL;
12011
       stub_sec = stub_sec->next)
12012
    if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12013
      {
12014
        stub_sec_count += 1;
12015
        if (stub_sec->rawsize != stub_sec->size)
12016
          break;
12017
      }
12018
 
12019
  if (stub_sec != NULL
12020 161 khays
      || htab->glink->rawsize != htab->glink->size
12021
      || (htab->glink_eh_frame != NULL
12022
          && htab->glink_eh_frame->rawsize != htab->glink_eh_frame->size))
12023 14 khays
    {
12024
      htab->stub_error = TRUE;
12025 161 khays
      info->callbacks->einfo (_("%P: stubs don't match calculated size\n"));
12026 14 khays
    }
12027
 
12028
  if (htab->stub_error)
12029
    return FALSE;
12030
 
12031
  if (stats != NULL)
12032
    {
12033
      *stats = bfd_malloc (500);
12034
      if (*stats == NULL)
12035
        return FALSE;
12036
 
12037
      sprintf (*stats, _("linker stubs in %u group%s\n"
12038
                         "  branch       %lu\n"
12039
                         "  toc adjust   %lu\n"
12040
                         "  long branch  %lu\n"
12041
                         "  long toc adj %lu\n"
12042 166 khays
                         "  plt call     %lu\n"
12043
                         "  plt call toc %lu"),
12044 14 khays
               stub_sec_count,
12045
               stub_sec_count == 1 ? "" : "s",
12046
               htab->stub_count[ppc_stub_long_branch - 1],
12047
               htab->stub_count[ppc_stub_long_branch_r2off - 1],
12048
               htab->stub_count[ppc_stub_plt_branch - 1],
12049
               htab->stub_count[ppc_stub_plt_branch_r2off - 1],
12050 166 khays
               htab->stub_count[ppc_stub_plt_call - 1],
12051
               htab->stub_count[ppc_stub_plt_call_r2save - 1]);
12052 14 khays
    }
12053
  return TRUE;
12054
}
12055
 
12056
/* This function undoes the changes made by add_symbol_adjust.  */
12057
 
12058
static bfd_boolean
12059
undo_symbol_twiddle (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
12060
{
12061
  struct ppc_link_hash_entry *eh;
12062
 
12063
  if (h->root.type == bfd_link_hash_indirect)
12064
    return TRUE;
12065
 
12066
  eh = (struct ppc_link_hash_entry *) h;
12067
  if (eh->elf.root.type != bfd_link_hash_undefweak || !eh->was_undefined)
12068
    return TRUE;
12069
 
12070
  eh->elf.root.type = bfd_link_hash_undefined;
12071
  return TRUE;
12072
}
12073
 
12074
void
12075
ppc64_elf_restore_symbols (struct bfd_link_info *info)
12076
{
12077
  struct ppc_link_hash_table *htab = ppc_hash_table (info);
12078
 
12079
  if (htab != NULL)
12080
    elf_link_hash_traverse (&htab->elf, undo_symbol_twiddle, info);
12081
}
12082
 
12083
/* What to do when ld finds relocations against symbols defined in
12084
   discarded sections.  */
12085
 
12086
static unsigned int
12087
ppc64_elf_action_discarded (asection *sec)
12088
{
12089
  if (strcmp (".opd", sec->name) == 0)
12090
    return 0;
12091
 
12092
  if (strcmp (".toc", sec->name) == 0)
12093
    return 0;
12094
 
12095
  if (strcmp (".toc1", sec->name) == 0)
12096
    return 0;
12097
 
12098
  return _bfd_elf_default_action_discarded (sec);
12099
}
12100
 
12101
/* The RELOCATE_SECTION function is called by the ELF backend linker
12102
   to handle the relocations for a section.
12103
 
12104
   The relocs are always passed as Rela structures; if the section
12105
   actually uses Rel structures, the r_addend field will always be
12106
   zero.
12107
 
12108
   This function is responsible for adjust the section contents as
12109
   necessary, and (if using Rela relocs and generating a
12110
   relocatable output file) adjusting the reloc addend as
12111
   necessary.
12112
 
12113
   This function does not have to worry about setting the reloc
12114
   address or the reloc symbol index.
12115
 
12116
   LOCAL_SYMS is a pointer to the swapped in local symbols.
12117
 
12118
   LOCAL_SECTIONS is an array giving the section in the input file
12119
   corresponding to the st_shndx field of each local symbol.
12120
 
12121
   The global hash table entry for the global symbols can be found
12122
   via elf_sym_hashes (input_bfd).
12123
 
12124
   When generating relocatable output, this function must handle
12125
   STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
12126
   going to be the section symbol corresponding to the output
12127
   section, which means that the addend must be adjusted
12128
   accordingly.  */
12129
 
12130
static bfd_boolean
12131
ppc64_elf_relocate_section (bfd *output_bfd,
12132
                            struct bfd_link_info *info,
12133
                            bfd *input_bfd,
12134
                            asection *input_section,
12135
                            bfd_byte *contents,
12136
                            Elf_Internal_Rela *relocs,
12137
                            Elf_Internal_Sym *local_syms,
12138
                            asection **local_sections)
12139
{
12140
  struct ppc_link_hash_table *htab;
12141
  Elf_Internal_Shdr *symtab_hdr;
12142
  struct elf_link_hash_entry **sym_hashes;
12143
  Elf_Internal_Rela *rel;
12144
  Elf_Internal_Rela *relend;
12145
  Elf_Internal_Rela outrel;
12146
  bfd_byte *loc;
12147
  struct got_entry **local_got_ents;
12148
  bfd_vma TOCstart;
12149
  bfd_boolean ret = TRUE;
12150
  bfd_boolean is_opd;
12151 166 khays
  /* Assume 'at' branch hints.  */
12152
  bfd_boolean is_isa_v2 = TRUE;
12153 14 khays
  bfd_vma d_offset = (bfd_big_endian (output_bfd) ? 2 : 0);
12154
 
12155
  /* Initialize howto table if needed.  */
12156
  if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
12157
    ppc_howto_init ();
12158
 
12159
  htab = ppc_hash_table (info);
12160
  if (htab == NULL)
12161
    return FALSE;
12162
 
12163
  /* Don't relocate stub sections.  */
12164
  if (input_section->owner == htab->stub_bfd)
12165
    return TRUE;
12166
 
12167
  BFD_ASSERT (is_ppc64_elf (input_bfd));
12168
 
12169
  local_got_ents = elf_local_got_ents (input_bfd);
12170
  TOCstart = elf_gp (output_bfd);
12171
  symtab_hdr = &elf_symtab_hdr (input_bfd);
12172
  sym_hashes = elf_sym_hashes (input_bfd);
12173
  is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
12174
 
12175
  rel = relocs;
12176
  relend = relocs + input_section->reloc_count;
12177
  for (; rel < relend; rel++)
12178
    {
12179
      enum elf_ppc64_reloc_type r_type;
12180
      bfd_vma addend, orig_addend;
12181
      bfd_reloc_status_type r;
12182
      Elf_Internal_Sym *sym;
12183
      asection *sec;
12184
      struct elf_link_hash_entry *h_elf;
12185
      struct ppc_link_hash_entry *h;
12186
      struct ppc_link_hash_entry *fdh;
12187
      const char *sym_name;
12188
      unsigned long r_symndx, toc_symndx;
12189
      bfd_vma toc_addend;
12190
      unsigned char tls_mask, tls_gd, tls_type;
12191
      unsigned char sym_type;
12192
      bfd_vma relocation;
12193
      bfd_boolean unresolved_reloc;
12194
      bfd_boolean warned;
12195
      unsigned int insn;
12196
      unsigned int mask;
12197
      struct ppc_stub_hash_entry *stub_entry;
12198
      bfd_vma max_br_offset;
12199
      bfd_vma from;
12200
 
12201
      r_type = ELF64_R_TYPE (rel->r_info);
12202
      r_symndx = ELF64_R_SYM (rel->r_info);
12203
 
12204
      /* For old style R_PPC64_TOC relocs with a zero symbol, use the
12205
         symbol of the previous ADDR64 reloc.  The symbol gives us the
12206
         proper TOC base to use.  */
12207
      if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
12208
          && rel != relocs
12209
          && ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_ADDR64
12210
          && is_opd)
12211
        r_symndx = ELF64_R_SYM (rel[-1].r_info);
12212
 
12213
      sym = NULL;
12214
      sec = NULL;
12215
      h_elf = NULL;
12216
      sym_name = NULL;
12217
      unresolved_reloc = FALSE;
12218
      warned = FALSE;
12219
      orig_addend = rel->r_addend;
12220
 
12221
      if (r_symndx < symtab_hdr->sh_info)
12222
        {
12223
          /* It's a local symbol.  */
12224
          struct _opd_sec_data *opd;
12225
 
12226
          sym = local_syms + r_symndx;
12227
          sec = local_sections[r_symndx];
12228
          sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
12229
          sym_type = ELF64_ST_TYPE (sym->st_info);
12230
          relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
12231
          opd = get_opd_info (sec);
12232
          if (opd != NULL && opd->adjust != NULL)
12233
            {
12234
              long adjust = opd->adjust[(sym->st_value + rel->r_addend) / 8];
12235
              if (adjust == -1)
12236
                relocation = 0;
12237
              else
12238
                {
12239
                  /* If this is a relocation against the opd section sym
12240
                     and we have edited .opd, adjust the reloc addend so
12241
                     that ld -r and ld --emit-relocs output is correct.
12242
                     If it is a reloc against some other .opd symbol,
12243
                     then the symbol value will be adjusted later.  */
12244
                  if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
12245
                    rel->r_addend += adjust;
12246
                  else
12247
                    relocation += adjust;
12248
                }
12249
            }
12250
        }
12251
      else
12252
        {
12253
          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
12254
                                   r_symndx, symtab_hdr, sym_hashes,
12255
                                   h_elf, sec, relocation,
12256
                                   unresolved_reloc, warned);
12257
          sym_name = h_elf->root.root.string;
12258
          sym_type = h_elf->type;
12259
        }
12260
      h = (struct ppc_link_hash_entry *) h_elf;
12261
 
12262
      if (sec != NULL && elf_discarded_section (sec))
12263
        RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
12264
                                         rel, relend,
12265
                                         ppc64_elf_howto_table[r_type],
12266
                                         contents);
12267
 
12268
      if (info->relocatable)
12269
        continue;
12270
 
12271
      /* TLS optimizations.  Replace instruction sequences and relocs
12272
         based on information we collected in tls_optimize.  We edit
12273
         RELOCS so that --emit-relocs will output something sensible
12274
         for the final instruction stream.  */
12275
      tls_mask = 0;
12276
      tls_gd = 0;
12277
      toc_symndx = 0;
12278
      if (h != NULL)
12279
        tls_mask = h->tls_mask;
12280
      else if (local_got_ents != NULL)
12281
        {
12282
          struct plt_entry **local_plt = (struct plt_entry **)
12283
            (local_got_ents + symtab_hdr->sh_info);
12284
          unsigned char *lgot_masks = (unsigned char *)
12285
            (local_plt + symtab_hdr->sh_info);
12286
          tls_mask = lgot_masks[r_symndx];
12287
        }
12288
      if (tls_mask == 0
12289
          && (r_type == R_PPC64_TLS
12290
              || r_type == R_PPC64_TLSGD
12291
              || r_type == R_PPC64_TLSLD))
12292
        {
12293
          /* Check for toc tls entries.  */
12294
          unsigned char *toc_tls;
12295
 
12296
          if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
12297
                             &local_syms, rel, input_bfd))
12298
            return FALSE;
12299
 
12300
          if (toc_tls)
12301
            tls_mask = *toc_tls;
12302
        }
12303
 
12304
      /* Check that tls relocs are used with tls syms, and non-tls
12305
         relocs are used with non-tls syms.  */
12306
      if (r_symndx != STN_UNDEF
12307
          && r_type != R_PPC64_NONE
12308
          && (h == NULL
12309
              || h->elf.root.type == bfd_link_hash_defined
12310
              || h->elf.root.type == bfd_link_hash_defweak)
12311
          && (IS_PPC64_TLS_RELOC (r_type)
12312
              != (sym_type == STT_TLS
12313
                  || (sym_type == STT_SECTION
12314
                      && (sec->flags & SEC_THREAD_LOCAL) != 0))))
12315
        {
12316
          if (tls_mask != 0
12317
              && (r_type == R_PPC64_TLS
12318
                  || r_type == R_PPC64_TLSGD
12319
                  || r_type == R_PPC64_TLSLD))
12320
            /* R_PPC64_TLS is OK against a symbol in the TOC.  */
12321
            ;
12322
          else
12323
            info->callbacks->einfo
12324
              (!IS_PPC64_TLS_RELOC (r_type)
12325 161 khays
               ? _("%P: %H: %s used with TLS symbol %s\n")
12326
               : _("%P: %H: %s used with non-TLS symbol %s\n"),
12327 14 khays
               input_bfd, input_section, rel->r_offset,
12328
               ppc64_elf_howto_table[r_type]->name,
12329
               sym_name);
12330
        }
12331
 
12332
      /* Ensure reloc mapping code below stays sane.  */
12333
      if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
12334
          || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
12335
          || (R_PPC64_GOT_TLSLD16 & 3)    != (R_PPC64_GOT_TLSGD16 & 3)
12336
          || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
12337
          || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
12338
          || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
12339
          || (R_PPC64_GOT_TLSLD16 & 3)    != (R_PPC64_GOT_TPREL16_DS & 3)
12340
          || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
12341
          || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
12342
          || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
12343
        abort ();
12344
 
12345
      switch (r_type)
12346
        {
12347
        default:
12348
          break;
12349
 
12350
        case R_PPC64_LO_DS_OPT:
12351
          insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
12352
          if ((insn & (0x3f << 26)) != 58u << 26)
12353
            abort ();
12354
          insn += (14u << 26) - (58u << 26);
12355
          bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
12356
          r_type = R_PPC64_TOC16_LO;
12357
          rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12358
          break;
12359
 
12360
        case R_PPC64_TOC16:
12361
        case R_PPC64_TOC16_LO:
12362
        case R_PPC64_TOC16_DS:
12363
        case R_PPC64_TOC16_LO_DS:
12364
          {
12365
            /* Check for toc tls entries.  */
12366
            unsigned char *toc_tls;
12367
            int retval;
12368
 
12369
            retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
12370
                                   &local_syms, rel, input_bfd);
12371
            if (retval == 0)
12372
              return FALSE;
12373
 
12374
            if (toc_tls)
12375
              {
12376
                tls_mask = *toc_tls;
12377
                if (r_type == R_PPC64_TOC16_DS
12378
                    || r_type == R_PPC64_TOC16_LO_DS)
12379
                  {
12380
                    if (tls_mask != 0
12381
                        && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
12382
                      goto toctprel;
12383
                  }
12384
                else
12385
                  {
12386
                    /* If we found a GD reloc pair, then we might be
12387
                       doing a GD->IE transition.  */
12388
                    if (retval == 2)
12389
                      {
12390
                        tls_gd = TLS_TPRELGD;
12391
                        if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
12392
                          goto tls_ldgd_opt;
12393
                      }
12394
                    else if (retval == 3)
12395
                      {
12396
                        if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
12397
                          goto tls_ldgd_opt;
12398
                      }
12399
                  }
12400
              }
12401
          }
12402
          break;
12403
 
12404
        case R_PPC64_GOT_TPREL16_HI:
12405
        case R_PPC64_GOT_TPREL16_HA:
12406
          if (tls_mask != 0
12407
              && (tls_mask & TLS_TPREL) == 0)
12408
            {
12409
              rel->r_offset -= d_offset;
12410
              bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
12411
              r_type = R_PPC64_NONE;
12412
              rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12413
            }
12414
          break;
12415
 
12416
        case R_PPC64_GOT_TPREL16_DS:
12417
        case R_PPC64_GOT_TPREL16_LO_DS:
12418
          if (tls_mask != 0
12419
              && (tls_mask & TLS_TPREL) == 0)
12420
            {
12421
            toctprel:
12422
              insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
12423
              insn &= 31 << 21;
12424
              insn |= 0x3c0d0000;       /* addis 0,13,0 */
12425
              bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
12426
              r_type = R_PPC64_TPREL16_HA;
12427
              if (toc_symndx != 0)
12428
                {
12429
                  rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
12430
                  rel->r_addend = toc_addend;
12431
                  /* We changed the symbol.  Start over in order to
12432
                     get h, sym, sec etc. right.  */
12433
                  rel--;
12434
                  continue;
12435
                }
12436
              else
12437
                rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12438
            }
12439
          break;
12440
 
12441
        case R_PPC64_TLS:
12442
          if (tls_mask != 0
12443
              && (tls_mask & TLS_TPREL) == 0)
12444
            {
12445
              insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
12446
              insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
12447
              if (insn == 0)
12448
                abort ();
12449
              bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
12450
              /* Was PPC64_TLS which sits on insn boundary, now
12451
                 PPC64_TPREL16_LO which is at low-order half-word.  */
12452
              rel->r_offset += d_offset;
12453
              r_type = R_PPC64_TPREL16_LO;
12454
              if (toc_symndx != 0)
12455
                {
12456
                  rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
12457
                  rel->r_addend = toc_addend;
12458
                  /* We changed the symbol.  Start over in order to
12459
                     get h, sym, sec etc. right.  */
12460
                  rel--;
12461
                  continue;
12462
                }
12463
              else
12464
                rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12465
            }
12466
          break;
12467
 
12468
        case R_PPC64_GOT_TLSGD16_HI:
12469
        case R_PPC64_GOT_TLSGD16_HA:
12470
          tls_gd = TLS_TPRELGD;
12471
          if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
12472
            goto tls_gdld_hi;
12473
          break;
12474
 
12475
        case R_PPC64_GOT_TLSLD16_HI:
12476
        case R_PPC64_GOT_TLSLD16_HA:
12477
          if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
12478
            {
12479
            tls_gdld_hi:
12480
              if ((tls_mask & tls_gd) != 0)
12481
                r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
12482
                          + R_PPC64_GOT_TPREL16_DS);
12483
              else
12484
                {
12485
                  rel->r_offset -= d_offset;
12486
                  bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
12487
                  r_type = R_PPC64_NONE;
12488
                }
12489
              rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12490
            }
12491
          break;
12492
 
12493
        case R_PPC64_GOT_TLSGD16:
12494
        case R_PPC64_GOT_TLSGD16_LO:
12495
          tls_gd = TLS_TPRELGD;
12496
          if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
12497
            goto tls_ldgd_opt;
12498
          break;
12499
 
12500
        case R_PPC64_GOT_TLSLD16:
12501
        case R_PPC64_GOT_TLSLD16_LO:
12502
          if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
12503
            {
12504
              unsigned int insn1, insn2, insn3;
12505
              bfd_vma offset;
12506
 
12507
            tls_ldgd_opt:
12508
              offset = (bfd_vma) -1;
12509
              /* If not using the newer R_PPC64_TLSGD/LD to mark
12510
                 __tls_get_addr calls, we must trust that the call
12511
                 stays with its arg setup insns, ie. that the next
12512
                 reloc is the __tls_get_addr call associated with
12513
                 the current reloc.  Edit both insns.  */
12514
              if (input_section->has_tls_get_addr_call
12515
                  && rel + 1 < relend
12516
                  && branch_reloc_hash_match (input_bfd, rel + 1,
12517
                                              htab->tls_get_addr,
12518
                                              htab->tls_get_addr_fd))
12519
                offset = rel[1].r_offset;
12520
              if ((tls_mask & tls_gd) != 0)
12521
                {
12522
                  /* IE */
12523
                  insn1 = bfd_get_32 (output_bfd,
12524
                                      contents + rel->r_offset - d_offset);
12525
                  insn1 &= (1 << 26) - (1 << 2);
12526
                  insn1 |= 58 << 26;    /* ld */
12527
                  insn2 = 0x7c636a14;   /* add 3,3,13 */
12528
                  if (offset != (bfd_vma) -1)
12529
                    rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
12530
                  if ((tls_mask & TLS_EXPLICIT) == 0)
12531
                    r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
12532
                              + R_PPC64_GOT_TPREL16_DS);
12533
                  else
12534
                    r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
12535
                  rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12536
                }
12537
              else
12538
                {
12539
                  /* LE */
12540
                  insn1 = 0x3c6d0000;   /* addis 3,13,0 */
12541
                  insn2 = 0x38630000;   /* addi 3,3,0 */
12542
                  if (tls_gd == 0)
12543
                    {
12544
                      /* Was an LD reloc.  */
12545
                      if (toc_symndx)
12546
                        sec = local_sections[toc_symndx];
12547
                      for (r_symndx = 0;
12548
                           r_symndx < symtab_hdr->sh_info;
12549
                           r_symndx++)
12550
                        if (local_sections[r_symndx] == sec)
12551
                          break;
12552
                      if (r_symndx >= symtab_hdr->sh_info)
12553
                        r_symndx = STN_UNDEF;
12554
                      rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
12555
                      if (r_symndx != STN_UNDEF)
12556
                        rel->r_addend -= (local_syms[r_symndx].st_value
12557
                                          + sec->output_offset
12558
                                          + sec->output_section->vma);
12559
                    }
12560
                  else if (toc_symndx != 0)
12561
                    {
12562
                      r_symndx = toc_symndx;
12563
                      rel->r_addend = toc_addend;
12564
                    }
12565
                  r_type = R_PPC64_TPREL16_HA;
12566
                  rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12567
                  if (offset != (bfd_vma) -1)
12568
                    {
12569
                      rel[1].r_info = ELF64_R_INFO (r_symndx,
12570
                                                    R_PPC64_TPREL16_LO);
12571
                      rel[1].r_offset = offset + d_offset;
12572
                      rel[1].r_addend = rel->r_addend;
12573
                    }
12574
                }
12575
              bfd_put_32 (output_bfd, insn1,
12576
                          contents + rel->r_offset - d_offset);
12577
              if (offset != (bfd_vma) -1)
12578
                {
12579
                  insn3 = bfd_get_32 (output_bfd,
12580
                                      contents + offset + 4);
12581
                  if (insn3 == NOP
12582
                      || insn3 == CROR_151515 || insn3 == CROR_313131)
12583
                    {
12584
                      rel[1].r_offset += 4;
12585
                      bfd_put_32 (output_bfd, insn2, contents + offset + 4);
12586
                      insn2 = NOP;
12587
                    }
12588
                  bfd_put_32 (output_bfd, insn2, contents + offset);
12589
                }
12590
              if ((tls_mask & tls_gd) == 0
12591
                  && (tls_gd == 0 || toc_symndx != 0))
12592
                {
12593
                  /* We changed the symbol.  Start over in order
12594
                     to get h, sym, sec etc. right.  */
12595
                  rel--;
12596
                  continue;
12597
                }
12598
            }
12599
          break;
12600
 
12601
        case R_PPC64_TLSGD:
12602
          if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
12603
            {
12604
              unsigned int insn2, insn3;
12605
              bfd_vma offset = rel->r_offset;
12606
 
12607
              if ((tls_mask & TLS_TPRELGD) != 0)
12608
                {
12609
                  /* IE */
12610
                  r_type = R_PPC64_NONE;
12611
                  insn2 = 0x7c636a14;   /* add 3,3,13 */
12612
                }
12613
              else
12614
                {
12615
                  /* LE */
12616
                  if (toc_symndx != 0)
12617
                    {
12618
                      r_symndx = toc_symndx;
12619
                      rel->r_addend = toc_addend;
12620
                    }
12621
                  r_type = R_PPC64_TPREL16_LO;
12622
                  rel->r_offset = offset + d_offset;
12623
                  insn2 = 0x38630000;   /* addi 3,3,0 */
12624
                }
12625
              rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12626
              /* Zap the reloc on the _tls_get_addr call too.  */
12627
              BFD_ASSERT (offset == rel[1].r_offset);
12628
              rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
12629
              insn3 = bfd_get_32 (output_bfd,
12630
                                  contents + offset + 4);
12631
              if (insn3 == NOP
12632
                  || insn3 == CROR_151515 || insn3 == CROR_313131)
12633
                {
12634
                  rel->r_offset += 4;
12635
                  bfd_put_32 (output_bfd, insn2, contents + offset + 4);
12636
                  insn2 = NOP;
12637
                }
12638
              bfd_put_32 (output_bfd, insn2, contents + offset);
12639
              if ((tls_mask & TLS_TPRELGD) == 0 && toc_symndx != 0)
12640
                {
12641
                  rel--;
12642
                  continue;
12643
                }
12644
            }
12645
          break;
12646
 
12647
        case R_PPC64_TLSLD:
12648
          if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
12649
            {
12650
              unsigned int insn2, insn3;
12651
              bfd_vma offset = rel->r_offset;
12652
 
12653
              if (toc_symndx)
12654
                sec = local_sections[toc_symndx];
12655
              for (r_symndx = 0;
12656
                   r_symndx < symtab_hdr->sh_info;
12657
                   r_symndx++)
12658
                if (local_sections[r_symndx] == sec)
12659
                  break;
12660
              if (r_symndx >= symtab_hdr->sh_info)
12661
                r_symndx = STN_UNDEF;
12662
              rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
12663
              if (r_symndx != STN_UNDEF)
12664
                rel->r_addend -= (local_syms[r_symndx].st_value
12665
                                  + sec->output_offset
12666
                                  + sec->output_section->vma);
12667
 
12668
              r_type = R_PPC64_TPREL16_LO;
12669
              rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12670
              rel->r_offset = offset + d_offset;
12671
              /* Zap the reloc on the _tls_get_addr call too.  */
12672
              BFD_ASSERT (offset == rel[1].r_offset);
12673
              rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
12674
              insn2 = 0x38630000;       /* addi 3,3,0 */
12675
              insn3 = bfd_get_32 (output_bfd,
12676
                                  contents + offset + 4);
12677
              if (insn3 == NOP
12678
                  || insn3 == CROR_151515 || insn3 == CROR_313131)
12679
                {
12680
                  rel->r_offset += 4;
12681
                  bfd_put_32 (output_bfd, insn2, contents + offset + 4);
12682
                  insn2 = NOP;
12683
                }
12684
              bfd_put_32 (output_bfd, insn2, contents + offset);
12685
              rel--;
12686
              continue;
12687
            }
12688
          break;
12689
 
12690
        case R_PPC64_DTPMOD64:
12691
          if (rel + 1 < relend
12692
              && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
12693
              && rel[1].r_offset == rel->r_offset + 8)
12694
            {
12695
              if ((tls_mask & TLS_GD) == 0)
12696
                {
12697
                  rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
12698
                  if ((tls_mask & TLS_TPRELGD) != 0)
12699
                    r_type = R_PPC64_TPREL64;
12700
                  else
12701
                    {
12702
                      bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
12703
                      r_type = R_PPC64_NONE;
12704
                    }
12705
                  rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12706
                }
12707
            }
12708
          else
12709
            {
12710
              if ((tls_mask & TLS_LD) == 0)
12711
                {
12712
                  bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
12713
                  r_type = R_PPC64_NONE;
12714
                  rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12715
                }
12716
            }
12717
          break;
12718
 
12719
        case R_PPC64_TPREL64:
12720
          if ((tls_mask & TLS_TPREL) == 0)
12721
            {
12722
              r_type = R_PPC64_NONE;
12723
              rel->r_info = ELF64_R_INFO (r_symndx, r_type);
12724
            }
12725
          break;
12726
        }
12727
 
12728
      /* Handle other relocations that tweak non-addend part of insn.  */
12729
      insn = 0;
12730
      max_br_offset = 1 << 25;
12731
      addend = rel->r_addend;
12732
      switch (r_type)
12733
        {
12734
        default:
12735
          break;
12736
 
12737 163 khays
        case R_PPC64_TOCSAVE:
12738
          if (relocation + addend == (rel->r_offset
12739
                                      + input_section->output_offset
12740
                                      + input_section->output_section->vma)
12741
              && tocsave_find (htab, NO_INSERT,
12742
                               &local_syms, rel, input_bfd))
12743
            {
12744
              insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
12745
              if (insn == NOP
12746
                  || insn == CROR_151515 || insn == CROR_313131)
12747
                bfd_put_32 (input_bfd, STD_R2_40R1,
12748
                            contents + rel->r_offset);
12749
            }
12750
          break;
12751
 
12752 14 khays
          /* Branch taken prediction relocations.  */
12753
        case R_PPC64_ADDR14_BRTAKEN:
12754
        case R_PPC64_REL14_BRTAKEN:
12755
          insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field.  */
12756
          /* Fall thru.  */
12757
 
12758
          /* Branch not taken prediction relocations.  */
12759
        case R_PPC64_ADDR14_BRNTAKEN:
12760
        case R_PPC64_REL14_BRNTAKEN:
12761
          insn |= bfd_get_32 (output_bfd,
12762
                              contents + rel->r_offset) & ~(0x01 << 21);
12763
          /* Fall thru.  */
12764
 
12765
        case R_PPC64_REL14:
12766
          max_br_offset = 1 << 15;
12767
          /* Fall thru.  */
12768
 
12769
        case R_PPC64_REL24:
12770
          /* Calls to functions with a different TOC, such as calls to
12771
             shared objects, need to alter the TOC pointer.  This is
12772
             done using a linkage stub.  A REL24 branching to these
12773
             linkage stubs needs to be followed by a nop, as the nop
12774
             will be replaced with an instruction to restore the TOC
12775
             base pointer.  */
12776
          fdh = h;
12777
          if (h != NULL
12778
              && h->oh != NULL
12779
              && h->oh->is_func_descriptor)
12780
            fdh = ppc_follow_link (h->oh);
12781
          stub_entry = ppc_get_stub_entry (input_section, sec, fdh, rel, htab);
12782
          if (stub_entry != NULL
12783
              && (stub_entry->stub_type == ppc_stub_plt_call
12784 166 khays
                  || stub_entry->stub_type == ppc_stub_plt_call_r2save
12785 14 khays
                  || stub_entry->stub_type == ppc_stub_plt_branch_r2off
12786
                  || stub_entry->stub_type == ppc_stub_long_branch_r2off))
12787
            {
12788
              bfd_boolean can_plt_call = FALSE;
12789
 
12790
              if (rel->r_offset + 8 <= input_section->size)
12791
                {
12792
                  unsigned long nop;
12793
                  nop = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
12794
                  if (nop == NOP
12795
                      || nop == CROR_151515 || nop == CROR_313131)
12796
                    {
12797
                      if (h != NULL
12798
                          && (h == htab->tls_get_addr_fd
12799
                              || h == htab->tls_get_addr)
12800
                          && !htab->no_tls_get_addr_opt)
12801
                        {
12802
                          /* Special stub used, leave nop alone.  */
12803
                        }
12804
                      else
12805
                        bfd_put_32 (input_bfd, LD_R2_40R1,
12806
                                    contents + rel->r_offset + 4);
12807
                      can_plt_call = TRUE;
12808
                    }
12809
                }
12810
 
12811
              if (!can_plt_call)
12812
                {
12813 166 khays
                  if (stub_entry->stub_type == ppc_stub_plt_call
12814
                      || stub_entry->stub_type == ppc_stub_plt_call_r2save)
12815 14 khays
                    {
12816
                      /* If this is a plain branch rather than a branch
12817
                         and link, don't require a nop.  However, don't
12818
                         allow tail calls in a shared library as they
12819
                         will result in r2 being corrupted.  */
12820
                      unsigned long br;
12821
                      br = bfd_get_32 (input_bfd, contents + rel->r_offset);
12822
                      if (info->executable && (br & 1) == 0)
12823
                        can_plt_call = TRUE;
12824
                      else
12825
                        stub_entry = NULL;
12826
                    }
12827
                  else if (h != NULL
12828
                           && strcmp (h->elf.root.root.string,
12829
                                      ".__libc_start_main") == 0)
12830
                    {
12831
                      /* Allow crt1 branch to go via a toc adjusting stub.  */
12832
                      can_plt_call = TRUE;
12833
                    }
12834
                  else
12835
                    {
12836
                      if (strcmp (input_section->output_section->name,
12837
                                  ".init") == 0
12838
                          || strcmp (input_section->output_section->name,
12839
                                     ".fini") == 0)
12840
                        info->callbacks->einfo
12841 161 khays
                          (_("%P: %H: automatic multiple TOCs "
12842 14 khays
                             "not supported using your crt files; "
12843
                             "recompile with -mminimal-toc or upgrade gcc\n"),
12844
                           input_bfd, input_section, rel->r_offset);
12845
                      else
12846
                        info->callbacks->einfo
12847 161 khays
                          (_("%P: %H: sibling call optimization to `%s' "
12848 14 khays
                             "does not allow automatic multiple TOCs; "
12849
                             "recompile with -mminimal-toc or "
12850
                             "-fno-optimize-sibling-calls, "
12851
                             "or make `%s' extern\n"),
12852
                           input_bfd, input_section, rel->r_offset,
12853
                           sym_name,
12854
                           sym_name);
12855
                      bfd_set_error (bfd_error_bad_value);
12856
                      ret = FALSE;
12857
                    }
12858
                }
12859
 
12860
              if (can_plt_call
12861 166 khays
                  && (stub_entry->stub_type == ppc_stub_plt_call
12862
                      || stub_entry->stub_type == ppc_stub_plt_call_r2save))
12863 14 khays
                unresolved_reloc = FALSE;
12864
            }
12865
 
12866
          if ((stub_entry == NULL
12867
               || stub_entry->stub_type == ppc_stub_long_branch
12868
               || stub_entry->stub_type == ppc_stub_plt_branch)
12869
              && get_opd_info (sec) != NULL)
12870
            {
12871
              /* The branch destination is the value of the opd entry. */
12872
              bfd_vma off = (relocation + addend
12873
                             - sec->output_section->vma
12874
                             - sec->output_offset);
12875
              bfd_vma dest = opd_entry_value (sec, off, NULL, NULL);
12876
              if (dest != (bfd_vma) -1)
12877
                {
12878
                  relocation = dest;
12879
                  addend = 0;
12880
                }
12881
            }
12882
 
12883
          /* If the branch is out of reach we ought to have a long
12884
             branch stub.  */
12885
          from = (rel->r_offset
12886
                  + input_section->output_offset
12887
                  + input_section->output_section->vma);
12888
 
12889
          if (stub_entry != NULL
12890
              && (stub_entry->stub_type == ppc_stub_long_branch
12891
                  || stub_entry->stub_type == ppc_stub_plt_branch)
12892
              && (r_type == R_PPC64_ADDR14_BRTAKEN
12893
                  || r_type == R_PPC64_ADDR14_BRNTAKEN
12894
                  || (relocation + addend - from + max_br_offset
12895
                      < 2 * max_br_offset)))
12896
            /* Don't use the stub if this branch is in range.  */
12897
            stub_entry = NULL;
12898
 
12899
          if (stub_entry != NULL)
12900
            {
12901
              /* Munge up the value and addend so that we call the stub
12902
                 rather than the procedure directly.  */
12903
              relocation = (stub_entry->stub_offset
12904
                            + stub_entry->stub_sec->output_offset
12905
                            + stub_entry->stub_sec->output_section->vma);
12906
              addend = 0;
12907 163 khays
 
12908 166 khays
              if ((stub_entry->stub_type == ppc_stub_plt_call
12909
                   || stub_entry->stub_type == ppc_stub_plt_call_r2save)
12910
                  && (ALWAYS_EMIT_R2SAVE
12911
                      || stub_entry->stub_type == ppc_stub_plt_call_r2save)
12912 163 khays
                  && rel + 1 < relend
12913
                  && rel[1].r_offset == rel->r_offset + 4
12914
                  && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE)
12915
                relocation += 4;
12916 14 khays
            }
12917
 
12918
          if (insn != 0)
12919
            {
12920 166 khays
              if (is_isa_v2)
12921 14 khays
                {
12922
                  /* Set 'a' bit.  This is 0b00010 in BO field for branch
12923
                     on CR(BI) insns (BO == 001at or 011at), and 0b01000
12924
                     for branch on CTR insns (BO == 1a00t or 1a01t).  */
12925
                  if ((insn & (0x14 << 21)) == (0x04 << 21))
12926
                    insn |= 0x02 << 21;
12927
                  else if ((insn & (0x14 << 21)) == (0x10 << 21))
12928
                    insn |= 0x08 << 21;
12929
                  else
12930
                    break;
12931
                }
12932
              else
12933
                {
12934
                  /* Invert 'y' bit if not the default.  */
12935
                  if ((bfd_signed_vma) (relocation + addend - from) < 0)
12936
                    insn ^= 0x01 << 21;
12937
                }
12938
 
12939
              bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
12940
            }
12941
 
12942
          /* NOP out calls to undefined weak functions.
12943
             We can thus call a weak function without first
12944
             checking whether the function is defined.  */
12945
          else if (h != NULL
12946
                   && h->elf.root.type == bfd_link_hash_undefweak
12947
                   && h->elf.dynindx == -1
12948
                   && r_type == R_PPC64_REL24
12949
                   && relocation == 0
12950
                   && addend == 0)
12951
            {
12952
              bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
12953
              continue;
12954
            }
12955
          break;
12956
        }
12957
 
12958
      /* Set `addend'.  */
12959
      tls_type = 0;
12960
      switch (r_type)
12961
        {
12962
        default:
12963
          info->callbacks->einfo
12964 161 khays
            (_("%P: %B: unknown relocation type %d for symbol %s\n"),
12965 14 khays
             input_bfd, (int) r_type, sym_name);
12966
 
12967
          bfd_set_error (bfd_error_bad_value);
12968
          ret = FALSE;
12969
          continue;
12970
 
12971
        case R_PPC64_NONE:
12972
        case R_PPC64_TLS:
12973
        case R_PPC64_TLSGD:
12974
        case R_PPC64_TLSLD:
12975 163 khays
        case R_PPC64_TOCSAVE:
12976 14 khays
        case R_PPC64_GNU_VTINHERIT:
12977
        case R_PPC64_GNU_VTENTRY:
12978
          continue;
12979
 
12980
          /* GOT16 relocations.  Like an ADDR16 using the symbol's
12981
             address in the GOT as relocation value instead of the
12982
             symbol's value itself.  Also, create a GOT entry for the
12983
             symbol and put the symbol value there.  */
12984
        case R_PPC64_GOT_TLSGD16:
12985
        case R_PPC64_GOT_TLSGD16_LO:
12986
        case R_PPC64_GOT_TLSGD16_HI:
12987
        case R_PPC64_GOT_TLSGD16_HA:
12988
          tls_type = TLS_TLS | TLS_GD;
12989
          goto dogot;
12990
 
12991
        case R_PPC64_GOT_TLSLD16:
12992
        case R_PPC64_GOT_TLSLD16_LO:
12993
        case R_PPC64_GOT_TLSLD16_HI:
12994
        case R_PPC64_GOT_TLSLD16_HA:
12995
          tls_type = TLS_TLS | TLS_LD;
12996
          goto dogot;
12997
 
12998
        case R_PPC64_GOT_TPREL16_DS:
12999
        case R_PPC64_GOT_TPREL16_LO_DS:
13000
        case R_PPC64_GOT_TPREL16_HI:
13001
        case R_PPC64_GOT_TPREL16_HA:
13002
          tls_type = TLS_TLS | TLS_TPREL;
13003
          goto dogot;
13004
 
13005
        case R_PPC64_GOT_DTPREL16_DS:
13006
        case R_PPC64_GOT_DTPREL16_LO_DS:
13007
        case R_PPC64_GOT_DTPREL16_HI:
13008
        case R_PPC64_GOT_DTPREL16_HA:
13009
          tls_type = TLS_TLS | TLS_DTPREL;
13010
          goto dogot;
13011
 
13012
        case R_PPC64_GOT16:
13013
        case R_PPC64_GOT16_LO:
13014
        case R_PPC64_GOT16_HI:
13015
        case R_PPC64_GOT16_HA:
13016
        case R_PPC64_GOT16_DS:
13017
        case R_PPC64_GOT16_LO_DS:
13018
        dogot:
13019
          {
13020
            /* Relocation is to the entry for this symbol in the global
13021
               offset table.  */
13022
            asection *got;
13023
            bfd_vma *offp;
13024
            bfd_vma off;
13025
            unsigned long indx = 0;
13026
            struct got_entry *ent;
13027
 
13028
            if (tls_type == (TLS_TLS | TLS_LD)
13029
                && (h == NULL
13030
                    || !h->elf.def_dynamic))
13031
              ent = ppc64_tlsld_got (input_bfd);
13032
            else
13033
              {
13034
 
13035
                if (h != NULL)
13036
                  {
13037
                    bfd_boolean dyn = htab->elf.dynamic_sections_created;
13038
                    if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
13039
                                                          &h->elf)
13040
                        || (info->shared
13041
                            && SYMBOL_CALLS_LOCAL (info, &h->elf)))
13042
                      /* This is actually a static link, or it is a
13043
                         -Bsymbolic link and the symbol is defined
13044
                         locally, or the symbol was forced to be local
13045
                         because of a version file.  */
13046
                      ;
13047
                    else
13048
                      {
13049
                        indx = h->elf.dynindx;
13050
                        unresolved_reloc = FALSE;
13051
                      }
13052
                    ent = h->elf.got.glist;
13053
                  }
13054
                else
13055
                  {
13056
                    if (local_got_ents == NULL)
13057
                      abort ();
13058
                    ent = local_got_ents[r_symndx];
13059
                  }
13060
 
13061
                for (; ent != NULL; ent = ent->next)
13062
                  if (ent->addend == orig_addend
13063
                      && ent->owner == input_bfd
13064
                      && ent->tls_type == tls_type)
13065
                    break;
13066
              }
13067
 
13068
            if (ent == NULL)
13069
              abort ();
13070
            if (ent->is_indirect)
13071
              ent = ent->got.ent;
13072
            offp = &ent->got.offset;
13073
            got = ppc64_elf_tdata (ent->owner)->got;
13074
            if (got == NULL)
13075
              abort ();
13076
 
13077
            /* The offset must always be a multiple of 8.  We use the
13078
               least significant bit to record whether we have already
13079
               processed this entry.  */
13080
            off = *offp;
13081
            if ((off & 1) != 0)
13082
              off &= ~1;
13083
            else
13084
              {
13085
                /* Generate relocs for the dynamic linker, except in
13086
                   the case of TLSLD where we'll use one entry per
13087
                   module.  */
13088
                asection *relgot;
13089
                bfd_boolean ifunc;
13090
 
13091
                *offp = off | 1;
13092
                relgot = NULL;
13093
                ifunc = (h != NULL
13094
                         ? h->elf.type == STT_GNU_IFUNC
13095
                         : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
13096
                if ((info->shared || indx != 0)
13097
                    && (h == NULL
13098
                        || (tls_type == (TLS_TLS | TLS_LD)
13099
                            && !h->elf.def_dynamic)
13100
                        || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
13101
                        || h->elf.root.type != bfd_link_hash_undefweak))
13102
                  relgot = ppc64_elf_tdata (ent->owner)->relgot;
13103
                else if (ifunc)
13104
                  relgot = htab->reliplt;
13105
                if (relgot != NULL)
13106
                  {
13107
                    outrel.r_offset = (got->output_section->vma
13108
                                       + got->output_offset
13109
                                       + off);
13110
                    outrel.r_addend = addend;
13111
                    if (tls_type & (TLS_LD | TLS_GD))
13112
                      {
13113
                        outrel.r_addend = 0;
13114
                        outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
13115
                        if (tls_type == (TLS_TLS | TLS_GD))
13116
                          {
13117
                            loc = relgot->contents;
13118
                            loc += (relgot->reloc_count++
13119
                                    * sizeof (Elf64_External_Rela));
13120
                            bfd_elf64_swap_reloca_out (output_bfd,
13121
                                                       &outrel, loc);
13122
                            outrel.r_offset += 8;
13123
                            outrel.r_addend = addend;
13124
                            outrel.r_info
13125
                              = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
13126
                          }
13127
                      }
13128
                    else if (tls_type == (TLS_TLS | TLS_DTPREL))
13129
                      outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
13130
                    else if (tls_type == (TLS_TLS | TLS_TPREL))
13131
                      outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
13132
                    else if (indx != 0)
13133
                      outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
13134
                    else
13135
                      {
13136
                        if (ifunc)
13137
                          outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13138
                        else
13139
                          outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13140
 
13141
                        /* Write the .got section contents for the sake
13142
                           of prelink.  */
13143
                        loc = got->contents + off;
13144
                        bfd_put_64 (output_bfd, outrel.r_addend + relocation,
13145
                                    loc);
13146
                      }
13147
 
13148
                    if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
13149
                      {
13150
                        outrel.r_addend += relocation;
13151
                        if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
13152
                          outrel.r_addend -= htab->elf.tls_sec->vma;
13153
                      }
13154
                    loc = relgot->contents;
13155
                    loc += (relgot->reloc_count++
13156
                            * sizeof (Elf64_External_Rela));
13157
                    bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
13158
                  }
13159
 
13160
                /* Init the .got section contents here if we're not
13161
                   emitting a reloc.  */
13162
                else
13163
                  {
13164
                    relocation += addend;
13165
                    if (tls_type == (TLS_TLS | TLS_LD))
13166
                      relocation = 1;
13167
                    else if (tls_type != 0)
13168
                      {
13169
                        relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
13170
                        if (tls_type == (TLS_TLS | TLS_TPREL))
13171
                          relocation += DTP_OFFSET - TP_OFFSET;
13172
 
13173
                        if (tls_type == (TLS_TLS | TLS_GD))
13174
                          {
13175
                            bfd_put_64 (output_bfd, relocation,
13176
                                        got->contents + off + 8);
13177
                            relocation = 1;
13178
                          }
13179
                      }
13180
 
13181
                    bfd_put_64 (output_bfd, relocation,
13182
                                got->contents + off);
13183
                  }
13184
              }
13185
 
13186
            if (off >= (bfd_vma) -2)
13187
              abort ();
13188
 
13189
            relocation = got->output_section->vma + got->output_offset + off;
13190
            addend = -(TOCstart + htab->stub_group[input_section->id].toc_off);
13191
          }
13192
          break;
13193
 
13194
        case R_PPC64_PLT16_HA:
13195
        case R_PPC64_PLT16_HI:
13196
        case R_PPC64_PLT16_LO:
13197
        case R_PPC64_PLT32:
13198
        case R_PPC64_PLT64:
13199
          /* Relocation is to the entry for this symbol in the
13200
             procedure linkage table.  */
13201
 
13202
          /* Resolve a PLT reloc against a local symbol directly,
13203
             without using the procedure linkage table.  */
13204
          if (h == NULL)
13205
            break;
13206
 
13207
          /* It's possible that we didn't make a PLT entry for this
13208
             symbol.  This happens when statically linking PIC code,
13209
             or when using -Bsymbolic.  Go find a match if there is a
13210
             PLT entry.  */
13211
          if (htab->plt != NULL)
13212
            {
13213
              struct plt_entry *ent;
13214
              for (ent = h->elf.plt.plist; ent != NULL; ent = ent->next)
13215
                if (ent->addend == orig_addend
13216
                    && ent->plt.offset != (bfd_vma) -1)
13217
                  {
13218
                    relocation = (htab->plt->output_section->vma
13219
                                  + htab->plt->output_offset
13220
                                  + ent->plt.offset);
13221
                    unresolved_reloc = FALSE;
13222
                  }
13223
            }
13224
          break;
13225
 
13226
        case R_PPC64_TOC:
13227
          /* Relocation value is TOC base.  */
13228
          relocation = TOCstart;
13229
          if (r_symndx == STN_UNDEF)
13230
            relocation += htab->stub_group[input_section->id].toc_off;
13231
          else if (unresolved_reloc)
13232
            ;
13233
          else if (sec != NULL && sec->id <= htab->top_id)
13234
            relocation += htab->stub_group[sec->id].toc_off;
13235
          else
13236
            unresolved_reloc = TRUE;
13237
          goto dodyn;
13238
 
13239
          /* TOC16 relocs.  We want the offset relative to the TOC base,
13240
             which is the address of the start of the TOC plus 0x8000.
13241
             The TOC consists of sections .got, .toc, .tocbss, and .plt,
13242
             in this order.  */
13243
        case R_PPC64_TOC16:
13244
        case R_PPC64_TOC16_LO:
13245
        case R_PPC64_TOC16_HI:
13246
        case R_PPC64_TOC16_DS:
13247
        case R_PPC64_TOC16_LO_DS:
13248
        case R_PPC64_TOC16_HA:
13249
          addend -= TOCstart + htab->stub_group[input_section->id].toc_off;
13250
          break;
13251
 
13252
          /* Relocate against the beginning of the section.  */
13253
        case R_PPC64_SECTOFF:
13254
        case R_PPC64_SECTOFF_LO:
13255
        case R_PPC64_SECTOFF_HI:
13256
        case R_PPC64_SECTOFF_DS:
13257
        case R_PPC64_SECTOFF_LO_DS:
13258
        case R_PPC64_SECTOFF_HA:
13259
          if (sec != NULL)
13260
            addend -= sec->output_section->vma;
13261
          break;
13262
 
13263
        case R_PPC64_REL16:
13264
        case R_PPC64_REL16_LO:
13265
        case R_PPC64_REL16_HI:
13266
        case R_PPC64_REL16_HA:
13267
          break;
13268
 
13269
        case R_PPC64_REL14:
13270
        case R_PPC64_REL14_BRNTAKEN:
13271
        case R_PPC64_REL14_BRTAKEN:
13272
        case R_PPC64_REL24:
13273
          break;
13274
 
13275
        case R_PPC64_TPREL16:
13276
        case R_PPC64_TPREL16_LO:
13277
        case R_PPC64_TPREL16_HI:
13278
        case R_PPC64_TPREL16_HA:
13279
        case R_PPC64_TPREL16_DS:
13280
        case R_PPC64_TPREL16_LO_DS:
13281
        case R_PPC64_TPREL16_HIGHER:
13282
        case R_PPC64_TPREL16_HIGHERA:
13283
        case R_PPC64_TPREL16_HIGHEST:
13284
        case R_PPC64_TPREL16_HIGHESTA:
13285
          if (h != NULL
13286
              && h->elf.root.type == bfd_link_hash_undefweak
13287
              && h->elf.dynindx == -1)
13288
            {
13289
              /* Make this relocation against an undefined weak symbol
13290
                 resolve to zero.  This is really just a tweak, since
13291
                 code using weak externs ought to check that they are
13292
                 defined before using them.  */
13293
              bfd_byte *p = contents + rel->r_offset - d_offset;
13294
 
13295
              insn = bfd_get_32 (output_bfd, p);
13296
              insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
13297
              if (insn != 0)
13298
                bfd_put_32 (output_bfd, insn, p);
13299
              break;
13300
            }
13301
          addend -= htab->elf.tls_sec->vma + TP_OFFSET;
13302
          if (info->shared)
13303
            /* The TPREL16 relocs shouldn't really be used in shared
13304
               libs as they will result in DT_TEXTREL being set, but
13305
               support them anyway.  */
13306
            goto dodyn;
13307
          break;
13308
 
13309
        case R_PPC64_DTPREL16:
13310
        case R_PPC64_DTPREL16_LO:
13311
        case R_PPC64_DTPREL16_HI:
13312
        case R_PPC64_DTPREL16_HA:
13313
        case R_PPC64_DTPREL16_DS:
13314
        case R_PPC64_DTPREL16_LO_DS:
13315
        case R_PPC64_DTPREL16_HIGHER:
13316
        case R_PPC64_DTPREL16_HIGHERA:
13317
        case R_PPC64_DTPREL16_HIGHEST:
13318
        case R_PPC64_DTPREL16_HIGHESTA:
13319
          addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
13320
          break;
13321
 
13322
        case R_PPC64_DTPMOD64:
13323
          relocation = 1;
13324
          addend = 0;
13325
          goto dodyn;
13326
 
13327
        case R_PPC64_TPREL64:
13328
          addend -= htab->elf.tls_sec->vma + TP_OFFSET;
13329
          goto dodyn;
13330
 
13331
        case R_PPC64_DTPREL64:
13332
          addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
13333
          /* Fall thru */
13334
 
13335
          /* Relocations that may need to be propagated if this is a
13336
             dynamic object.  */
13337
        case R_PPC64_REL30:
13338
        case R_PPC64_REL32:
13339
        case R_PPC64_REL64:
13340
        case R_PPC64_ADDR14:
13341
        case R_PPC64_ADDR14_BRNTAKEN:
13342
        case R_PPC64_ADDR14_BRTAKEN:
13343
        case R_PPC64_ADDR16:
13344
        case R_PPC64_ADDR16_DS:
13345
        case R_PPC64_ADDR16_HA:
13346
        case R_PPC64_ADDR16_HI:
13347
        case R_PPC64_ADDR16_HIGHER:
13348
        case R_PPC64_ADDR16_HIGHERA:
13349
        case R_PPC64_ADDR16_HIGHEST:
13350
        case R_PPC64_ADDR16_HIGHESTA:
13351
        case R_PPC64_ADDR16_LO:
13352
        case R_PPC64_ADDR16_LO_DS:
13353
        case R_PPC64_ADDR24:
13354
        case R_PPC64_ADDR32:
13355
        case R_PPC64_ADDR64:
13356
        case R_PPC64_UADDR16:
13357
        case R_PPC64_UADDR32:
13358
        case R_PPC64_UADDR64:
13359
        dodyn:
13360
          if ((input_section->flags & SEC_ALLOC) == 0)
13361
            break;
13362
 
13363
          if (NO_OPD_RELOCS && is_opd)
13364
            break;
13365
 
13366
          if ((info->shared
13367
               && (h == NULL
13368
                   || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
13369
                   || h->elf.root.type != bfd_link_hash_undefweak)
13370
               && (must_be_dyn_reloc (info, r_type)
13371
                   || !SYMBOL_CALLS_LOCAL (info, &h->elf)))
13372
              || (ELIMINATE_COPY_RELOCS
13373
                  && !info->shared
13374
                  && h != NULL
13375
                  && h->elf.dynindx != -1
13376
                  && !h->elf.non_got_ref
13377
                  && !h->elf.def_regular)
13378
              || (!info->shared
13379
                  && (h != NULL
13380
                      ? h->elf.type == STT_GNU_IFUNC
13381
                      : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)))
13382
            {
13383
              bfd_boolean skip, relocate;
13384
              asection *sreloc;
13385
              bfd_vma out_off;
13386
 
13387
              /* When generating a dynamic object, these relocations
13388
                 are copied into the output file to be resolved at run
13389
                 time.  */
13390
 
13391
              skip = FALSE;
13392
              relocate = FALSE;
13393
 
13394
              out_off = _bfd_elf_section_offset (output_bfd, info,
13395
                                                 input_section, rel->r_offset);
13396
              if (out_off == (bfd_vma) -1)
13397
                skip = TRUE;
13398
              else if (out_off == (bfd_vma) -2)
13399
                skip = TRUE, relocate = TRUE;
13400
              out_off += (input_section->output_section->vma
13401
                          + input_section->output_offset);
13402
              outrel.r_offset = out_off;
13403
              outrel.r_addend = rel->r_addend;
13404
 
13405
              /* Optimize unaligned reloc use.  */
13406
              if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
13407
                  || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
13408
                r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
13409
              else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
13410
                       || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
13411
                r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
13412
              else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
13413
                       || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
13414
                r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
13415
 
13416
              if (skip)
13417
                memset (&outrel, 0, sizeof outrel);
13418
              else if (!SYMBOL_CALLS_LOCAL (info, &h->elf)
13419
                       && !is_opd
13420
                       && r_type != R_PPC64_TOC)
13421
                outrel.r_info = ELF64_R_INFO (h->elf.dynindx, r_type);
13422
              else
13423
                {
13424
                  /* This symbol is local, or marked to become local,
13425
                     or this is an opd section reloc which must point
13426
                     at a local function.  */
13427
                  outrel.r_addend += relocation;
13428
                  if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
13429
                    {
13430
                      if (is_opd && h != NULL)
13431
                        {
13432
                          /* Lie about opd entries.  This case occurs
13433
                             when building shared libraries and we
13434
                             reference a function in another shared
13435
                             lib.  The same thing happens for a weak
13436
                             definition in an application that's
13437
                             overridden by a strong definition in a
13438
                             shared lib.  (I believe this is a generic
13439
                             bug in binutils handling of weak syms.)
13440
                             In these cases we won't use the opd
13441
                             entry in this lib.  */
13442
                          unresolved_reloc = FALSE;
13443
                        }
13444
                      if (!is_opd
13445
                          && r_type == R_PPC64_ADDR64
13446
                          && (h != NULL
13447
                              ? h->elf.type == STT_GNU_IFUNC
13448
                              : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
13449
                        outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13450
                      else
13451
                        {
13452
                          outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13453
 
13454
                          /* We need to relocate .opd contents for ld.so.
13455
                             Prelink also wants simple and consistent rules
13456
                             for relocs.  This make all RELATIVE relocs have
13457
                             *r_offset equal to r_addend.  */
13458
                          relocate = TRUE;
13459
                        }
13460
                    }
13461
                  else
13462
                    {
13463
                      long indx = 0;
13464
 
13465
                      if (h != NULL
13466
                          ? h->elf.type == STT_GNU_IFUNC
13467
                          : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
13468
                        {
13469
                          info->callbacks->einfo
13470 161 khays
                            (_("%P: %H: relocation %s for indirect "
13471 14 khays
                               "function %s unsupported\n"),
13472
                             input_bfd, input_section, rel->r_offset,
13473
                             ppc64_elf_howto_table[r_type]->name,
13474
                             sym_name);
13475
                          ret = FALSE;
13476
                        }
13477
                      else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
13478
                        ;
13479
                      else if (sec == NULL || sec->owner == NULL)
13480
                        {
13481
                          bfd_set_error (bfd_error_bad_value);
13482
                          return FALSE;
13483
                        }
13484
                      else
13485
                        {
13486
                          asection *osec;
13487
 
13488
                          osec = sec->output_section;
13489
                          indx = elf_section_data (osec)->dynindx;
13490
 
13491
                          if (indx == 0)
13492
                            {
13493
                              if ((osec->flags & SEC_READONLY) == 0
13494
                                  && htab->elf.data_index_section != NULL)
13495
                                osec = htab->elf.data_index_section;
13496
                              else
13497
                                osec = htab->elf.text_index_section;
13498
                              indx = elf_section_data (osec)->dynindx;
13499
                            }
13500
                          BFD_ASSERT (indx != 0);
13501
 
13502
                          /* We are turning this relocation into one
13503
                             against a section symbol, so subtract out
13504
                             the output section's address but not the
13505
                             offset of the input section in the output
13506
                             section.  */
13507
                          outrel.r_addend -= osec->vma;
13508
                        }
13509
 
13510
                      outrel.r_info = ELF64_R_INFO (indx, r_type);
13511
                    }
13512
                }
13513
 
13514
              sreloc = elf_section_data (input_section)->sreloc;
13515
              if (!htab->elf.dynamic_sections_created)
13516
                sreloc = htab->reliplt;
13517
              if (sreloc == NULL)
13518
                abort ();
13519
 
13520
              if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
13521
                  >= sreloc->size)
13522
                abort ();
13523
              loc = sreloc->contents;
13524
              loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
13525
              bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
13526
 
13527
              /* If this reloc is against an external symbol, it will
13528
                 be computed at runtime, so there's no need to do
13529
                 anything now.  However, for the sake of prelink ensure
13530
                 that the section contents are a known value.  */
13531
              if (! relocate)
13532
                {
13533
                  unresolved_reloc = FALSE;
13534
                  /* The value chosen here is quite arbitrary as ld.so
13535
                     ignores section contents except for the special
13536
                     case of .opd where the contents might be accessed
13537
                     before relocation.  Choose zero, as that won't
13538
                     cause reloc overflow.  */
13539
                  relocation = 0;
13540
                  addend = 0;
13541
                  /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
13542
                     to improve backward compatibility with older
13543
                     versions of ld.  */
13544
                  if (r_type == R_PPC64_ADDR64)
13545
                    addend = outrel.r_addend;
13546
                  /* Adjust pc_relative relocs to have zero in *r_offset.  */
13547
                  else if (ppc64_elf_howto_table[r_type]->pc_relative)
13548
                    addend = (input_section->output_section->vma
13549
                              + input_section->output_offset
13550
                              + rel->r_offset);
13551
                }
13552
            }
13553
          break;
13554
 
13555
        case R_PPC64_COPY:
13556
        case R_PPC64_GLOB_DAT:
13557
        case R_PPC64_JMP_SLOT:
13558
        case R_PPC64_JMP_IREL:
13559
        case R_PPC64_RELATIVE:
13560
          /* We shouldn't ever see these dynamic relocs in relocatable
13561
             files.  */
13562
          /* Fall through.  */
13563
 
13564
        case R_PPC64_PLTGOT16:
13565
        case R_PPC64_PLTGOT16_DS:
13566
        case R_PPC64_PLTGOT16_HA:
13567
        case R_PPC64_PLTGOT16_HI:
13568
        case R_PPC64_PLTGOT16_LO:
13569
        case R_PPC64_PLTGOT16_LO_DS:
13570
        case R_PPC64_PLTREL32:
13571
        case R_PPC64_PLTREL64:
13572
          /* These ones haven't been implemented yet.  */
13573
 
13574
          info->callbacks->einfo
13575 161 khays
            (_("%P: %B: relocation %s is not supported for symbol %s\n"),
13576 14 khays
             input_bfd,
13577
             ppc64_elf_howto_table[r_type]->name, sym_name);
13578
 
13579
          bfd_set_error (bfd_error_invalid_operation);
13580
          ret = FALSE;
13581
          continue;
13582
        }
13583
 
13584
      /* Multi-instruction sequences that access the TOC can be
13585
         optimized, eg. addis ra,r2,0; addi rb,ra,x;
13586
         to             nop;           addi rb,r2,x;  */
13587
      switch (r_type)
13588
        {
13589
        default:
13590
          break;
13591
 
13592
        case R_PPC64_GOT_TLSLD16_HI:
13593
        case R_PPC64_GOT_TLSGD16_HI:
13594
        case R_PPC64_GOT_TPREL16_HI:
13595
        case R_PPC64_GOT_DTPREL16_HI:
13596
        case R_PPC64_GOT16_HI:
13597
        case R_PPC64_TOC16_HI:
13598
          /* These relocs would only be useful if building up an
13599
             offset to later add to r2, perhaps in an indexed
13600
             addressing mode instruction.  Don't try to optimize.
13601
             Unfortunately, the possibility of someone building up an
13602
             offset like this or even with the HA relocs, means that
13603
             we need to check the high insn when optimizing the low
13604
             insn.  */
13605
          break;
13606
 
13607
        case R_PPC64_GOT_TLSLD16_HA:
13608
        case R_PPC64_GOT_TLSGD16_HA:
13609
        case R_PPC64_GOT_TPREL16_HA:
13610
        case R_PPC64_GOT_DTPREL16_HA:
13611
        case R_PPC64_GOT16_HA:
13612
        case R_PPC64_TOC16_HA:
13613 163 khays
          if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
13614
              && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
13615
            {
13616
              bfd_byte *p = contents + (rel->r_offset & ~3);
13617
              bfd_put_32 (input_bfd, NOP, p);
13618
            }
13619 14 khays
          break;
13620
 
13621
        case R_PPC64_GOT_TLSLD16_LO:
13622
        case R_PPC64_GOT_TLSGD16_LO:
13623
        case R_PPC64_GOT_TPREL16_LO_DS:
13624
        case R_PPC64_GOT_DTPREL16_LO_DS:
13625
        case R_PPC64_GOT16_LO:
13626
        case R_PPC64_GOT16_LO_DS:
13627
        case R_PPC64_TOC16_LO:
13628
        case R_PPC64_TOC16_LO_DS:
13629 163 khays
          if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
13630
              && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
13631 14 khays
            {
13632
              bfd_byte *p = contents + (rel->r_offset & ~3);
13633
              insn = bfd_get_32 (input_bfd, p);
13634 163 khays
              if ((insn & (0x3f << 26)) == 12u << 26 /* addic */)
13635 14 khays
                {
13636 163 khays
                  /* Transform addic to addi when we change reg.  */
13637
                  insn &= ~((0x3f << 26) | (0x1f << 16));
13638
                  insn |= (14u << 26) | (2 << 16);
13639 14 khays
                }
13640 163 khays
              else
13641
                {
13642
                  insn &= ~(0x1f << 16);
13643
                  insn |= 2 << 16;
13644
                }
13645
              bfd_put_32 (input_bfd, insn, p);
13646 14 khays
            }
13647
          break;
13648
        }
13649
 
13650
      /* Do any further special processing.  */
13651
      switch (r_type)
13652
        {
13653
        default:
13654
          break;
13655
 
13656
        case R_PPC64_ADDR16_HA:
13657
        case R_PPC64_REL16_HA:
13658
        case R_PPC64_ADDR16_HIGHERA:
13659
        case R_PPC64_ADDR16_HIGHESTA:
13660
        case R_PPC64_TOC16_HA:
13661
        case R_PPC64_SECTOFF_HA:
13662
        case R_PPC64_TPREL16_HA:
13663
        case R_PPC64_DTPREL16_HA:
13664
        case R_PPC64_TPREL16_HIGHER:
13665
        case R_PPC64_TPREL16_HIGHERA:
13666
        case R_PPC64_TPREL16_HIGHEST:
13667
        case R_PPC64_TPREL16_HIGHESTA:
13668
        case R_PPC64_DTPREL16_HIGHER:
13669
        case R_PPC64_DTPREL16_HIGHERA:
13670
        case R_PPC64_DTPREL16_HIGHEST:
13671
        case R_PPC64_DTPREL16_HIGHESTA:
13672
          /* It's just possible that this symbol is a weak symbol
13673
             that's not actually defined anywhere. In that case,
13674
             'sec' would be NULL, and we should leave the symbol
13675
             alone (it will be set to zero elsewhere in the link).  */
13676
          if (sec == NULL)
13677
            break;
13678
          /* Fall thru */
13679
 
13680
        case R_PPC64_GOT16_HA:
13681
        case R_PPC64_PLTGOT16_HA:
13682
        case R_PPC64_PLT16_HA:
13683
        case R_PPC64_GOT_TLSGD16_HA:
13684
        case R_PPC64_GOT_TLSLD16_HA:
13685
        case R_PPC64_GOT_TPREL16_HA:
13686
        case R_PPC64_GOT_DTPREL16_HA:
13687
          /* Add 0x10000 if sign bit in 0:15 is set.
13688
             Bits 0:15 are not used.  */
13689
          addend += 0x8000;
13690
          break;
13691
 
13692
        case R_PPC64_ADDR16_DS:
13693
        case R_PPC64_ADDR16_LO_DS:
13694
        case R_PPC64_GOT16_DS:
13695
        case R_PPC64_GOT16_LO_DS:
13696
        case R_PPC64_PLT16_LO_DS:
13697
        case R_PPC64_SECTOFF_DS:
13698
        case R_PPC64_SECTOFF_LO_DS:
13699
        case R_PPC64_TOC16_DS:
13700
        case R_PPC64_TOC16_LO_DS:
13701
        case R_PPC64_PLTGOT16_DS:
13702
        case R_PPC64_PLTGOT16_LO_DS:
13703
        case R_PPC64_GOT_TPREL16_DS:
13704
        case R_PPC64_GOT_TPREL16_LO_DS:
13705
        case R_PPC64_GOT_DTPREL16_DS:
13706
        case R_PPC64_GOT_DTPREL16_LO_DS:
13707
        case R_PPC64_TPREL16_DS:
13708
        case R_PPC64_TPREL16_LO_DS:
13709
        case R_PPC64_DTPREL16_DS:
13710
        case R_PPC64_DTPREL16_LO_DS:
13711
          insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
13712
          mask = 3;
13713
          /* If this reloc is against an lq insn, then the value must be
13714
             a multiple of 16.  This is somewhat of a hack, but the
13715
             "correct" way to do this by defining _DQ forms of all the
13716
             _DS relocs bloats all reloc switches in this file.  It
13717
             doesn't seem to make much sense to use any of these relocs
13718
             in data, so testing the insn should be safe.  */
13719
          if ((insn & (0x3f << 26)) == (56u << 26))
13720
            mask = 15;
13721
          if (((relocation + addend) & mask) != 0)
13722
            {
13723
              info->callbacks->einfo
13724 161 khays
                (_("%P: %H: error: %s not a multiple of %u\n"),
13725 14 khays
                 input_bfd, input_section, rel->r_offset,
13726
                 ppc64_elf_howto_table[r_type]->name,
13727
                 mask + 1);
13728
              bfd_set_error (bfd_error_bad_value);
13729
              ret = FALSE;
13730
              continue;
13731
            }
13732
          break;
13733
        }
13734
 
13735
      /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
13736
         because such sections are not SEC_ALLOC and thus ld.so will
13737
         not process them.  */
13738
      if (unresolved_reloc
13739
          && !((input_section->flags & SEC_DEBUGGING) != 0
13740 163 khays
               && h->elf.def_dynamic)
13741
          && _bfd_elf_section_offset (output_bfd, info, input_section,
13742
                                      rel->r_offset) != (bfd_vma) -1)
13743 14 khays
        {
13744
          info->callbacks->einfo
13745 161 khays
            (_("%P: %H: unresolvable %s relocation against symbol `%s'\n"),
13746 14 khays
             input_bfd, input_section, rel->r_offset,
13747
             ppc64_elf_howto_table[(int) r_type]->name,
13748
             h->elf.root.root.string);
13749
          ret = FALSE;
13750
        }
13751
 
13752
      r = _bfd_final_link_relocate (ppc64_elf_howto_table[(int) r_type],
13753
                                    input_bfd,
13754
                                    input_section,
13755
                                    contents,
13756
                                    rel->r_offset,
13757
                                    relocation,
13758
                                    addend);
13759
 
13760
      if (r != bfd_reloc_ok)
13761
        {
13762
          if (sym_name == NULL)
13763
            sym_name = "(null)";
13764
          if (r == bfd_reloc_overflow)
13765
            {
13766
              if (warned)
13767
                continue;
13768
              if (h != NULL
13769
                  && h->elf.root.type == bfd_link_hash_undefweak
13770
                  && ppc64_elf_howto_table[r_type]->pc_relative)
13771
                {
13772
                  /* Assume this is a call protected by other code that
13773
                     detects the symbol is undefined.  If this is the case,
13774
                     we can safely ignore the overflow.  If not, the
13775
                     program is hosed anyway, and a little warning isn't
13776
                     going to help.  */
13777
 
13778
                  continue;
13779
                }
13780
 
13781
              if (!((*info->callbacks->reloc_overflow)
13782
                    (info, (h ? &h->elf.root : NULL), sym_name,
13783
                     ppc64_elf_howto_table[r_type]->name,
13784
                     orig_addend, input_bfd, input_section, rel->r_offset)))
13785
                return FALSE;
13786
            }
13787
          else
13788
            {
13789
              info->callbacks->einfo
13790 161 khays
                (_("%P: %H: %s reloc against `%s': error %d\n"),
13791 14 khays
                 input_bfd, input_section, rel->r_offset,
13792
                 ppc64_elf_howto_table[r_type]->name,
13793
                 sym_name,
13794
                 (int) r);
13795
              ret = FALSE;
13796
            }
13797
        }
13798
    }
13799
 
13800
  /* If we're emitting relocations, then shortly after this function
13801
     returns, reloc offsets and addends for this section will be
13802
     adjusted.  Worse, reloc symbol indices will be for the output
13803
     file rather than the input.  Save a copy of the relocs for
13804
     opd_entry_value.  */
13805
  if (is_opd && (info->emitrelocations || info->relocatable))
13806
    {
13807
      bfd_size_type amt;
13808
      amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
13809
      rel = bfd_alloc (input_bfd, amt);
13810
      BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd_relocs == NULL);
13811
      ppc64_elf_tdata (input_bfd)->opd_relocs = rel;
13812
      if (rel == NULL)
13813
        return FALSE;
13814
      memcpy (rel, relocs, amt);
13815
    }
13816
  return ret;
13817
}
13818
 
13819
/* Adjust the value of any local symbols in opd sections.  */
13820
 
13821
static int
13822
ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
13823
                              const char *name ATTRIBUTE_UNUSED,
13824
                              Elf_Internal_Sym *elfsym,
13825
                              asection *input_sec,
13826
                              struct elf_link_hash_entry *h)
13827
{
13828
  struct _opd_sec_data *opd;
13829
  long adjust;
13830
  bfd_vma value;
13831
 
13832
  if (h != NULL)
13833
    return 1;
13834
 
13835
  opd = get_opd_info (input_sec);
13836
  if (opd == NULL || opd->adjust == NULL)
13837
    return 1;
13838
 
13839
  value = elfsym->st_value - input_sec->output_offset;
13840
  if (!info->relocatable)
13841
    value -= input_sec->output_section->vma;
13842
 
13843
  adjust = opd->adjust[value / 8];
13844
  if (adjust == -1)
13845
    return 2;
13846
 
13847
  elfsym->st_value += adjust;
13848
  return 1;
13849
}
13850
 
13851
/* Finish up dynamic symbol handling.  We set the contents of various
13852
   dynamic sections here.  */
13853
 
13854
static bfd_boolean
13855
ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
13856
                                 struct bfd_link_info *info,
13857
                                 struct elf_link_hash_entry *h,
13858
                                 Elf_Internal_Sym *sym)
13859
{
13860
  struct ppc_link_hash_table *htab;
13861
  struct plt_entry *ent;
13862
  Elf_Internal_Rela rela;
13863
  bfd_byte *loc;
13864
 
13865
  htab = ppc_hash_table (info);
13866
  if (htab == NULL)
13867
    return FALSE;
13868
 
13869
  for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13870
    if (ent->plt.offset != (bfd_vma) -1)
13871
      {
13872
        /* This symbol has an entry in the procedure linkage
13873
           table.  Set it up.  */
13874
        if (!htab->elf.dynamic_sections_created
13875
            || h->dynindx == -1)
13876
          {
13877
            BFD_ASSERT (h->type == STT_GNU_IFUNC
13878
                        && h->def_regular
13879
                        && (h->root.type == bfd_link_hash_defined
13880
                            || h->root.type == bfd_link_hash_defweak));
13881
            rela.r_offset = (htab->iplt->output_section->vma
13882
                             + htab->iplt->output_offset
13883
                             + ent->plt.offset);
13884
            rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
13885
            rela.r_addend = (h->root.u.def.value
13886
                             + h->root.u.def.section->output_offset
13887
                             + h->root.u.def.section->output_section->vma
13888
                             + ent->addend);
13889
            loc = (htab->reliplt->contents
13890
                   + (htab->reliplt->reloc_count++
13891
                      * sizeof (Elf64_External_Rela)));
13892
          }
13893
        else
13894
          {
13895
            rela.r_offset = (htab->plt->output_section->vma
13896
                             + htab->plt->output_offset
13897
                             + ent->plt.offset);
13898
            rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
13899
            rela.r_addend = ent->addend;
13900
            loc = (htab->relplt->contents
13901
                   + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE)
13902
                      / (PLT_ENTRY_SIZE / sizeof (Elf64_External_Rela))));
13903
          }
13904
        bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
13905
      }
13906
 
13907
  if (h->needs_copy)
13908
    {
13909
      /* This symbol needs a copy reloc.  Set it up.  */
13910
 
13911
      if (h->dynindx == -1
13912
          || (h->root.type != bfd_link_hash_defined
13913
              && h->root.type != bfd_link_hash_defweak)
13914
          || htab->relbss == NULL)
13915
        abort ();
13916
 
13917
      rela.r_offset = (h->root.u.def.value
13918
                       + h->root.u.def.section->output_section->vma
13919
                       + h->root.u.def.section->output_offset);
13920
      rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
13921
      rela.r_addend = 0;
13922
      loc = htab->relbss->contents;
13923
      loc += htab->relbss->reloc_count++ * sizeof (Elf64_External_Rela);
13924
      bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
13925
    }
13926
 
13927
  /* Mark some specially defined symbols as absolute.  */
13928
  if (strcmp (h->root.root.string, "_DYNAMIC") == 0)
13929
    sym->st_shndx = SHN_ABS;
13930
 
13931
  return TRUE;
13932
}
13933
 
13934
/* Used to decide how to sort relocs in an optimal manner for the
13935
   dynamic linker, before writing them out.  */
13936
 
13937
static enum elf_reloc_type_class
13938
ppc64_elf_reloc_type_class (const Elf_Internal_Rela *rela)
13939
{
13940
  enum elf_ppc64_reloc_type r_type;
13941
 
13942
  r_type = ELF64_R_TYPE (rela->r_info);
13943
  switch (r_type)
13944
    {
13945
    case R_PPC64_RELATIVE:
13946
      return reloc_class_relative;
13947
    case R_PPC64_JMP_SLOT:
13948
      return reloc_class_plt;
13949
    case R_PPC64_COPY:
13950
      return reloc_class_copy;
13951
    default:
13952
      return reloc_class_normal;
13953
    }
13954
}
13955
 
13956
/* Finish up the dynamic sections.  */
13957
 
13958
static bfd_boolean
13959
ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
13960
                                   struct bfd_link_info *info)
13961
{
13962
  struct ppc_link_hash_table *htab;
13963
  bfd *dynobj;
13964
  asection *sdyn;
13965
 
13966
  htab = ppc_hash_table (info);
13967
  if (htab == NULL)
13968
    return FALSE;
13969
 
13970
  dynobj = htab->elf.dynobj;
13971
  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
13972
 
13973
  if (htab->elf.dynamic_sections_created)
13974
    {
13975
      Elf64_External_Dyn *dyncon, *dynconend;
13976
 
13977
      if (sdyn == NULL || htab->got == NULL)
13978
        abort ();
13979
 
13980
      dyncon = (Elf64_External_Dyn *) sdyn->contents;
13981
      dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
13982
      for (; dyncon < dynconend; dyncon++)
13983
        {
13984
          Elf_Internal_Dyn dyn;
13985
          asection *s;
13986
 
13987
          bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
13988
 
13989
          switch (dyn.d_tag)
13990
            {
13991
            default:
13992
              continue;
13993
 
13994
            case DT_PPC64_GLINK:
13995
              s = htab->glink;
13996
              dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
13997
              /* We stupidly defined DT_PPC64_GLINK to be the start
13998
                 of glink rather than the first entry point, which is
13999
                 what ld.so needs, and now have a bigger stub to
14000
                 support automatic multiple TOCs.  */
14001
              dyn.d_un.d_ptr += GLINK_CALL_STUB_SIZE - 32;
14002
              break;
14003
 
14004
            case DT_PPC64_OPD:
14005
              s = bfd_get_section_by_name (output_bfd, ".opd");
14006
              if (s == NULL)
14007
                continue;
14008
              dyn.d_un.d_ptr = s->vma;
14009
              break;
14010
 
14011
            case DT_PPC64_OPDSZ:
14012
              s = bfd_get_section_by_name (output_bfd, ".opd");
14013
              if (s == NULL)
14014
                continue;
14015
              dyn.d_un.d_val = s->size;
14016
              break;
14017
 
14018
            case DT_PLTGOT:
14019
              s = htab->plt;
14020
              dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
14021
              break;
14022
 
14023
            case DT_JMPREL:
14024
              s = htab->relplt;
14025
              dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
14026
              break;
14027
 
14028
            case DT_PLTRELSZ:
14029
              dyn.d_un.d_val = htab->relplt->size;
14030
              break;
14031
 
14032
            case DT_RELASZ:
14033
              /* Don't count procedure linkage table relocs in the
14034
                 overall reloc count.  */
14035
              s = htab->relplt;
14036
              if (s == NULL)
14037
                continue;
14038
              dyn.d_un.d_val -= s->size;
14039
              break;
14040
 
14041
            case DT_RELA:
14042
              /* We may not be using the standard ELF linker script.
14043
                 If .rela.plt is the first .rela section, we adjust
14044
                 DT_RELA to not include it.  */
14045
              s = htab->relplt;
14046
              if (s == NULL)
14047
                continue;
14048
              if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
14049
                continue;
14050
              dyn.d_un.d_ptr += s->size;
14051
              break;
14052
            }
14053
 
14054
          bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
14055
        }
14056
    }
14057
 
14058
  if (htab->got != NULL && htab->got->size != 0)
14059
    {
14060
      /* Fill in the first entry in the global offset table.
14061
         We use it to hold the link-time TOCbase.  */
14062
      bfd_put_64 (output_bfd,
14063
                  elf_gp (output_bfd) + TOC_BASE_OFF,
14064
                  htab->got->contents);
14065
 
14066
      /* Set .got entry size.  */
14067
      elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 8;
14068
    }
14069
 
14070
  if (htab->plt != NULL && htab->plt->size != 0)
14071
    {
14072
      /* Set .plt entry size.  */
14073
      elf_section_data (htab->plt->output_section)->this_hdr.sh_entsize
14074
        = PLT_ENTRY_SIZE;
14075
    }
14076
 
14077
  /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
14078
     brlt ourselves if emitrelocations.  */
14079
  if (htab->brlt != NULL
14080
      && htab->brlt->reloc_count != 0
14081
      && !_bfd_elf_link_output_relocs (output_bfd,
14082
                                       htab->brlt,
14083
                                       elf_section_data (htab->brlt)->rela.hdr,
14084
                                       elf_section_data (htab->brlt)->relocs,
14085
                                       NULL))
14086
    return FALSE;
14087
 
14088
  if (htab->glink != NULL
14089
      && htab->glink->reloc_count != 0
14090
      && !_bfd_elf_link_output_relocs (output_bfd,
14091
                                       htab->glink,
14092
                                       elf_section_data (htab->glink)->rela.hdr,
14093
                                       elf_section_data (htab->glink)->relocs,
14094
                                       NULL))
14095
    return FALSE;
14096
 
14097 161 khays
 
14098
  if (htab->glink_eh_frame != NULL
14099
      && htab->glink_eh_frame->sec_info_type == ELF_INFO_TYPE_EH_FRAME
14100
      && !_bfd_elf_write_section_eh_frame (output_bfd, info,
14101
                                           htab->glink_eh_frame,
14102
                                           htab->glink_eh_frame->contents))
14103
    return FALSE;
14104
 
14105 14 khays
  /* We need to handle writing out multiple GOT sections ourselves,
14106
     since we didn't add them to DYNOBJ.  We know dynobj is the first
14107
     bfd.  */
14108
  while ((dynobj = dynobj->link_next) != NULL)
14109
    {
14110
      asection *s;
14111
 
14112
      if (!is_ppc64_elf (dynobj))
14113
        continue;
14114
 
14115
      s = ppc64_elf_tdata (dynobj)->got;
14116
      if (s != NULL
14117
          && s->size != 0
14118
          && s->output_section != bfd_abs_section_ptr
14119
          && !bfd_set_section_contents (output_bfd, s->output_section,
14120
                                        s->contents, s->output_offset,
14121
                                        s->size))
14122
        return FALSE;
14123
      s = ppc64_elf_tdata (dynobj)->relgot;
14124
      if (s != NULL
14125
          && s->size != 0
14126
          && s->output_section != bfd_abs_section_ptr
14127
          && !bfd_set_section_contents (output_bfd, s->output_section,
14128
                                        s->contents, s->output_offset,
14129
                                        s->size))
14130
        return FALSE;
14131
    }
14132
 
14133
  return TRUE;
14134
}
14135
 
14136
#include "elf64-target.h"
14137 166 khays
 
14138
/* FreeBSD support */
14139
 
14140
#undef  TARGET_LITTLE_SYM
14141
#undef  TARGET_LITTLE_NAME
14142
 
14143
#undef  TARGET_BIG_SYM
14144
#define TARGET_BIG_SYM  bfd_elf64_powerpc_freebsd_vec
14145
#undef  TARGET_BIG_NAME
14146
#define TARGET_BIG_NAME "elf64-powerpc-freebsd"
14147
 
14148
#undef  ELF_OSABI
14149
#define ELF_OSABI       ELFOSABI_FREEBSD
14150
 
14151
#undef  elf64_bed
14152
#define elf64_bed       elf64_powerpc_fbsd_bed
14153
 
14154
#include "elf64-target.h"
14155
 

powered by: WebSVN 2.1.0

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