Coverage Report

Created: 2023-06-29 07:05

/src/binutils-gdb/bfd/coff64-rs6000.c
Line
Count
Source (jump to first uncovered line)
1
/* BFD back-end for IBM RS/6000 "XCOFF64" files.
2
   Copyright (C) 2000-2023 Free Software Foundation, Inc.
3
   Written Clinton Popetz.
4
   Contributed by Cygnus Support.
5
6
   This file is part of BFD, the Binary File Descriptor library.
7
8
   This program is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 3 of the License, or
11
   (at your option) any later version.
12
13
   This program is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
18
   You should have received a copy of the GNU General Public License
19
   along with this program; if not, write to the Free Software
20
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21
   MA 02110-1301, USA.  */
22
23
#include "sysdep.h"
24
#include "bfd.h"
25
#include "bfdlink.h"
26
#include "libbfd.h"
27
#include "coff/internal.h"
28
#include "coff/xcoff.h"
29
#include "coff/rs6k64.h"
30
#include "libcoff.h"
31
#include "libxcoff.h"
32
33
0
#define GET_FILEHDR_SYMPTR H_GET_64
34
0
#define PUT_FILEHDR_SYMPTR H_PUT_64
35
0
#define GET_AOUTHDR_DATA_START H_GET_64
36
0
#define PUT_AOUTHDR_DATA_START H_PUT_64
37
0
#define GET_AOUTHDR_TEXT_START H_GET_64
38
0
#define PUT_AOUTHDR_TEXT_START H_PUT_64
39
0
#define GET_AOUTHDR_TSIZE H_GET_64
40
0
#define PUT_AOUTHDR_TSIZE H_PUT_64
41
0
#define GET_AOUTHDR_DSIZE H_GET_64
42
0
#define PUT_AOUTHDR_DSIZE H_PUT_64
43
0
#define GET_AOUTHDR_BSIZE H_GET_64
44
0
#define PUT_AOUTHDR_BSIZE H_PUT_64
45
0
#define GET_AOUTHDR_ENTRY H_GET_64
46
0
#define PUT_AOUTHDR_ENTRY H_PUT_64
47
0
#define GET_SCNHDR_PADDR H_GET_64
48
0
#define PUT_SCNHDR_PADDR H_PUT_64
49
0
#define GET_SCNHDR_VADDR H_GET_64
50
0
#define PUT_SCNHDR_VADDR H_PUT_64
51
0
#define GET_SCNHDR_SIZE H_GET_64
52
0
#define PUT_SCNHDR_SIZE H_PUT_64
53
0
#define GET_SCNHDR_SCNPTR H_GET_64
54
0
#define PUT_SCNHDR_SCNPTR H_PUT_64
55
0
#define GET_SCNHDR_RELPTR H_GET_64
56
0
#define PUT_SCNHDR_RELPTR H_PUT_64
57
0
#define GET_SCNHDR_LNNOPTR H_GET_64
58
0
#define PUT_SCNHDR_LNNOPTR H_PUT_64
59
0
#define GET_SCNHDR_NRELOC H_GET_32
60
0
#define MAX_SCNHDR_NRELOC 0xffffffff
61
0
#define PUT_SCNHDR_NRELOC H_PUT_32
62
0
#define GET_SCNHDR_NLNNO H_GET_32
63
0
#define MAX_SCNHDR_NLNNO 0xffffffff
64
0
#define PUT_SCNHDR_NLNNO H_PUT_32
65
#define GET_RELOC_VADDR H_GET_64
66
#define PUT_RELOC_VADDR H_PUT_64
67
68
#define COFF_FORCE_SYMBOLS_IN_STRINGS
69
#define COFF_DEBUG_STRING_WIDE_PREFIX
70
71
72
#define COFF_ADJUST_SCNHDR_OUT_POST(ABFD, INT, EXT)     \
73
0
  do                  \
74
0
    {                 \
75
0
      memset (((SCNHDR *) EXT)->s_pad, 0,       \
76
0
        sizeof (((SCNHDR *) EXT)->s_pad));      \
77
0
    }                  \
78
0
  while (0)
79
80
#define NO_COFF_LINENOS
81
82
#define coff_SWAP_lineno_in _bfd_xcoff64_swap_lineno_in
83
#define coff_SWAP_lineno_out _bfd_xcoff64_swap_lineno_out
84
85
static void _bfd_xcoff64_swap_lineno_in
86
  (bfd *, void *, void *);
87
static unsigned int _bfd_xcoff64_swap_lineno_out
88
  (bfd *, void *, void *);
89
static bool _bfd_xcoff64_put_symbol_name
90
  (struct bfd_link_info *, struct bfd_strtab_hash *,
91
   struct internal_syment *, const char *);
92
static bool _bfd_xcoff64_put_ldsymbol_name
93
  (bfd *, struct xcoff_loader_info *, struct internal_ldsym *, const char *);
94
static void _bfd_xcoff64_swap_sym_in
95
  (bfd *, void *, void *);
96
static unsigned int _bfd_xcoff64_swap_sym_out
97
  (bfd *, void *, void *);
98
static void _bfd_xcoff64_swap_aux_in
99
  (bfd *, void *, int, int, int, int, void *);
100
static unsigned int _bfd_xcoff64_swap_aux_out
101
  (bfd *, void *, int, int, int, int, void *);
102
static void xcoff64_swap_reloc_in
103
  (bfd *, void *, void *);
104
static unsigned int xcoff64_swap_reloc_out
105
  (bfd *, void *, void *);
106
extern bool _bfd_xcoff_mkobject
107
  (bfd *);
108
extern bool _bfd_xcoff_copy_private_bfd_data
109
  (bfd *, bfd *);
110
extern bool _bfd_xcoff_is_local_label_name
111
  (bfd *, const char *);
112
extern void xcoff64_rtype2howto
113
  (arelent *, struct internal_reloc *);
114
extern reloc_howto_type * xcoff64_reloc_type_lookup
115
  (bfd *, bfd_reloc_code_real_type);
116
extern bool _bfd_xcoff_slurp_armap
117
  (bfd *);
118
extern void *_bfd_xcoff_read_ar_hdr
119
  (bfd *);
120
extern bfd *_bfd_xcoff_openr_next_archived_file
121
  (bfd *, bfd *);
122
extern int _bfd_xcoff_stat_arch_elt
123
  (bfd *, struct stat *);
124
extern bool _bfd_xcoff_write_armap
125
  (bfd *, unsigned int, struct orl *, unsigned int, int);
126
extern bool _bfd_xcoff_write_archive_contents
127
  (bfd *);
128
extern int _bfd_xcoff_sizeof_headers
129
  (bfd *, struct bfd_link_info *);
130
extern void _bfd_xcoff_swap_sym_in
131
  (bfd *, void *, void *);
132
extern unsigned int _bfd_xcoff_swap_sym_out
133
  (bfd *, void *, void *);
134
extern void _bfd_xcoff_swap_aux_in
135
  (bfd *, void *, int, int, int, int, void *);
136
extern unsigned int _bfd_xcoff_swap_aux_out
137
  (bfd *, void *, int, int, int, int, void *);
138
static void xcoff64_swap_ldhdr_in
139
  (bfd *, const void *, struct internal_ldhdr *);
140
static void xcoff64_swap_ldhdr_out
141
  (bfd *, const struct internal_ldhdr *, void *d);
142
static void xcoff64_swap_ldsym_in
143
  (bfd *, const void *, struct internal_ldsym *);
144
static void xcoff64_swap_ldsym_out
145
  (bfd *, const struct internal_ldsym *, void *d);
146
static void xcoff64_swap_ldrel_in
147
  (bfd *, const void *, struct internal_ldrel *);
148
static void xcoff64_swap_ldrel_out
149
  (bfd *, const struct internal_ldrel *, void *d);
150
static bool xcoff64_ppc_relocate_section
151
  (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
152
   struct internal_reloc *, struct internal_syment *,
153
   asection **);
154
static bool xcoff64_slurp_armap
155
  (bfd *);
156
static bfd_cleanup xcoff64_archive_p
157
  (bfd *);
158
static bfd *xcoff64_openr_next_archived_file
159
  (bfd *, bfd *);
160
static int xcoff64_sizeof_headers
161
  (bfd *, struct bfd_link_info *);
162
static asection *xcoff64_create_csect_from_smclas
163
  (bfd *, union internal_auxent *, const char *);
164
static bool xcoff64_is_lineno_count_overflow
165
  (bfd *, bfd_vma);
166
static bool xcoff64_is_reloc_count_overflow
167
  (bfd *, bfd_vma);
168
static bfd_vma xcoff64_loader_symbol_offset
169
  (bfd *, struct internal_ldhdr *);
170
static bfd_vma xcoff64_loader_reloc_offset
171
  (bfd *, struct internal_ldhdr *);
172
static bool xcoff64_generate_rtinit
173
  (bfd *, const char *, const char *, bool);
174
static bool xcoff64_bad_format_hook
175
  (bfd *, void *);
176
177
/* Relocation functions */
178
static xcoff_reloc_function xcoff64_reloc_type_br;
179
180
xcoff_reloc_function *const
181
xcoff64_calculate_relocation[XCOFF_MAX_CALCULATE_RELOCATION] =
182
{
183
  xcoff_reloc_type_pos,  /* R_POS     (0x00) */
184
  xcoff_reloc_type_neg,  /* R_NEG     (0x01) */
185
  xcoff_reloc_type_rel,  /* R_REL     (0x02) */
186
  xcoff_reloc_type_toc,  /* R_TOC     (0x03) */
187
  xcoff_reloc_type_toc,  /* R_TRL     (0x04) */
188
  xcoff_reloc_type_toc,  /* R_GL      (0x05) */
189
  xcoff_reloc_type_toc,  /* R_TCL     (0x06) */
190
  xcoff_reloc_type_fail, /*           (0x07) */
191
  xcoff_reloc_type_ba,   /* R_BA      (0x08) */
192
  xcoff_reloc_type_fail, /*           (0x09) */
193
  xcoff64_reloc_type_br, /* R_BR      (0x0a) */
194
  xcoff_reloc_type_fail, /*           (0x0b) */
195
  xcoff_reloc_type_pos,  /* R_RL      (0x0c) */
196
  xcoff_reloc_type_pos,  /* R_RLA     (0x0d) */
197
  xcoff_reloc_type_fail, /*           (0x0e) */
198
  xcoff_reloc_type_noop, /* R_REF     (0x0f) */
199
  xcoff_reloc_type_fail, /*           (0x10) */
200
  xcoff_reloc_type_fail, /*           (0x11) */
201
  xcoff_reloc_type_fail, /*           (0x12) */
202
  xcoff_reloc_type_toc,  /* R_TRLA    (0x13) */
203
  xcoff_reloc_type_fail, /* R_RRTBI   (0x14) */
204
  xcoff_reloc_type_fail, /* R_RRTBA   (0x15) */
205
  xcoff_reloc_type_ba,   /* R_CAI     (0x16) */
206
  xcoff_reloc_type_crel, /* R_CREL    (0x17) */
207
  xcoff_reloc_type_ba,   /* R_RBA     (0x18) */
208
  xcoff_reloc_type_ba,   /* R_RBAC    (0x19) */
209
  xcoff64_reloc_type_br, /* R_RBR     (0x1a) */
210
  xcoff_reloc_type_ba,   /* R_RBRC    (0x1b) */
211
  xcoff_reloc_type_fail, /*           (0x1c) */
212
  xcoff_reloc_type_fail, /*           (0x1d) */
213
  xcoff_reloc_type_fail, /*           (0x1e) */
214
  xcoff_reloc_type_fail, /*           (0x1f) */
215
  xcoff_reloc_type_tls,  /* R_TLS     (0x20) */
216
  xcoff_reloc_type_tls,  /* R_TLS_IE  (0x21) */
217
  xcoff_reloc_type_tls,  /* R_TLS_LD  (0x22) */
218
  xcoff_reloc_type_tls,  /* R_TLS_LE  (0x23) */
219
  xcoff_reloc_type_tls,  /* R_TLSM    (0x24) */
220
  xcoff_reloc_type_tls,  /* R_TLSML   (0x25) */
221
  xcoff_reloc_type_fail, /*           (0x26) */
222
  xcoff_reloc_type_fail, /*           (0x27) */
223
  xcoff_reloc_type_fail, /*           (0x28) */
224
  xcoff_reloc_type_fail, /*           (0x29) */
225
  xcoff_reloc_type_fail, /*           (0x2a) */
226
  xcoff_reloc_type_fail, /*           (0x2b) */
227
  xcoff_reloc_type_fail, /*           (0x2c) */
228
  xcoff_reloc_type_fail, /*           (0x2d) */
229
  xcoff_reloc_type_fail, /*           (0x2e) */
230
  xcoff_reloc_type_fail, /*           (0x2f) */
231
  xcoff_reloc_type_toc, /* R_TOCU    (0x30) */
232
  xcoff_reloc_type_toc, /* R_TOCL    (0x31) */
233
};
234
235
/* coffcode.h needs these to be defined.  */
236
/* Internalcoff.h and coffcode.h modify themselves based on these flags.  */
237
#define XCOFF64
238
#define RS6000COFF_C 1
239
240
#define SELECT_RELOC(internal, howto)         \
241
0
  {                 \
242
0
    internal.r_type = howto->type;          \
243
0
    internal.r_size =             \
244
0
      ((howto->complain_on_overflow == complain_overflow_signed    \
245
0
  ? 0x80                \
246
0
  : 0)               \
247
0
       | (howto->bitsize - 1));           \
248
0
  }
249
250
0
#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3)
251
#define COFF_LONG_FILENAMES
252
#define NO_COFF_SYMBOLS
253
0
#define RTYPE2HOWTO(cache_ptr, dst) xcoff64_rtype2howto (cache_ptr, dst)
254
0
#define coff_mkobject _bfd_xcoff_mkobject
255
#define coff_bfd_copy_private_bfd_data _bfd_xcoff_copy_private_bfd_data
256
#define coff_bfd_is_local_label_name _bfd_xcoff_is_local_label_name
257
#define coff_bfd_reloc_type_lookup xcoff64_reloc_type_lookup
258
#define coff_bfd_reloc_name_lookup xcoff64_reloc_name_lookup
259
#ifdef AIX_CORE
260
extern bfd_cleanup rs6000coff_core_p
261
  (bfd *abfd);
262
extern bool rs6000coff_core_file_matches_executable_p
263
  (bfd *cbfd, bfd *ebfd);
264
extern char *rs6000coff_core_file_failing_command
265
  (bfd *abfd);
266
extern int rs6000coff_core_file_failing_signal
267
  (bfd *abfd);
268
#define CORE_FILE_P rs6000coff_core_p
269
#define coff_core_file_failing_command \
270
  rs6000coff_core_file_failing_command
271
#define coff_core_file_failing_signal \
272
  rs6000coff_core_file_failing_signal
273
#define coff_core_file_matches_executable_p \
274
  rs6000coff_core_file_matches_executable_p
275
#define coff_core_file_pid \
276
  _bfd_nocore_core_file_pid
277
#else
278
#define CORE_FILE_P _bfd_dummy_target
279
#define coff_core_file_failing_command \
280
  _bfd_nocore_core_file_failing_command
281
#define coff_core_file_failing_signal \
282
  _bfd_nocore_core_file_failing_signal
283
#define coff_core_file_matches_executable_p \
284
  _bfd_nocore_core_file_matches_executable_p
285
#define coff_core_file_pid \
286
  _bfd_nocore_core_file_pid
287
#endif
288
#define coff_SWAP_sym_in _bfd_xcoff64_swap_sym_in
289
#define coff_SWAP_sym_out _bfd_xcoff64_swap_sym_out
290
#define coff_SWAP_aux_in _bfd_xcoff64_swap_aux_in
291
#define coff_SWAP_aux_out _bfd_xcoff64_swap_aux_out
292
#define coff_swap_reloc_in xcoff64_swap_reloc_in
293
0
#define coff_swap_reloc_out xcoff64_swap_reloc_out
294
#define NO_COFF_RELOCS
295
296
#ifndef bfd_pe_print_pdata
297
#define bfd_pe_print_pdata  NULL
298
#endif
299
300
#include "coffcode.h"
301
302
/* For XCOFF64, the effective width of symndx changes depending on
303
   whether we are the first entry.  Sigh.  */
304
static void
305
_bfd_xcoff64_swap_lineno_in (bfd *abfd, void *ext1, void *in1)
306
0
{
307
0
  LINENO *ext = (LINENO *) ext1;
308
0
  struct internal_lineno *in = (struct internal_lineno *) in1;
309
310
0
  in->l_lnno = H_GET_32 (abfd, (ext->l_lnno));
311
0
  if (in->l_lnno == 0)
312
0
    in->l_addr.l_symndx = H_GET_32 (abfd, ext->l_addr.l_symndx);
313
0
  else
314
0
    in->l_addr.l_paddr = H_GET_64 (abfd, ext->l_addr.l_paddr);
315
0
}
316
317
static unsigned int
318
_bfd_xcoff64_swap_lineno_out (bfd *abfd, void *inp, void *outp)
319
0
{
320
0
  struct internal_lineno *in = (struct internal_lineno *) inp;
321
0
  struct external_lineno *ext = (struct external_lineno *) outp;
322
323
0
  H_PUT_32 (abfd, in->l_addr.l_symndx, ext->l_addr.l_symndx);
324
0
  H_PUT_32 (abfd, in->l_lnno, (ext->l_lnno));
325
326
0
  if (in->l_lnno == 0)
327
0
    H_PUT_32 (abfd, in->l_addr.l_symndx, ext->l_addr.l_symndx);
328
0
  else
329
0
    H_PUT_64 (abfd, in->l_addr.l_paddr, ext->l_addr.l_paddr);
330
331
0
  return bfd_coff_linesz (abfd);
332
0
}
333
334
static void
335
_bfd_xcoff64_swap_sym_in (bfd *abfd, void *ext1, void *in1)
336
0
{
337
0
  struct external_syment *ext = (struct external_syment *) ext1;
338
0
  struct internal_syment *in = (struct internal_syment *) in1;
339
340
0
  in->_n._n_n._n_zeroes = 0;
341
0
  in->_n._n_n._n_offset = H_GET_32 (abfd, ext->e_offset);
342
0
  in->n_value = H_GET_64 (abfd, ext->e_value);
343
0
  in->n_scnum = (short) H_GET_16 (abfd, ext->e_scnum);
344
0
  in->n_type = H_GET_16 (abfd, ext->e_type);
345
0
  in->n_sclass = H_GET_8 (abfd, ext->e_sclass);
346
0
  in->n_numaux = H_GET_8 (abfd, ext->e_numaux);
347
0
}
348
349
static unsigned int
350
_bfd_xcoff64_swap_sym_out (bfd *abfd, void *inp, void *extp)
351
0
{
352
0
  struct internal_syment *in = (struct internal_syment *) inp;
353
0
  struct external_syment *ext = (struct external_syment *) extp;
354
355
0
  H_PUT_32 (abfd, in->_n._n_n._n_offset, ext->e_offset);
356
0
  H_PUT_64 (abfd, in->n_value, ext->e_value);
357
0
  H_PUT_16 (abfd, in->n_scnum, ext->e_scnum);
358
0
  H_PUT_16 (abfd, in->n_type, ext->e_type);
359
0
  H_PUT_8 (abfd, in->n_sclass, ext->e_sclass);
360
0
  H_PUT_8 (abfd, in->n_numaux, ext->e_numaux);
361
0
  return bfd_coff_symesz (abfd);
362
0
}
363
364
static void
365
_bfd_xcoff64_swap_aux_in (bfd *abfd, void *ext1, int type ATTRIBUTE_UNUSED,
366
        int in_class, int indx, int numaux, void *in1)
367
0
{
368
0
  union external_auxent *ext = (union external_auxent *) ext1;
369
0
  union internal_auxent *in = (union internal_auxent *) in1;
370
0
  unsigned char auxtype;
371
372
0
  switch (in_class)
373
0
    {
374
0
    default:
375
0
      _bfd_error_handler
376
  /* xgettext: c-format */
377
0
  (_("%pB: unsupported swap_aux_in for storage class %#x"),
378
0
   abfd, (unsigned int) in_class);
379
0
      bfd_set_error (bfd_error_bad_value);
380
0
      break;
381
382
0
    case C_FILE:
383
0
      auxtype = H_GET_8 (abfd, ext->x_file.x_auxtype);
384
0
      if (auxtype != _AUX_FILE)
385
0
  goto error;
386
387
0
      if (ext->x_file.x_n.x_n.x_zeroes[0] == 0)
388
0
  {
389
0
    in->x_file.x_n.x_n.x_zeroes = 0;
390
0
    in->x_file.x_n.x_n.x_offset =
391
0
      H_GET_32 (abfd, ext->x_file.x_n.x_n.x_offset);
392
0
  }
393
0
      else
394
0
  memcpy (in->x_file.x_n.x_fname, ext->x_file.x_n.x_fname, FILNMLEN);
395
0
      in->x_file.x_ftype = H_GET_8 (abfd, ext->x_file.x_ftype);
396
0
      break;
397
398
      /* RS/6000 "csect" auxents.
399
         There is always a CSECT auxiliary entry. But functions can
400
         have FCN and EXCEPT ones too. In this case, CSECT is always the last
401
         one.
402
         For now, we only support FCN types.  */
403
0
    case C_EXT:
404
0
    case C_AIX_WEAKEXT:
405
0
    case C_HIDEXT:
406
0
      if (indx + 1 == numaux)
407
0
  {
408
    /* C_EXT can have several aux enties. But the _AUX_CSECT is always
409
       the last one.  */
410
0
    auxtype = H_GET_8 (abfd, ext->x_csect.x_auxtype);
411
0
    if (auxtype != _AUX_CSECT)
412
0
      goto error;
413
414
0
    bfd_vma h = H_GET_32 (abfd, ext->x_csect.x_scnlen_hi);
415
0
    bfd_vma l = H_GET_32 (abfd, ext->x_csect.x_scnlen_lo);
416
417
0
    in->x_csect.x_scnlen.u64 = h << 32 | (l & 0xffffffff);
418
419
0
    in->x_csect.x_parmhash = H_GET_32 (abfd, ext->x_csect.x_parmhash);
420
0
    in->x_csect.x_snhash = H_GET_16 (abfd, ext->x_csect.x_snhash);
421
    /* We don't have to hack bitfields in x_smtyp because it's
422
       defined by shifts-and-ands, which are equivalent on all
423
       byte orders.  */
424
0
    in->x_csect.x_smtyp = H_GET_8 (abfd, ext->x_csect.x_smtyp);
425
0
    in->x_csect.x_smclas = H_GET_8 (abfd, ext->x_csect.x_smclas);
426
0
  }
427
0
      else
428
0
  {
429
    /* It can also be a _AUX_EXCEPT entry. But it's not supported
430
       for now. */
431
0
    auxtype = H_GET_8 (abfd, ext->x_fcn.x_auxtype);
432
0
    if (auxtype != _AUX_FCN)
433
0
      goto error;
434
435
0
    in->x_sym.x_fcnary.x_fcn.x_lnnoptr
436
0
      = H_GET_64 (abfd, ext->x_fcn.x_lnnoptr);
437
0
    in->x_sym.x_misc.x_fsize
438
0
      = H_GET_32 (abfd, ext->x_fcn.x_fsize);
439
0
    in->x_sym.x_fcnary.x_fcn.x_endndx.u32
440
0
      = H_GET_32 (abfd, ext->x_fcn.x_endndx);
441
0
  }
442
0
      break;
443
444
0
    case C_STAT:
445
0
      _bfd_error_handler
446
  /* xgettext: c-format */
447
0
  (_("%pB: C_STAT isn't supported by XCOFF64"),
448
0
   abfd);
449
0
      bfd_set_error (bfd_error_bad_value);
450
0
      break;
451
452
0
    case C_BLOCK:
453
0
    case C_FCN:
454
0
      auxtype = H_GET_8 (abfd, ext->x_sym.x_auxtype);
455
0
      if (auxtype != _AUX_SYM)
456
0
  goto error;
457
458
0
      in->x_sym.x_misc.x_lnsz.x_lnno
459
0
  = H_GET_32 (abfd, ext->x_sym.x_lnno);
460
0
      break;
461
462
0
    case C_DWARF:
463
0
      auxtype = H_GET_8 (abfd, ext->x_sect.x_auxtype);
464
0
      if (auxtype != _AUX_SECT)
465
0
  goto error;
466
467
0
      in->x_sect.x_scnlen = H_GET_64 (abfd, ext->x_sect.x_scnlen);
468
0
      in->x_sect.x_nreloc = H_GET_64 (abfd, ext->x_sect.x_nreloc);
469
0
      break;
470
0
    }
471
472
0
  return;
473
474
0
 error:
475
0
  _bfd_error_handler
476
    /* xgettext: c-format */
477
0
    (_("%pB: wrong auxtype %#x for storage class %#x"),
478
0
     abfd, auxtype, (unsigned int) in_class);
479
0
  bfd_set_error (bfd_error_bad_value);
480
481
482
0
}
483
484
static unsigned int
485
_bfd_xcoff64_swap_aux_out (bfd *abfd, void *inp, int type ATTRIBUTE_UNUSED,
486
         int in_class, int indx, int numaux, void *extp)
487
0
{
488
0
  union internal_auxent *in = (union internal_auxent *) inp;
489
0
  union external_auxent *ext = (union external_auxent *) extp;
490
491
0
  memset (ext, 0, bfd_coff_auxesz (abfd));
492
0
  switch (in_class)
493
0
    {
494
0
    default:
495
0
      _bfd_error_handler
496
  /* xgettext: c-format */
497
0
  (_("%pB: unsupported swap_aux_out for storage class %#x"),
498
0
   abfd, (unsigned int) in_class);
499
0
      bfd_set_error (bfd_error_bad_value);
500
0
      break;
501
502
0
    case C_FILE:
503
0
      if (in->x_file.x_n.x_n.x_zeroes == 0)
504
0
  {
505
0
    H_PUT_32 (abfd, 0, ext->x_file.x_n.x_n.x_zeroes);
506
0
    H_PUT_32 (abfd, in->x_file.x_n.x_n.x_offset,
507
0
        ext->x_file.x_n.x_n.x_offset);
508
0
  }
509
0
      else
510
0
  memcpy (ext->x_file.x_n.x_fname, in->x_file.x_n.x_fname, FILNMLEN);
511
0
      H_PUT_8 (abfd, in->x_file.x_ftype, ext->x_file.x_ftype);
512
0
      H_PUT_8 (abfd, _AUX_FILE, ext->x_file.x_auxtype);
513
0
      break;
514
515
      /* RS/6000 "csect" auxents.
516
         There is always a CSECT auxiliary entry. But functions can
517
         have FCN and EXCEPT ones too. In this case, CSECT is always the last
518
         one.
519
         For now, we only support FCN types.  */
520
0
    case C_EXT:
521
0
    case C_AIX_WEAKEXT:
522
0
    case C_HIDEXT:
523
0
      if (indx + 1 == numaux)
524
0
  {
525
0
    bfd_vma temp;
526
527
0
    temp = in->x_csect.x_scnlen.u64 & 0xffffffff;
528
0
    H_PUT_32 (abfd, temp, ext->x_csect.x_scnlen_lo);
529
0
    temp = in->x_csect.x_scnlen.u64 >> 32;
530
0
    H_PUT_32 (abfd, temp, ext->x_csect.x_scnlen_hi);
531
0
    H_PUT_32 (abfd, in->x_csect.x_parmhash, ext->x_csect.x_parmhash);
532
0
    H_PUT_16 (abfd, in->x_csect.x_snhash, ext->x_csect.x_snhash);
533
    /* We don't have to hack bitfields in x_smtyp because it's
534
       defined by shifts-and-ands, which are equivalent on all
535
       byte orders.  */
536
0
    H_PUT_8 (abfd, in->x_csect.x_smtyp, ext->x_csect.x_smtyp);
537
0
    H_PUT_8 (abfd, in->x_csect.x_smclas, ext->x_csect.x_smclas);
538
0
    H_PUT_8 (abfd, _AUX_CSECT, ext->x_csect.x_auxtype);
539
0
  }
540
0
      else
541
0
  {
542
0
    H_PUT_64 (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr,
543
0
        ext->x_fcn.x_lnnoptr);
544
0
    H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize, ext->x_fcn.x_fsize);
545
0
    H_PUT_32 (abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.u32,
546
0
        ext->x_fcn.x_endndx);
547
0
    H_PUT_8 (abfd, _AUX_FCN, ext->x_csect.x_auxtype);
548
0
  }
549
0
      break;
550
551
0
    case C_STAT:
552
0
      _bfd_error_handler
553
  /* xgettext: c-format */
554
0
  (_("%pB: C_STAT isn't supported by XCOFF64"),
555
0
   abfd);
556
0
      bfd_set_error (bfd_error_bad_value);
557
0
      break;
558
559
0
    case C_BLOCK:
560
0
    case C_FCN:
561
0
      H_PUT_32 (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext->x_sym.x_lnno);
562
0
      H_PUT_8 (abfd, _AUX_SYM, ext->x_sym.x_auxtype);
563
0
      break;
564
565
0
    case C_DWARF:
566
0
      H_PUT_64 (abfd, in->x_sect.x_scnlen, ext->x_sect.x_scnlen);
567
0
      H_PUT_64 (abfd, in->x_sect.x_nreloc, ext->x_sect.x_nreloc);
568
0
      H_PUT_8 (abfd, _AUX_SECT, ext->x_sect.x_auxtype);
569
0
      break;
570
0
    }
571
572
0
  return bfd_coff_auxesz (abfd);
573
0
}
574
575
static bool
576
_bfd_xcoff64_put_symbol_name (struct bfd_link_info *info,
577
            struct bfd_strtab_hash *strtab,
578
            struct internal_syment *sym,
579
            const char *name)
580
0
{
581
0
  bool hash;
582
0
  bfd_size_type indx;
583
584
0
  hash = !info->traditional_format;
585
0
  indx = _bfd_stringtab_add (strtab, name, hash, false);
586
587
0
  if (indx == (bfd_size_type) -1)
588
0
    return false;
589
590
0
  sym->_n._n_n._n_zeroes = 0;
591
0
  sym->_n._n_n._n_offset = STRING_SIZE_SIZE + indx;
592
593
0
  return true;
594
0
}
595
596
static bool
597
_bfd_xcoff64_put_ldsymbol_name (bfd *abfd ATTRIBUTE_UNUSED,
598
        struct xcoff_loader_info *ldinfo,
599
        struct internal_ldsym *ldsym,
600
        const char *name)
601
0
{
602
0
  size_t len;
603
0
  len = strlen (name);
604
605
0
  if (ldinfo->string_size + len + 3 > ldinfo->string_alc)
606
0
    {
607
0
      bfd_size_type newalc;
608
0
      char *newstrings;
609
610
0
      newalc = ldinfo->string_alc * 2;
611
0
      if (newalc == 0)
612
0
  newalc = 32;
613
0
      while (ldinfo->string_size + len + 3 > newalc)
614
0
  newalc *= 2;
615
616
0
      newstrings = bfd_realloc (ldinfo->strings, newalc);
617
0
      if (newstrings == NULL)
618
0
  {
619
0
    ldinfo->failed = true;
620
0
    return false;
621
0
  }
622
0
      ldinfo->string_alc = newalc;
623
0
      ldinfo->strings = newstrings;
624
0
    }
625
626
0
  ldinfo->strings[ldinfo->string_size] = ((len + 1) >> 8) & 0xff;
627
0
  ldinfo->strings[ldinfo->string_size + 1] = ((len + 1)) & 0xff;
628
0
  strcpy (ldinfo->strings + ldinfo->string_size + 2, name);
629
0
  ldsym->_l._l_l._l_zeroes = 0;
630
0
  ldsym->_l._l_l._l_offset = ldinfo->string_size + 2;
631
0
  ldinfo->string_size += len + 3;
632
633
0
  return true;
634
0
}
635
636
/* Routines to swap information in the XCOFF .loader section.  If we
637
   ever need to write an XCOFF loader, this stuff will need to be
638
   moved to another file shared by the linker (which XCOFF calls the
639
   ``binder'') and the loader.  */
640
641
/* Swap in the ldhdr structure.  */
642
643
static void
644
xcoff64_swap_ldhdr_in (bfd *abfd,
645
           const void *s,
646
           struct internal_ldhdr *dst)
647
0
{
648
0
  const struct external_ldhdr *src = (const struct external_ldhdr *) s;
649
650
0
  dst->l_version = bfd_get_32 (abfd, src->l_version);
651
0
  dst->l_nsyms = bfd_get_32 (abfd, src->l_nsyms);
652
0
  dst->l_nreloc = bfd_get_32 (abfd, src->l_nreloc);
653
0
  dst->l_istlen = bfd_get_32 (abfd, src->l_istlen);
654
0
  dst->l_nimpid = bfd_get_32 (abfd, src->l_nimpid);
655
0
  dst->l_stlen = bfd_get_32 (abfd, src->l_stlen);
656
0
  dst->l_impoff = bfd_get_64 (abfd, src->l_impoff);
657
0
  dst->l_stoff = bfd_get_64 (abfd, src->l_stoff);
658
0
  dst->l_symoff = bfd_get_64 (abfd, src->l_symoff);
659
0
  dst->l_rldoff = bfd_get_64 (abfd, src->l_rldoff);
660
0
}
661
662
/* Swap out the ldhdr structure.  */
663
664
static void
665
xcoff64_swap_ldhdr_out (bfd *abfd, const struct internal_ldhdr *src, void *d)
666
0
{
667
0
  struct external_ldhdr *dst = (struct external_ldhdr *) d;
668
669
0
  bfd_put_32 (abfd, (bfd_vma) src->l_version, dst->l_version);
670
0
  bfd_put_32 (abfd, src->l_nsyms, dst->l_nsyms);
671
0
  bfd_put_32 (abfd, src->l_nreloc, dst->l_nreloc);
672
0
  bfd_put_32 (abfd, src->l_istlen, dst->l_istlen);
673
0
  bfd_put_32 (abfd, src->l_nimpid, dst->l_nimpid);
674
0
  bfd_put_32 (abfd, src->l_stlen, dst->l_stlen);
675
0
  bfd_put_64 (abfd, src->l_impoff, dst->l_impoff);
676
0
  bfd_put_64 (abfd, src->l_stoff, dst->l_stoff);
677
0
  bfd_put_64 (abfd, src->l_symoff, dst->l_symoff);
678
0
  bfd_put_64 (abfd, src->l_rldoff, dst->l_rldoff);
679
0
}
680
681
/* Swap in the ldsym structure.  */
682
683
static void
684
xcoff64_swap_ldsym_in (bfd *abfd, const void *s, struct internal_ldsym *dst)
685
0
{
686
0
  const struct external_ldsym *src = (const struct external_ldsym *) s;
687
  /* XCOFF64 does not use l_zeroes like XCOFF32
688
     Set the internal l_zeroes to 0 so the common 32/64 code uses l_value
689
     as an offset into the loader symbol table.  */
690
0
  dst->_l._l_l._l_zeroes = 0;
691
0
  dst->_l._l_l._l_offset = bfd_get_32 (abfd, src->l_offset);
692
0
  dst->l_value = bfd_get_64 (abfd, src->l_value);
693
0
  dst->l_scnum = bfd_get_16 (abfd, src->l_scnum);
694
0
  dst->l_smtype = bfd_get_8 (abfd, src->l_smtype);
695
0
  dst->l_smclas = bfd_get_8 (abfd, src->l_smclas);
696
0
  dst->l_ifile = bfd_get_32 (abfd, src->l_ifile);
697
0
  dst->l_parm = bfd_get_32 (abfd, src->l_parm);
698
0
}
699
700
/* Swap out the ldsym structure.  */
701
702
static void
703
xcoff64_swap_ldsym_out (bfd *abfd, const struct internal_ldsym *src, void *d)
704
0
{
705
0
  struct external_ldsym *dst = (struct external_ldsym *) d;
706
707
0
  bfd_put_64 (abfd, src->l_value, dst->l_value);
708
0
  bfd_put_32 (abfd, (bfd_vma) src->_l._l_l._l_offset, dst->l_offset);
709
0
  bfd_put_16 (abfd, (bfd_vma) src->l_scnum, dst->l_scnum);
710
0
  bfd_put_8 (abfd, src->l_smtype, dst->l_smtype);
711
0
  bfd_put_8 (abfd, src->l_smclas, dst->l_smclas);
712
0
  bfd_put_32 (abfd, src->l_ifile, dst->l_ifile);
713
0
  bfd_put_32 (abfd, src->l_parm, dst->l_parm);
714
0
}
715
716
static void
717
xcoff64_swap_reloc_in (bfd *abfd, void *s, void *d)
718
0
{
719
0
  struct external_reloc *src = (struct external_reloc *) s;
720
0
  struct internal_reloc *dst = (struct internal_reloc *) d;
721
722
0
  memset (dst, 0, sizeof (struct internal_reloc));
723
724
0
  dst->r_vaddr = bfd_get_64 (abfd, src->r_vaddr);
725
0
  dst->r_symndx = bfd_get_32 (abfd, src->r_symndx);
726
0
  dst->r_size = bfd_get_8 (abfd, src->r_size);
727
0
  dst->r_type = bfd_get_8 (abfd, src->r_type);
728
0
}
729
730
static unsigned int
731
xcoff64_swap_reloc_out (bfd *abfd, void *s, void *d)
732
0
{
733
0
  struct internal_reloc *src = (struct internal_reloc *) s;
734
0
  struct external_reloc *dst = (struct external_reloc *) d;
735
736
0
  bfd_put_64 (abfd, src->r_vaddr, dst->r_vaddr);
737
0
  bfd_put_32 (abfd, src->r_symndx, dst->r_symndx);
738
0
  bfd_put_8 (abfd, src->r_type, dst->r_type);
739
0
  bfd_put_8 (abfd, src->r_size, dst->r_size);
740
741
0
  return bfd_coff_relsz (abfd);
742
0
}
743
744
/* Swap in the ldrel structure.  */
745
746
static void
747
xcoff64_swap_ldrel_in (bfd *abfd, const void *s, struct internal_ldrel *dst)
748
0
{
749
0
  const struct external_ldrel *src = (const struct external_ldrel *) s;
750
751
0
  dst->l_vaddr = bfd_get_64 (abfd, src->l_vaddr);
752
0
  dst->l_symndx = bfd_get_32 (abfd, src->l_symndx);
753
0
  dst->l_rtype = bfd_get_16 (abfd, src->l_rtype);
754
0
  dst->l_rsecnm = bfd_get_16 (abfd, src->l_rsecnm);
755
0
}
756
757
/* Swap out the ldrel structure.  */
758
759
static void
760
xcoff64_swap_ldrel_out (bfd *abfd, const struct internal_ldrel *src, void *d)
761
0
{
762
0
  struct external_ldrel *dst = (struct external_ldrel *) d;
763
764
0
  bfd_put_64 (abfd, src->l_vaddr, dst->l_vaddr);
765
0
  bfd_put_16 (abfd, (bfd_vma) src->l_rtype, dst->l_rtype);
766
0
  bfd_put_16 (abfd, (bfd_vma) src->l_rsecnm, dst->l_rsecnm);
767
0
  bfd_put_32 (abfd, src->l_symndx, dst->l_symndx);
768
0
}
769
770
771
static bool
772
xcoff64_reloc_type_br (bfd *input_bfd,
773
           asection *input_section,
774
           bfd *output_bfd ATTRIBUTE_UNUSED,
775
           struct internal_reloc *rel,
776
           struct internal_syment *sym ATTRIBUTE_UNUSED,
777
           struct reloc_howto_struct *howto,
778
           bfd_vma val,
779
           bfd_vma addend,
780
           bfd_vma *relocation,
781
           bfd_byte *contents,
782
           struct bfd_link_info *info)
783
0
{
784
0
  struct xcoff_link_hash_entry *h;
785
0
  bfd_vma section_offset;
786
0
  struct xcoff_stub_hash_entry *stub_entry = NULL;
787
0
  enum xcoff_stub_type stub_type;
788
789
0
  if (0 > rel->r_symndx)
790
0
    return false;
791
792
0
  h = obj_xcoff_sym_hashes (input_bfd)[rel->r_symndx];
793
0
  section_offset = rel->r_vaddr - input_section->vma;
794
795
  /* If we see an R_BR or R_RBR reloc which is jumping to global
796
     linkage code, and it is followed by an appropriate cror nop
797
     instruction, we replace the cror with ld r2,40(r1).  This
798
     restores the TOC after the glink code.  Contrariwise, if the
799
     call is followed by a ld r2,40(r1), but the call is not
800
     going to global linkage code, we can replace the load with a
801
     cror.  */
802
0
  if (NULL != h
803
0
      && (bfd_link_hash_defined == h->root.type
804
0
    || bfd_link_hash_defweak == h->root.type)
805
0
      && section_offset + 8 <= input_section->size)
806
0
    {
807
0
      bfd_byte *pnext;
808
0
      unsigned long next;
809
810
0
      pnext = contents + section_offset + 4;
811
0
      next = bfd_get_32 (input_bfd, pnext);
812
813
      /* The _ptrgl function is magic.  It is used by the AIX compiler to call
814
   a function through a pointer.  */
815
0
      if (h->smclas == XMC_GL || strcmp (h->root.root.string, "._ptrgl") == 0)
816
0
  {
817
0
    if (next == 0x4def7b82      /* cror 15,15,15  */
818
0
        || next == 0x4ffffb82      /* cror 31,31,31  */
819
0
        || next == 0x60000000)     /* ori  r0,r0,0   */
820
0
      bfd_put_32 (input_bfd, 0xe8410028, pnext);  /* ld r2,40(r1) */
821
0
  }
822
0
      else
823
0
  {
824
0
    if (next == 0xe8410028)     /* ld r2,40(r1)   */
825
0
      bfd_put_32 (input_bfd, 0x60000000, pnext);  /* ori r0,r0,0    */
826
0
  }
827
0
    }
828
0
  else if (NULL != h && bfd_link_hash_undefined == h->root.type)
829
0
    {
830
      /* Normally, this relocation is against a defined symbol.  In the
831
   case where this is a partial link and the output section offset
832
   is greater than 2^25, the linker will return an invalid error
833
   message that the relocation has been truncated.  Yes it has been
834
   truncated but no it not important.  For this case, disable the
835
   overflow checking. */
836
0
      howto->complain_on_overflow = complain_overflow_dont;
837
0
    }
838
839
  /* Check if a stub is needed.  */
840
0
  stub_type = bfd_xcoff_type_of_stub (input_section, rel, val, h);
841
0
  if (stub_type != xcoff_stub_none)
842
0
    {
843
0
      asection *stub_csect;
844
845
0
      stub_entry = bfd_xcoff_get_stub_entry (input_section, h, info);
846
0
      if (stub_entry == NULL)
847
0
  {
848
0
    _bfd_error_handler (_("Unable to find the stub entry targeting %s"),
849
0
            h->root.root.string);
850
0
    bfd_set_error (bfd_error_bad_value);
851
0
    return false;
852
0
  }
853
854
0
      stub_csect = stub_entry->hcsect->root.u.def.section;
855
0
      val = (stub_entry->stub_offset
856
0
       + stub_csect->output_section->vma
857
0
       + stub_csect->output_offset);
858
0
    }
859
860
  /* The original PC-relative relocation is biased by -r_vaddr, so adding
861
     the value below will give the absolute target address.  */
862
0
  *relocation = val + addend + rel->r_vaddr;
863
864
0
  howto->src_mask &= ~3;
865
0
  howto->dst_mask = howto->src_mask;
866
867
0
  if (h != NULL
868
0
      && (h->root.type == bfd_link_hash_defined
869
0
    || h->root.type == bfd_link_hash_defweak)
870
0
      && bfd_is_abs_section (h->root.u.def.section)
871
0
      && section_offset + 4 <= input_section->size)
872
0
    {
873
0
      bfd_byte *ptr;
874
0
      bfd_vma insn;
875
876
      /* Turn the relative branch into an absolute one by setting the
877
   AA bit.  */
878
0
      ptr = contents + section_offset;
879
0
      insn = bfd_get_32 (input_bfd, ptr);
880
0
      insn |= 2;
881
0
      bfd_put_32 (input_bfd, insn, ptr);
882
883
      /* Make the howto absolute too.  */
884
0
      howto->pc_relative = false;
885
0
      howto->complain_on_overflow = complain_overflow_bitfield;
886
0
    }
887
0
  else
888
0
    {
889
      /* Use a PC-relative howto and subtract the instruction's address
890
   from the target address we calculated above.  */
891
0
      howto->pc_relative = true;
892
0
      *relocation -= (input_section->output_section->vma
893
0
          + input_section->output_offset
894
0
          + section_offset);
895
0
    }
896
0
  return true;
897
0
}
898
899
900

901
/* The XCOFF reloc table.
902
   Cf xcoff_howto_table comments.  */
903
904
reloc_howto_type xcoff64_howto_table[] =
905
{
906
  /* 0x00: Standard 64 bit relocation.  */
907
  HOWTO (R_POS,     /* type */
908
   0,     /* rightshift */
909
   8,     /* size */
910
   64,      /* bitsize */
911
   false,     /* pc_relative */
912
   0,     /* bitpos */
913
   complain_overflow_bitfield, /* complain_on_overflow */
914
   0,     /* special_function */
915
   "R_POS_64",    /* name */
916
   true,      /* partial_inplace */
917
   MINUS_ONE,   /* src_mask */
918
   MINUS_ONE,   /* dst_mask */
919
   false),    /* pcrel_offset */
920
921
  /* 0x01: 64 bit relocation, but store negative value.  */
922
  HOWTO (R_NEG,     /* type */
923
   0,     /* rightshift */
924
   -8,      /* size */
925
   64,      /* bitsize */
926
   false,     /* pc_relative */
927
   0,     /* bitpos */
928
   complain_overflow_bitfield, /* complain_on_overflow */
929
   0,     /* special_function */
930
   "R_NEG",   /* name */
931
   true,      /* partial_inplace */
932
   MINUS_ONE,   /* src_mask */
933
   MINUS_ONE,   /* dst_mask */
934
   false),    /* pcrel_offset */
935
936
  /* 0x02: 64 bit PC relative relocation.  */
937
  HOWTO (R_REL,     /* type */
938
   0,     /* rightshift */
939
   8,     /* size */
940
   64,      /* bitsize */
941
   true,      /* pc_relative */
942
   0,     /* bitpos */
943
   complain_overflow_signed, /* complain_on_overflow */
944
   0,     /* special_function */
945
   "R_REL",   /* name */
946
   true,      /* partial_inplace */
947
   MINUS_ONE,   /* src_mask */
948
   MINUS_ONE,   /* dst_mask */
949
   false),    /* pcrel_offset */
950
951
  /* 0x03: 16 bit TOC relative relocation.  */
952
  HOWTO (R_TOC,     /* type */
953
   0,     /* rightshift */
954
   2,     /* size */
955
   16,      /* bitsize */
956
   false,     /* pc_relative */
957
   0,     /* bitpos */
958
   complain_overflow_bitfield, /* complain_on_overflow */
959
   0,     /* special_function */
960
   "R_TOC",   /* name */
961
   true,      /* partial_inplace */
962
   0,     /* src_mask */
963
   0xffff,    /* dst_mask */
964
   false),    /* pcrel_offset */
965
966
  /* 0x04: Same as R_TOC.  */
967
  HOWTO (R_TRL,     /* type */
968
   0,     /* rightshift */
969
   2,     /* size */
970
   16,      /* bitsize */
971
   false,     /* pc_relative */
972
   0,     /* bitpos */
973
   complain_overflow_bitfield, /* complain_on_overflow */
974
   0,     /* special_function */
975
   "R_TRL",   /* name */
976
   true,      /* partial_inplace */
977
   0,     /* src_mask */
978
   0xffff,    /* dst_mask */
979
   false),    /* pcrel_offset */
980
981
  /* 0x05: External TOC relative symbol.  */
982
  HOWTO (R_GL,      /* type */
983
   0,     /* rightshift */
984
   2,     /* size */
985
   16,      /* bitsize */
986
   false,     /* pc_relative */
987
   0,     /* bitpos */
988
   complain_overflow_bitfield, /* complain_on_overflow */
989
   0,     /* special_function */
990
   "R_GL",    /* name */
991
   true,      /* partial_inplace */
992
   0,     /* src_mask */
993
   0xffff,    /* dst_mask */
994
   false),    /* pcrel_offset */
995
996
  /* 0x06: Local TOC relative symbol.  */
997
  HOWTO (R_TCL,     /* type */
998
   0,     /* rightshift */
999
   2,     /* size */
1000
   16,      /* bitsize */
1001
   false,     /* pc_relative */
1002
   0,     /* bitpos */
1003
   complain_overflow_bitfield, /* complain_on_overflow */
1004
   0,     /* special_function */
1005
   "R_TCL",   /* name */
1006
   true,      /* partial_inplace */
1007
   0,     /* src_mask */
1008
   0xffff,    /* dst_mask */
1009
   false),    /* pcrel_offset */
1010
1011
  EMPTY_HOWTO (7),
1012
1013
  /* 0x08: Same as R_RBA.  */
1014
  HOWTO (R_BA,      /* type */
1015
   0,     /* rightshift */
1016
   4,     /* size */
1017
   26,      /* bitsize */
1018
   false,     /* pc_relative */
1019
   0,     /* bitpos */
1020
   complain_overflow_bitfield, /* complain_on_overflow */
1021
   0,     /* special_function */
1022
   "R_BA_26",   /* name */
1023
   true,      /* partial_inplace */
1024
   0x03fffffc,    /* src_mask */
1025
   0x03fffffc,    /* dst_mask */
1026
   false),    /* pcrel_offset */
1027
1028
  EMPTY_HOWTO (9),
1029
1030
  /* 0x0a: Same as R_RBR.  */
1031
  HOWTO (R_BR,      /* type */
1032
   0,     /* rightshift */
1033
   4,     /* size */
1034
   26,      /* bitsize */
1035
   true,      /* pc_relative */
1036
   0,     /* bitpos */
1037
   complain_overflow_signed, /* complain_on_overflow */
1038
   0,     /* special_function */
1039
   "R_BR",    /* name */
1040
   true,      /* partial_inplace */
1041
   0x03fffffc,    /* src_mask */
1042
   0x03fffffc,    /* dst_mask */
1043
   false),    /* pcrel_offset */
1044
1045
  EMPTY_HOWTO (0xb),
1046
1047
  /* 0x0c: Same as R_POS.  */
1048
  HOWTO (R_RL,      /* type */
1049
   0,     /* rightshift */
1050
   8,     /* size */
1051
   64,      /* bitsize */
1052
   false,     /* pc_relative */
1053
   0,     /* bitpos */
1054
   complain_overflow_bitfield, /* complain_on_overflow */
1055
   0,     /* special_function */
1056
   "R_RL",    /* name */
1057
   true,      /* partial_inplace */
1058
   MINUS_ONE,   /* src_mask */
1059
   MINUS_ONE,   /* dst_mask */
1060
   false),    /* pcrel_offset */
1061
1062
  /* 0x0d: Same as R_POS.  */
1063
  HOWTO (R_RLA,     /* type */
1064
   0,     /* rightshift */
1065
   8,     /* size */
1066
   64,      /* bitsize */
1067
   false,     /* pc_relative */
1068
   0,     /* bitpos */
1069
   complain_overflow_bitfield, /* complain_on_overflow */
1070
   0,     /* special_function */
1071
   "R_RLA",   /* name */
1072
   true,      /* partial_inplace */
1073
   MINUS_ONE,   /* src_mask */
1074
   MINUS_ONE,   /* dst_mask */
1075
   false),    /* pcrel_offset */
1076
1077
  EMPTY_HOWTO (0xe),
1078
1079
  /* 0x0f: Non-relocating reference.  Bitsize is 1 so that r_rsize is 0.  */
1080
  HOWTO (R_REF,     /* type */
1081
   0,     /* rightshift */
1082
   1,     /* size */
1083
   1,     /* bitsize */
1084
   false,     /* pc_relative */
1085
   0,     /* bitpos */
1086
   complain_overflow_dont, /* complain_on_overflow */
1087
   0,     /* special_function */
1088
   "R_REF",   /* name */
1089
   false,     /* partial_inplace */
1090
   0,     /* src_mask */
1091
   0,     /* dst_mask */
1092
   false),    /* pcrel_offset */
1093
1094
  EMPTY_HOWTO (0x10),
1095
  EMPTY_HOWTO (0x11),
1096
  EMPTY_HOWTO (0x12),
1097
1098
  /* 0x13: Same as R_TOC  */
1099
  HOWTO (R_TRLA,    /* type */
1100
   0,     /* rightshift */
1101
   2,     /* size */
1102
   16,      /* bitsize */
1103
   false,     /* pc_relative */
1104
   0,     /* bitpos */
1105
   complain_overflow_bitfield, /* complain_on_overflow */
1106
   0,     /* special_function */
1107
   "R_TRLA",    /* name */
1108
   true,      /* partial_inplace */
1109
   0xffff,    /* src_mask */
1110
   0xffff,    /* dst_mask */
1111
   false),    /* pcrel_offset */
1112
1113
  /* 0x14: Modifiable relative branch.  */
1114
  HOWTO (R_RRTBI,   /* type */
1115
   1,     /* rightshift */
1116
   4,     /* size */
1117
   32,      /* bitsize */
1118
   false,     /* pc_relative */
1119
   0,     /* bitpos */
1120
   complain_overflow_bitfield, /* complain_on_overflow */
1121
   0,     /* special_function */
1122
   "R_RRTBI",   /* name */
1123
   true,      /* partial_inplace */
1124
   0xffffffff,    /* src_mask */
1125
   0xffffffff,    /* dst_mask */
1126
   false),    /* pcrel_offset */
1127
1128
  /* 0x15: Modifiable absolute branch.  */
1129
  HOWTO (R_RRTBA,   /* type */
1130
   1,     /* rightshift */
1131
   4,     /* size */
1132
   32,      /* bitsize */
1133
   false,     /* pc_relative */
1134
   0,     /* bitpos */
1135
   complain_overflow_bitfield, /* complain_on_overflow */
1136
   0,     /* special_function */
1137
   "R_RRTBA",   /* name */
1138
   true,      /* partial_inplace */
1139
   0xffffffff,    /* src_mask */
1140
   0xffffffff,    /* dst_mask */
1141
   false),    /* pcrel_offset */
1142
1143
  /* 0x16: Modifiable call absolute indirect.  */
1144
  HOWTO (R_CAI,     /* type */
1145
   0,     /* rightshift */
1146
   2,     /* size */
1147
   16,      /* bitsize */
1148
   false,     /* pc_relative */
1149
   0,     /* bitpos */
1150
   complain_overflow_bitfield, /* complain_on_overflow */
1151
   0,     /* special_function */
1152
   "R_CAI",   /* name */
1153
   true,      /* partial_inplace */
1154
   0xffff,    /* src_mask */
1155
   0xffff,    /* dst_mask */
1156
   false),    /* pcrel_offset */
1157
1158
  /* 0x17: Modifiable call relative.  */
1159
  HOWTO (R_CREL,    /* type */
1160
   0,     /* rightshift */
1161
   2,     /* size */
1162
   16,      /* bitsize */
1163
   false,     /* pc_relative */
1164
   0,     /* bitpos */
1165
   complain_overflow_bitfield, /* complain_on_overflow */
1166
   0,     /* special_function */
1167
   "R_CREL",    /* name */
1168
   true,      /* partial_inplace */
1169
   0xffff,    /* src_mask */
1170
   0xffff,    /* dst_mask */
1171
   false),    /* pcrel_offset */
1172
1173
  /* 0x18: Modifiable branch absolute.  */
1174
  HOWTO (R_RBA,     /* type */
1175
   0,     /* rightshift */
1176
   4,     /* size */
1177
   26,      /* bitsize */
1178
   false,     /* pc_relative */
1179
   0,     /* bitpos */
1180
   complain_overflow_bitfield, /* complain_on_overflow */
1181
   0,     /* special_function */
1182
   "R_RBA",   /* name */
1183
   true,      /* partial_inplace */
1184
   0x03fffffc,    /* src_mask */
1185
   0x03fffffc,    /* dst_mask */
1186
   false),    /* pcrel_offset */
1187
1188
  /* 0x19: Modifiable branch absolute.  */
1189
  HOWTO (R_RBAC,    /* type */
1190
   0,     /* rightshift */
1191
   4,     /* size */
1192
   32,      /* bitsize */
1193
   false,     /* pc_relative */
1194
   0,     /* bitpos */
1195
   complain_overflow_bitfield, /* complain_on_overflow */
1196
   0,     /* special_function */
1197
   "R_RBAC",    /* name */
1198
   true,      /* partial_inplace */
1199
   0xffffffff,    /* src_mask */
1200
   0xffffffff,    /* dst_mask */
1201
   false),    /* pcrel_offset */
1202
1203
  /* 0x1a: Modifiable branch relative.  */
1204
  HOWTO (R_RBR,     /* type */
1205
   0,     /* rightshift */
1206
   4,     /* size */
1207
   26,      /* bitsize */
1208
   false,     /* pc_relative */
1209
   0,     /* bitpos */
1210
   complain_overflow_signed, /* complain_on_overflow */
1211
   0,     /* special_function */
1212
   "R_RBR_26",    /* name */
1213
   true,      /* partial_inplace */
1214
   0x03fffffc,    /* src_mask */
1215
   0x03fffffc,    /* dst_mask */
1216
   false),    /* pcrel_offset */
1217
1218
  /* 0x1b: Modifiable branch absolute.  */
1219
  HOWTO (R_RBRC,    /* type */
1220
   0,     /* rightshift */
1221
   2,     /* size */
1222
   16,      /* bitsize */
1223
   false,     /* pc_relative */
1224
   0,     /* bitpos */
1225
   complain_overflow_bitfield, /* complain_on_overflow */
1226
   0,     /* special_function */
1227
   "R_RBRC",    /* name */
1228
   true,      /* partial_inplace */
1229
   0xffff,    /* src_mask */
1230
   0xffff,    /* dst_mask */
1231
   false),    /* pcrel_offset */
1232
1233
  /* 0x1c: Standard 32 bit relocation.  */
1234
  HOWTO (R_POS,     /* type */
1235
   0,     /* rightshift */
1236
   4,     /* size */
1237
   32,      /* bitsize */
1238
   false,     /* pc_relative */
1239
   0,     /* bitpos */
1240
   complain_overflow_bitfield, /* complain_on_overflow */
1241
   0,     /* special_function */
1242
   "R_POS_32",    /* name */
1243
   true,      /* partial_inplace */
1244
   0xffffffff,    /* src_mask */
1245
   0xffffffff,    /* dst_mask */
1246
   false),    /* pcrel_offset */
1247
1248
  /* 0x1d: 16 bit Non modifiable absolute branch.  */
1249
  HOWTO (R_BA,      /* type */
1250
   0,     /* rightshift */
1251
   2,     /* size */
1252
   16,      /* bitsize */
1253
   false,     /* pc_relative */
1254
   0,     /* bitpos */
1255
   complain_overflow_bitfield, /* complain_on_overflow */
1256
   0,     /* special_function */
1257
   "R_BA_16",   /* name */
1258
   true,      /* partial_inplace */
1259
   0xfffc,    /* src_mask */
1260
   0xfffc,    /* dst_mask */
1261
   false),    /* pcrel_offset */
1262
1263
  /* 0x1e: Modifiable branch relative.  */
1264
  HOWTO (R_RBR,     /* type */
1265
   0,     /* rightshift */
1266
   2,     /* size */
1267
   16,      /* bitsize */
1268
   true,      /* pc_relative */
1269
   0,     /* bitpos */
1270
   complain_overflow_signed, /* complain_on_overflow */
1271
   0,     /* special_function */
1272
   "R_RBR_16",    /* name */
1273
   true,      /* partial_inplace */
1274
   0xfffc,    /* src_mask */
1275
   0xfffc,    /* dst_mask */
1276
   false),    /* pcrel_offset */
1277
1278
  /* 0x1f: Modifiable branch absolute.  */
1279
  HOWTO (R_RBA,     /* type */
1280
   0,     /* rightshift */
1281
   2,     /* size */
1282
   16,      /* bitsize */
1283
   false,     /* pc_relative */
1284
   0,     /* bitpos */
1285
   complain_overflow_bitfield, /* complain_on_overflow */
1286
   0,     /* special_function */
1287
   "R_RBA_16",    /* name */
1288
   true,      /* partial_inplace */
1289
   0xffff,    /* src_mask */
1290
   0xffff,    /* dst_mask */
1291
   false),    /* pcrel_offset */
1292
1293
  /* 0x20: General-dynamic TLS relocation.  */
1294
  HOWTO (R_TLS,     /* type */
1295
   0,     /* rightshift */
1296
   8,     /* size */
1297
   64,      /* bitsize */
1298
   false,     /* pc_relative */
1299
   0,     /* bitpos */
1300
   complain_overflow_bitfield, /* complain_on_overflow */
1301
   0,     /* special_function */
1302
   "R_TLS",   /* name */
1303
   true,      /* partial_inplace */
1304
   MINUS_ONE,   /* src_mask */
1305
   MINUS_ONE,   /* dst_mask */
1306
   false),    /* pcrel_offset */
1307
1308
  /* 0x21: Initial-exec TLS relocation.  */
1309
  HOWTO (R_TLS_IE,    /* type */
1310
   0,     /* rightshift */
1311
   8,     /* size */
1312
   64,      /* bitsize */
1313
   false,     /* pc_relative */
1314
   0,     /* bitpos */
1315
   complain_overflow_bitfield, /* complain_on_overflow */
1316
   0,     /* special_function */
1317
   "R_TLS_IE",    /* name */
1318
   true,      /* partial_inplace */
1319
   MINUS_ONE,   /* src_mask */
1320
   MINUS_ONE,   /* dst_mask */
1321
   false),    /* pcrel_offset */
1322
1323
  /* 0x22: Local-dynamic TLS relocation.  */
1324
  HOWTO (R_TLS_LD,    /* type */
1325
   0,     /* rightshift */
1326
   8,     /* size */
1327
   64,      /* bitsize */
1328
   false,     /* pc_relative */
1329
   0,     /* bitpos */
1330
   complain_overflow_bitfield, /* complain_on_overflow */
1331
   0,     /* special_function */
1332
   "R_TLS_LD",    /* name */
1333
   true,      /* partial_inplace */
1334
   MINUS_ONE,   /* src_mask */
1335
   MINUS_ONE,   /* dst_mask */
1336
   false),    /* pcrel_offset */
1337
1338
  /* 0x23: Local-exec TLS relocation.  */
1339
  HOWTO (R_TLS_LE,    /* type */
1340
   0,     /* rightshift */
1341
   8,     /* size */
1342
   64,      /* bitsize */
1343
   false,     /* pc_relative */
1344
   0,     /* bitpos */
1345
   complain_overflow_bitfield, /* complain_on_overflow */
1346
   0,     /* special_function */
1347
   "R_TLS_LE",    /* name */
1348
   true,      /* partial_inplace */
1349
   MINUS_ONE,   /* src_mask */
1350
   MINUS_ONE,   /* dst_mask */
1351
   false),    /* pcrel_offset */
1352
1353
  /* 0x24: TLS relocation.  */
1354
  HOWTO (R_TLSM,    /* type */
1355
   0,     /* rightshift */
1356
   8,     /* size */
1357
   64,      /* bitsize */
1358
   false,     /* pc_relative */
1359
   0,     /* bitpos */
1360
   complain_overflow_bitfield, /* complain_on_overflow */
1361
   0,     /* special_function */
1362
   "R_TLSM",    /* name */
1363
   true,      /* partial_inplace */
1364
   MINUS_ONE,   /* src_mask */
1365
   MINUS_ONE,   /* dst_mask */
1366
   false),    /* pcrel_offset */
1367
1368
  /* 0x25: TLS module relocation.  */
1369
  HOWTO (R_TLSML,   /* type */
1370
   0,     /* rightshift */
1371
   8,     /* size */
1372
   64,      /* bitsize */
1373
   false,     /* pc_relative */
1374
   0,     /* bitpos */
1375
   complain_overflow_bitfield, /* complain_on_overflow */
1376
   0,     /* special_function */
1377
   "R_TLSML",   /* name */
1378
   true,      /* partial_inplace */
1379
   MINUS_ONE,   /* src_mask */
1380
   MINUS_ONE,   /* dst_mask */
1381
   false),    /* pcrel_offset */
1382
1383
  /* 0x26: 32 bit relocation, but store negative value.  */
1384
  HOWTO (R_NEG,     /* type */
1385
   0,     /* rightshift */
1386
   -4,      /* size */
1387
   32,      /* bitsize */
1388
   false,     /* pc_relative */
1389
   0,     /* bitpos */
1390
   complain_overflow_bitfield, /* complain_on_overflow */
1391
   0,     /* special_function */
1392
   "R_NEG_32",    /* name */
1393
   true,      /* partial_inplace */
1394
   MINUS_ONE,   /* src_mask */
1395
   MINUS_ONE,   /* dst_mask */
1396
   false),    /* pcrel_offset */
1397
1398
  EMPTY_HOWTO(0x27),
1399
  EMPTY_HOWTO(0x28),
1400
  EMPTY_HOWTO(0x29),
1401
  EMPTY_HOWTO(0x2a),
1402
  EMPTY_HOWTO(0x2b),
1403
  EMPTY_HOWTO(0x2c),
1404
  EMPTY_HOWTO(0x2d),
1405
  EMPTY_HOWTO(0x2e),
1406
  EMPTY_HOWTO(0x2f),
1407
1408
  HOWTO (R_TOCU,    /* type */
1409
   16,      /* rightshift */
1410
   2,     /* size */
1411
   16,      /* bitsize */
1412
   false,     /* pc_relative */
1413
   0,     /* bitpos */
1414
   complain_overflow_bitfield, /* complain_on_overflow */
1415
   0,     /* special_function */
1416
   "R_TOCU",    /* name */
1417
   true,      /* partial_inplace */
1418
   0,     /* src_mask */
1419
   0xffff,    /* dst_mask */
1420
   false),    /* pcrel_offset */
1421
1422
  /* 0x31: Low-order 16 bit TOC relative relocation.  */
1423
  HOWTO (R_TOCL,    /* type */
1424
   0,     /* rightshift */
1425
   2,     /* size */
1426
   16,      /* bitsize */
1427
   false,     /* pc_relative */
1428
   0,     /* bitpos */
1429
   complain_overflow_dont, /* complain_on_overflow */
1430
   0,     /* special_function */
1431
   "R_TOCL",    /* name */
1432
   true,      /* partial_inplace */
1433
   0,     /* src_mask */
1434
   0xffff,    /* dst_mask */
1435
   false),    /* pcrel_offset */
1436
1437
};
1438
1439
void
1440
xcoff64_rtype2howto (arelent *relent, struct internal_reloc *internal)
1441
0
{
1442
0
  if (internal->r_type > R_TOCL)
1443
0
    abort ();
1444
1445
  /* Default howto layout works most of the time */
1446
0
  relent->howto = &xcoff64_howto_table[internal->r_type];
1447
1448
  /* Special case some 16 bit reloc */
1449
0
  if (15 == (internal->r_size & 0x3f))
1450
0
    {
1451
0
      if (R_BA == internal->r_type)
1452
0
  relent->howto = &xcoff64_howto_table[0x1d];
1453
0
      else if (R_RBR == internal->r_type)
1454
0
  relent->howto = &xcoff64_howto_table[0x1e];
1455
0
      else if (R_RBA == internal->r_type)
1456
0
  relent->howto = &xcoff64_howto_table[0x1f];
1457
0
    }
1458
  /* Special case 32 bit */
1459
0
  else if (31 == (internal->r_size & 0x3f))
1460
0
    {
1461
0
      if (R_POS == internal->r_type)
1462
0
  relent->howto = &xcoff64_howto_table[0x1c];
1463
1464
0
      if (R_NEG == internal->r_type)
1465
0
  relent->howto = &xcoff64_howto_table[0x26];
1466
0
    }
1467
1468
  /* The r_size field of an XCOFF reloc encodes the bitsize of the
1469
     relocation, as well as indicating whether it is signed or not.
1470
     Doublecheck that the relocation information gathered from the
1471
     type matches this information.  The bitsize is not significant
1472
     for R_REF relocs.  */
1473
0
  if (relent->howto->dst_mask != 0
1474
0
      && (relent->howto->bitsize
1475
0
    != ((unsigned int) internal->r_size & 0x3f) + 1))
1476
0
    abort ();
1477
0
}
1478
1479
reloc_howto_type *
1480
xcoff64_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1481
         bfd_reloc_code_real_type code)
1482
0
{
1483
0
  switch (code)
1484
0
    {
1485
0
    case BFD_RELOC_PPC_B26:
1486
0
      return &xcoff64_howto_table[0xa];
1487
0
    case BFD_RELOC_PPC_BA16:
1488
0
      return &xcoff64_howto_table[0x1d];
1489
0
    case BFD_RELOC_PPC_BA26:
1490
0
      return &xcoff64_howto_table[8];
1491
0
    case BFD_RELOC_PPC_TOC16:
1492
0
      return &xcoff64_howto_table[3];
1493
0
    case BFD_RELOC_PPC_TOC16_HI:
1494
0
      return &xcoff64_howto_table[0x30];
1495
0
    case BFD_RELOC_PPC_TOC16_LO:
1496
0
      return &xcoff64_howto_table[0x31];
1497
0
    case BFD_RELOC_PPC_B16:
1498
0
      return &xcoff64_howto_table[0x1e];
1499
0
    case BFD_RELOC_32:
1500
0
    case BFD_RELOC_CTOR:
1501
0
      return &xcoff64_howto_table[0x1c];
1502
0
    case BFD_RELOC_64:
1503
0
      return &xcoff64_howto_table[0];
1504
0
    case BFD_RELOC_NONE:
1505
0
      return &xcoff64_howto_table[0xf];
1506
0
    case BFD_RELOC_PPC_NEG:
1507
0
      return &xcoff64_howto_table[0x1];
1508
0
    case BFD_RELOC_PPC64_TLSGD:
1509
0
      return &xcoff64_howto_table[0x20];
1510
0
    case BFD_RELOC_PPC64_TLSIE:
1511
0
      return &xcoff64_howto_table[0x21];
1512
0
    case BFD_RELOC_PPC64_TLSLD:
1513
0
      return &xcoff64_howto_table[0x22];
1514
0
    case BFD_RELOC_PPC64_TLSLE:
1515
0
      return &xcoff64_howto_table[0x23];
1516
0
    case BFD_RELOC_PPC64_TLSM:
1517
0
      return &xcoff64_howto_table[0x24];
1518
0
    case BFD_RELOC_PPC64_TLSML:
1519
0
      return &xcoff64_howto_table[0x25];
1520
0
    default:
1521
0
      return NULL;
1522
0
    }
1523
0
}
1524
1525
static reloc_howto_type *
1526
xcoff64_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1527
         const char *r_name)
1528
0
{
1529
0
  unsigned int i;
1530
1531
0
  for (i = 0;
1532
0
       i < sizeof (xcoff64_howto_table) / sizeof (xcoff64_howto_table[0]);
1533
0
       i++)
1534
0
    if (xcoff64_howto_table[i].name != NULL
1535
0
  && strcasecmp (xcoff64_howto_table[i].name, r_name) == 0)
1536
0
      return &xcoff64_howto_table[i];
1537
1538
0
  return NULL;
1539
0
}
1540
1541
/* This is the relocation function for the PowerPC64.
1542
   See xcoff_ppc_relocation_section for more information. */
1543
1544
bool
1545
xcoff64_ppc_relocate_section (bfd *output_bfd,
1546
            struct bfd_link_info *info,
1547
            bfd *input_bfd,
1548
            asection *input_section,
1549
            bfd_byte *contents,
1550
            struct internal_reloc *relocs,
1551
            struct internal_syment *syms,
1552
            asection **sections)
1553
0
{
1554
0
  struct internal_reloc *rel;
1555
0
  struct internal_reloc *relend;
1556
1557
0
  rel = relocs;
1558
0
  relend = rel + input_section->reloc_count;
1559
0
  for (; rel < relend; rel++)
1560
0
    {
1561
0
      long symndx;
1562
0
      struct xcoff_link_hash_entry *h;
1563
0
      struct internal_syment *sym;
1564
0
      bfd_vma addend;
1565
0
      bfd_vma val;
1566
0
      struct reloc_howto_struct howto;
1567
0
      bfd_vma relocation;
1568
0
      bfd_vma value_to_relocate;
1569
0
      bfd_vma address;
1570
0
      bfd_byte *location;
1571
1572
      /* Relocation type R_REF is a special relocation type which is
1573
   merely used to prevent garbage collection from occurring for
1574
   the csect including the symbol which it references.  */
1575
0
      if (rel->r_type == R_REF)
1576
0
  continue;
1577
1578
      /* Retrieve default value in HOWTO table and fix up according
1579
   to r_size field, if it can be different.
1580
   This should be made during relocation reading but the algorithms
1581
   are expecting constant howtos.  */
1582
0
      memcpy (&howto, &xcoff64_howto_table[rel->r_type], sizeof (howto));
1583
0
      if (howto.bitsize != (rel->r_size & 0x3f) + 1)
1584
0
  {
1585
0
    switch (rel->r_type)
1586
0
      {
1587
0
      case R_POS:
1588
0
      case R_NEG:
1589
0
        howto.bitsize = (rel->r_size & 0x3f) + 1;
1590
0
        howto.size = HOWTO_RSIZE (howto.bitsize <= 16
1591
0
          ? 2 : howto.bitsize <= 32
1592
0
          ? 4 : 8);
1593
0
        howto.src_mask = howto.dst_mask = N_ONES (howto.bitsize);
1594
0
        break;
1595
1596
0
      default:
1597
0
        _bfd_error_handler
1598
0
    (_("%pB: relocation (%d) at (0x%" PRIx64 ") has wrong"
1599
0
       " r_rsize (0x%x)\n"),
1600
0
     input_bfd, rel->r_type, rel->r_vaddr, rel->r_size);
1601
0
        return false;
1602
0
      }
1603
0
  }
1604
1605
0
      howto.complain_on_overflow = (rel->r_size & 0x80
1606
0
            ? complain_overflow_signed
1607
0
            : complain_overflow_bitfield);
1608
1609
      /* symbol */
1610
0
      val = 0;
1611
0
      addend = 0;
1612
0
      h = NULL;
1613
0
      sym = NULL;
1614
0
      symndx = rel->r_symndx;
1615
1616
0
      if (-1 != symndx)
1617
0
  {
1618
0
    asection *sec;
1619
1620
0
    h = obj_xcoff_sym_hashes (input_bfd)[symndx];
1621
0
    sym = syms + symndx;
1622
0
    addend = - sym->n_value;
1623
1624
0
    if (NULL == h)
1625
0
      {
1626
0
        sec = sections[symndx];
1627
        /* Hack to make sure we use the right TOC anchor value
1628
     if this reloc is against the TOC anchor.  */
1629
0
        if (sec->name[3] == '0'
1630
0
      && strcmp (sec->name, ".tc0") == 0)
1631
0
    val = xcoff_data (output_bfd)->toc;
1632
0
        else
1633
0
    val = (sec->output_section->vma
1634
0
           + sec->output_offset
1635
0
           + sym->n_value
1636
0
           - sec->vma);
1637
0
      }
1638
0
    else
1639
0
      {
1640
0
        if (info->unresolved_syms_in_objects != RM_IGNORE
1641
0
      && (h->flags & XCOFF_WAS_UNDEFINED) != 0)
1642
0
    info->callbacks->undefined_symbol
1643
0
      (info, h->root.root.string, input_bfd, input_section,
1644
0
       rel->r_vaddr - input_section->vma,
1645
0
       info->unresolved_syms_in_objects == RM_DIAGNOSE
1646
0
       && !info->warn_unresolved_syms);
1647
1648
0
        if (h->root.type == bfd_link_hash_defined
1649
0
      || h->root.type == bfd_link_hash_defweak)
1650
0
    {
1651
0
      sec = h->root.u.def.section;
1652
0
      val = (h->root.u.def.value
1653
0
       + sec->output_section->vma
1654
0
       + sec->output_offset);
1655
0
    }
1656
0
        else if (h->root.type == bfd_link_hash_common)
1657
0
    {
1658
0
      sec = h->root.u.c.p->section;
1659
0
      val = (sec->output_section->vma
1660
0
       + sec->output_offset);
1661
0
    }
1662
0
        else
1663
0
    {
1664
0
      BFD_ASSERT (bfd_link_relocatable (info)
1665
0
            || (h->flags & XCOFF_DEF_DYNAMIC) != 0
1666
0
            || (h->flags & XCOFF_IMPORT) != 0);
1667
0
    }
1668
0
      }
1669
0
  }
1670
1671
0
      if (rel->r_type >= XCOFF_MAX_CALCULATE_RELOCATION
1672
0
    || !((*xcoff64_calculate_relocation[rel->r_type])
1673
0
        (input_bfd, input_section, output_bfd, rel, sym, &howto, val,
1674
0
         addend, &relocation, contents, info)))
1675
0
  return false;
1676
1677
      /* address */
1678
0
      address = rel->r_vaddr - input_section->vma;
1679
0
      location = contents + address;
1680
1681
0
      if (address > input_section->size)
1682
0
  abort ();
1683
1684
      /* Get the value we are going to relocate.  */
1685
0
      switch (bfd_get_reloc_size (&howto))
1686
0
  {
1687
0
  case 2:
1688
0
    value_to_relocate = bfd_get_16 (input_bfd, location);
1689
0
    break;
1690
0
  case 4:
1691
0
    value_to_relocate = bfd_get_32 (input_bfd, location);
1692
0
    break;
1693
0
  default:
1694
0
    value_to_relocate = bfd_get_64 (input_bfd, location);
1695
0
    break;
1696
0
  }
1697
1698
      /* overflow.
1699
1700
   FIXME: We may drop bits during the addition
1701
   which we don't check for.  We must either check at every single
1702
   operation, which would be tedious, or we must do the computations
1703
   in a type larger than bfd_vma, which would be inefficient.  */
1704
1705
0
      if (((*xcoff_complain_overflow[howto.complain_on_overflow])
1706
0
     (input_bfd, value_to_relocate, relocation, &howto)))
1707
0
  {
1708
0
    const char *name;
1709
0
    char buf[SYMNMLEN + 1];
1710
0
    char reloc_type_name[10];
1711
1712
0
    if (symndx == -1)
1713
0
      {
1714
0
        name = "*ABS*";
1715
0
      }
1716
0
    else if (h != NULL)
1717
0
      {
1718
0
        name = NULL;
1719
0
      }
1720
0
    else
1721
0
      {
1722
0
        name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
1723
0
        if (name == NULL)
1724
0
    name = "UNKNOWN";
1725
0
      }
1726
0
    sprintf (reloc_type_name, "0x%02x", rel->r_type);
1727
1728
0
    (*info->callbacks->reloc_overflow)
1729
0
      (info, (h ? &h->root : NULL), name, reloc_type_name,
1730
0
       (bfd_vma) 0, input_bfd, input_section,
1731
0
       rel->r_vaddr - input_section->vma);
1732
0
  }
1733
1734
      /* Add RELOCATION to the right bits of VALUE_TO_RELOCATE.  */
1735
0
      value_to_relocate = ((value_to_relocate & ~howto.dst_mask)
1736
0
         | (((value_to_relocate & howto.src_mask)
1737
0
             + relocation) & howto.dst_mask));
1738
1739
      /* Put the value back in the object file.  */
1740
0
      switch (bfd_get_reloc_size (&howto))
1741
0
  {
1742
0
  case 2:
1743
0
    bfd_put_16 (input_bfd, value_to_relocate, location);
1744
0
    break;
1745
0
  case 4:
1746
0
    bfd_put_32 (input_bfd, value_to_relocate, location);
1747
0
    break;
1748
0
  default:
1749
0
    bfd_put_64 (input_bfd, value_to_relocate, location);
1750
0
    break;
1751
0
  }
1752
0
    }
1753
0
  return true;
1754
0
}
1755
1756
1757
/* PR 21786:  The PE/COFF standard does not require NUL termination for any of
1758
   the ASCII fields in the archive headers.  So in order to be able to extract
1759
   numerical values we provide our own versions of strtol and strtoll which
1760
   take a maximum length as an additional parameter.  Also - just to save space,
1761
   we omit the endptr return parameter, since we know that it is never used.  */
1762
1763
static long
1764
_bfd_strntol (const char * nptr, int base, unsigned int maxlen)
1765
0
{
1766
0
  char buf[24]; /* Should be enough.  */
1767
1768
0
  BFD_ASSERT (maxlen < (sizeof (buf) - 1));
1769
1770
0
  memcpy (buf, nptr, maxlen);
1771
0
  buf[maxlen] = 0;
1772
0
  return strtol (buf, NULL, base);
1773
0
}
1774
1775
static long long
1776
_bfd_strntoll (const char * nptr, int base, unsigned int maxlen)
1777
0
{
1778
0
  char buf[32]; /* Should be enough.  */
1779
0
1780
0
  BFD_ASSERT (maxlen < (sizeof (buf) - 1));
1781
0
1782
0
  memcpy (buf, nptr, maxlen);
1783
0
  buf[maxlen] = 0;
1784
0
  return strtoll (buf, NULL, base);
1785
0
}
1786
1787
/* Macro to read an ASCII value stored in an archive header field.  */
1788
#define GET_VALUE_IN_FIELD(VAR, FIELD, BASE)      \
1789
0
  do                \
1790
0
    {               \
1791
0
      (VAR) = (sizeof (VAR) > sizeof (long)      \
1792
0
         ? _bfd_strntoll (FIELD, BASE, sizeof FIELD)  \
1793
0
         : _bfd_strntol (FIELD, BASE, sizeof FIELD));  \
1794
0
    }               \
1795
0
  while (0)
1796
1797
/* Read in the armap of an XCOFF archive.  */
1798
1799
static bool
1800
xcoff64_slurp_armap (bfd *abfd)
1801
0
{
1802
0
  file_ptr off;
1803
0
  size_t namlen;
1804
0
  bfd_size_type sz, amt;
1805
0
  bfd_byte *contents, *cend;
1806
0
  bfd_vma c, i;
1807
0
  carsym *arsym;
1808
0
  bfd_byte *p;
1809
0
  file_ptr pos;
1810
1811
  /* This is for the new format.  */
1812
0
  struct xcoff_ar_hdr_big hdr;
1813
1814
0
  if (x_artdata (abfd) == NULL)
1815
0
    {
1816
0
      abfd->has_armap = false;
1817
0
      return true;
1818
0
    }
1819
1820
0
  off = bfd_scan_vma (x_artdata (abfd)->u.bhdr.symoff64,
1821
0
          (const char **) NULL, 10);
1822
0
  if (off == 0)
1823
0
    {
1824
0
      abfd->has_armap = false;
1825
0
      return true;
1826
0
    }
1827
1828
0
  if (bfd_seek (abfd, off, SEEK_SET) != 0)
1829
0
    return false;
1830
1831
  /* The symbol table starts with a normal archive header.  */
1832
0
  if (bfd_bread (&hdr, (bfd_size_type) SIZEOF_AR_HDR_BIG, abfd)
1833
0
      != SIZEOF_AR_HDR_BIG)
1834
0
    return false;
1835
1836
  /* Skip the name (normally empty).  */
1837
0
  GET_VALUE_IN_FIELD (namlen, hdr.namlen, 10);
1838
0
  pos = ((namlen + 1) & ~(size_t) 1) + SXCOFFARFMAG;
1839
0
  if (bfd_seek (abfd, pos, SEEK_CUR) != 0)
1840
0
    return false;
1841
1842
0
  sz = bfd_scan_vma (hdr.size, (const char **) NULL, 10);
1843
0
  if (sz + 1 < 9)
1844
0
    {
1845
0
      bfd_set_error (bfd_error_bad_value);
1846
0
      return false;
1847
0
    }
1848
1849
  /* Read in the entire symbol table.  */
1850
0
  contents = (bfd_byte *) _bfd_alloc_and_read (abfd, sz + 1, sz);
1851
0
  if (contents == NULL)
1852
0
    return false;
1853
1854
  /* Ensure strings are NULL terminated so we don't wander off the end
1855
     of the buffer.  */
1856
0
  contents[sz] = 0;
1857
1858
  /* The symbol table starts with an eight byte count.  */
1859
0
  c = H_GET_64 (abfd, contents);
1860
1861
0
  if (c >= sz / 8)
1862
0
    {
1863
0
      bfd_set_error (bfd_error_bad_value);
1864
0
      return false;
1865
0
    }
1866
0
  amt = c;
1867
0
  amt *= sizeof (carsym);
1868
0
  bfd_ardata (abfd)->symdefs = (carsym *) bfd_alloc (abfd, amt);
1869
0
  if (bfd_ardata (abfd)->symdefs == NULL)
1870
0
    return false;
1871
1872
  /* After the count comes a list of eight byte file offsets.  */
1873
0
  for (i = 0, arsym = bfd_ardata (abfd)->symdefs, p = contents + 8;
1874
0
       i < c;
1875
0
       ++i, ++arsym, p += 8)
1876
0
    arsym->file_offset = H_GET_64 (abfd, p);
1877
1878
  /* After the file offsets come null terminated symbol names.  */
1879
0
  cend = contents + sz;
1880
0
  for (i = 0, arsym = bfd_ardata (abfd)->symdefs;
1881
0
       i < c;
1882
0
       ++i, ++arsym, p += strlen ((char *) p) + 1)
1883
0
    {
1884
0
      if (p >= cend)
1885
0
  {
1886
0
    bfd_set_error (bfd_error_bad_value);
1887
0
    return false;
1888
0
  }
1889
0
      arsym->name = (char *) p;
1890
0
    }
1891
1892
0
  bfd_ardata (abfd)->symdef_count = c;
1893
0
  abfd->has_armap = true;
1894
1895
0
  return true;
1896
0
}
1897
1898
1899
/* See if this is an NEW XCOFF archive.  */
1900
1901
static bfd_cleanup
1902
xcoff64_archive_p (bfd *abfd)
1903
0
{
1904
0
  struct artdata *tdata_hold;
1905
0
  char magic[SXCOFFARMAG];
1906
  /* This is the new format.  */
1907
0
  struct xcoff_ar_file_hdr_big hdr;
1908
0
  size_t amt = SXCOFFARMAG;
1909
1910
0
  if (bfd_bread (magic, amt, abfd) != amt)
1911
0
    {
1912
0
      if (bfd_get_error () != bfd_error_system_call)
1913
0
  bfd_set_error (bfd_error_wrong_format);
1914
0
      return NULL;
1915
0
    }
1916
1917
0
  if (strncmp (magic, XCOFFARMAGBIG, SXCOFFARMAG) != 0)
1918
0
    {
1919
0
      bfd_set_error (bfd_error_wrong_format);
1920
0
      return NULL;
1921
0
    }
1922
1923
  /* Copy over the magic string.  */
1924
0
  memcpy (hdr.magic, magic, SXCOFFARMAG);
1925
1926
  /* Now read the rest of the file header.  */
1927
0
  amt = SIZEOF_AR_FILE_HDR_BIG - SXCOFFARMAG;
1928
0
  if (bfd_bread (&hdr.memoff, amt, abfd) != amt)
1929
0
    {
1930
0
      if (bfd_get_error () != bfd_error_system_call)
1931
0
  bfd_set_error (bfd_error_wrong_format);
1932
0
      return NULL;
1933
0
    }
1934
1935
0
  tdata_hold = bfd_ardata (abfd);
1936
1937
0
  amt = sizeof (struct artdata);
1938
0
  bfd_ardata (abfd) = (struct artdata *) bfd_zalloc (abfd, amt);
1939
0
  if (bfd_ardata (abfd) == (struct artdata *) NULL)
1940
0
    goto error_ret_restore;
1941
1942
0
  bfd_ardata (abfd)->first_file_filepos = bfd_scan_vma (hdr.firstmemoff,
1943
0
              (const char **) NULL,
1944
0
              10);
1945
1946
0
  amt = sizeof (struct xcoff_artdata);
1947
0
  bfd_ardata (abfd)->tdata = bfd_zalloc (abfd, amt);
1948
0
  if (bfd_ardata (abfd)->tdata == NULL)
1949
0
    goto error_ret;
1950
1951
0
  memcpy (&x_artdata (abfd)->u.bhdr, &hdr, SIZEOF_AR_FILE_HDR_BIG);
1952
1953
0
  if (! xcoff64_slurp_armap (abfd))
1954
0
    {
1955
0
    error_ret:
1956
0
      bfd_release (abfd, bfd_ardata (abfd));
1957
0
    error_ret_restore:
1958
0
      bfd_ardata (abfd) = tdata_hold;
1959
0
      return NULL;
1960
0
    }
1961
1962
0
  return _bfd_no_cleanup;
1963
0
}
1964
1965
1966
/* Open the next element in an XCOFF archive.  */
1967
1968
static bfd *
1969
xcoff64_openr_next_archived_file (bfd *archive, bfd *last_file)
1970
0
{
1971
0
  if (x_artdata (archive) == NULL
1972
0
      || ! xcoff_big_format_p (archive))
1973
0
    {
1974
0
      bfd_set_error (bfd_error_invalid_operation);
1975
0
      return NULL;
1976
0
    }
1977
1978
0
  return _bfd_xcoff_openr_next_archived_file (archive, last_file);
1979
0
}
1980
1981
/* We can't use the usual coff_sizeof_headers routine, because AIX
1982
   always uses an a.out header.  */
1983
1984
static int
1985
xcoff64_sizeof_headers (bfd *abfd,
1986
      struct bfd_link_info *info ATTRIBUTE_UNUSED)
1987
0
{
1988
0
  int size;
1989
1990
0
  size = bfd_coff_filhsz (abfd);
1991
1992
  /* Don't think the small aout header can be used since some of the
1993
     old elements have been reordered past the end of the old coff
1994
     small aout size.  */
1995
1996
0
  if (xcoff_data (abfd)->full_aouthdr)
1997
0
    size += bfd_coff_aoutsz (abfd);
1998
1999
0
  size += abfd->section_count * bfd_coff_scnhsz (abfd);
2000
0
  return size;
2001
0
}
2002
2003
static asection *
2004
xcoff64_create_csect_from_smclas (bfd *abfd, union internal_auxent *aux,
2005
          const char *symbol_name)
2006
0
{
2007
0
  asection *return_value = NULL;
2008
2009
  /* Changes from 32 :
2010
     .sv == 8, is only for 32 bit programs
2011
     .ti == 12 and .tb == 13 are now reserved.  */
2012
0
  static const char * const names[] =
2013
0
  {
2014
0
    ".pr", ".ro", ".db", ".tc", ".ua", ".rw", ".gl", ".xo",
2015
0
    NULL, ".bs", ".ds", ".uc", NULL,  NULL,  NULL,  ".tc0",
2016
0
    ".td", ".sv64", ".sv3264", NULL, ".tl", ".ul", ".te"
2017
0
  };
2018
2019
0
  if ((aux->x_csect.x_smclas < ARRAY_SIZE (names))
2020
0
      && (NULL != names[aux->x_csect.x_smclas]))
2021
0
    {
2022
2023
0
      return_value = bfd_make_section_anyway
2024
0
  (abfd, names[aux->x_csect.x_smclas]);
2025
2026
0
    }
2027
0
  else
2028
0
    {
2029
0
      _bfd_error_handler
2030
  /* xgettext: c-format */
2031
0
  (_("%pB: symbol `%s' has unrecognized smclas %d"),
2032
0
   abfd, symbol_name, aux->x_csect.x_smclas);
2033
0
      bfd_set_error (bfd_error_bad_value);
2034
0
    }
2035
2036
0
  return return_value;
2037
0
}
2038
2039
static bool
2040
xcoff64_is_lineno_count_overflow (bfd *abfd ATTRIBUTE_UNUSED,
2041
          bfd_vma value ATTRIBUTE_UNUSED)
2042
0
{
2043
0
  return false;
2044
0
}
2045
2046
static bool
2047
xcoff64_is_reloc_count_overflow (bfd *abfd ATTRIBUTE_UNUSED,
2048
         bfd_vma value ATTRIBUTE_UNUSED)
2049
0
{
2050
0
  return false;
2051
0
}
2052
2053
static bfd_vma
2054
xcoff64_loader_symbol_offset (bfd *abfd ATTRIBUTE_UNUSED,
2055
            struct internal_ldhdr *ldhdr)
2056
0
{
2057
0
  return (ldhdr->l_symoff);
2058
0
}
2059
2060
static bfd_vma
2061
xcoff64_loader_reloc_offset (bfd *abfd ATTRIBUTE_UNUSED,
2062
           struct internal_ldhdr *ldhdr)
2063
0
{
2064
0
  return (ldhdr->l_rldoff);
2065
0
}
2066
2067
static bool
2068
xcoff64_bad_format_hook (bfd * abfd, void *filehdr)
2069
0
{
2070
0
  struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
2071
2072
  /* Check flavor first.  */
2073
0
  if (bfd_get_flavour (abfd) != bfd_target_xcoff_flavour)
2074
0
    return false;
2075
2076
0
  if (bfd_xcoff_magic_number (abfd) != internal_f->f_magic)
2077
0
    return false;
2078
2079
0
  return true;
2080
0
}
2081
2082
static bool
2083
xcoff64_generate_rtinit (bfd *abfd, const char *init, const char *fini,
2084
       bool rtld)
2085
0
{
2086
0
  bfd_byte filehdr_ext[FILHSZ];
2087
0
  bfd_byte scnhdr_ext[SCNHSZ * 3];
2088
0
  bfd_byte syment_ext[SYMESZ * 10];
2089
0
  bfd_byte reloc_ext[RELSZ * 3];
2090
0
  bfd_byte *data_buffer;
2091
0
  bfd_size_type data_buffer_size;
2092
0
  bfd_byte *string_table, *st_tmp;
2093
0
  bfd_size_type string_table_size;
2094
0
  bfd_vma val;
2095
0
  size_t initsz, finisz;
2096
0
  struct internal_filehdr filehdr;
2097
0
  struct internal_scnhdr text_scnhdr;
2098
0
  struct internal_scnhdr data_scnhdr;
2099
0
  struct internal_scnhdr bss_scnhdr;
2100
0
  struct internal_syment syment;
2101
0
  union internal_auxent auxent;
2102
0
  struct internal_reloc reloc;
2103
2104
0
  char *text_name = ".text";
2105
0
  char *data_name = ".data";
2106
0
  char *bss_name = ".bss";
2107
0
  char *rtinit_name = "__rtinit";
2108
0
  char *rtld_name = "__rtld";
2109
2110
0
  if (! bfd_xcoff_rtinit_size (abfd))
2111
0
    return false;
2112
2113
0
  initsz = (init == NULL ? 0 : 1 + strlen (init));
2114
0
  finisz = (fini == NULL ? 0 : 1 + strlen (fini));
2115
2116
  /* File header.  */
2117
0
  memset (filehdr_ext, 0, FILHSZ);
2118
0
  memset (&filehdr, 0, sizeof (struct internal_filehdr));
2119
0
  filehdr.f_magic = bfd_xcoff_magic_number (abfd);
2120
0
  filehdr.f_nscns = 3;
2121
0
  filehdr.f_timdat = 0;
2122
0
  filehdr.f_nsyms = 0;  /* at least 6, no more than 8 */
2123
0
  filehdr.f_symptr = 0; /* set below */
2124
0
  filehdr.f_opthdr = 0;
2125
0
  filehdr.f_flags = 0;
2126
2127
  /* Section headers.  */
2128
0
  memset (scnhdr_ext, 0, 3 * SCNHSZ);
2129
2130
  /* Text.  */
2131
0
  memset (&text_scnhdr, 0, sizeof (struct internal_scnhdr));
2132
0
  memcpy (text_scnhdr.s_name, text_name, strlen (text_name));
2133
0
  text_scnhdr.s_paddr = 0;
2134
0
  text_scnhdr.s_vaddr = 0;
2135
0
  text_scnhdr.s_size = 0;
2136
0
  text_scnhdr.s_scnptr = 0;
2137
0
  text_scnhdr.s_relptr = 0;
2138
0
  text_scnhdr.s_lnnoptr = 0;
2139
0
  text_scnhdr.s_nreloc = 0;
2140
0
  text_scnhdr.s_nlnno = 0;
2141
0
  text_scnhdr.s_flags = STYP_TEXT;
2142
2143
  /* Data.  */
2144
0
  memset (&data_scnhdr, 0, sizeof (struct internal_scnhdr));
2145
0
  memcpy (data_scnhdr.s_name, data_name, strlen (data_name));
2146
0
  data_scnhdr.s_paddr = 0;
2147
0
  data_scnhdr.s_vaddr = 0;
2148
0
  data_scnhdr.s_size = 0;    /* set below */
2149
0
  data_scnhdr.s_scnptr = FILHSZ + 3 * SCNHSZ;
2150
0
  data_scnhdr.s_relptr = 0;  /* set below */
2151
0
  data_scnhdr.s_lnnoptr = 0;
2152
0
  data_scnhdr.s_nreloc = 0;  /* either 1 or 2 */
2153
0
  data_scnhdr.s_nlnno = 0;
2154
0
  data_scnhdr.s_flags = STYP_DATA;
2155
2156
  /* Bss.  */
2157
0
  memset (&bss_scnhdr, 0, sizeof (struct internal_scnhdr));
2158
0
  memcpy (bss_scnhdr.s_name, bss_name, strlen (bss_name));
2159
0
  bss_scnhdr.s_paddr = 0; /* set below */
2160
0
  bss_scnhdr.s_vaddr = 0; /* set below */
2161
0
  bss_scnhdr.s_size = 0;  /* set below */
2162
0
  bss_scnhdr.s_scnptr = 0;
2163
0
  bss_scnhdr.s_relptr = 0;
2164
0
  bss_scnhdr.s_lnnoptr = 0;
2165
0
  bss_scnhdr.s_nreloc = 0;
2166
0
  bss_scnhdr.s_nlnno = 0;
2167
0
  bss_scnhdr.s_flags = STYP_BSS;
2168
2169
  /* .data
2170
     0x0000       0x00000000 : rtl
2171
     0x0004       0x00000000 :
2172
     0x0008       0x00000018 : offset to init, or 0
2173
     0x000C       0x00000038 : offset to fini, or 0
2174
     0x0010       0x00000010 : size of descriptor
2175
     0x0014       0x00000000 : pad
2176
     0x0018       0x00000000 : init, needs a reloc
2177
     0x001C       0x00000000 :
2178
     0x0020       0x00000058 : offset to init name
2179
     0x0024       0x00000000 : flags, padded to a word
2180
     0x0028       0x00000000 : empty init
2181
     0x002C       0x00000000 :
2182
     0x0030       0x00000000 :
2183
     0x0034       0x00000000 :
2184
     0x0038       0x00000000 : fini, needs a reloc
2185
     0x003C       0x00000000 :
2186
     0x0040       0x00000??? : offset to fini name
2187
     0x0044       0x00000000 : flags, padded to a word
2188
     0x0048       0x00000000 : empty fini
2189
     0x004C       0x00000000 :
2190
     0x0050       0x00000000 :
2191
     0x0054       0x00000000 :
2192
     0x0058       init name
2193
     0x0058 + initsz  fini name */
2194
2195
0
  data_buffer_size = 0x0058 + initsz + finisz;
2196
0
  data_buffer_size = (data_buffer_size + 7) &~ (bfd_size_type) 7;
2197
0
  data_buffer = NULL;
2198
0
  data_buffer = (bfd_byte *) bfd_zmalloc (data_buffer_size);
2199
0
  if (data_buffer == NULL)
2200
0
    return false;
2201
2202
0
  if (initsz)
2203
0
    {
2204
0
      val = 0x18;
2205
0
      bfd_put_32 (abfd, val, &data_buffer[0x08]);
2206
0
      val = 0x58;
2207
0
      bfd_put_32 (abfd, val, &data_buffer[0x20]);
2208
0
      memcpy (&data_buffer[val], init, initsz);
2209
0
    }
2210
2211
0
  if (finisz)
2212
0
    {
2213
0
      val = 0x38;
2214
0
      bfd_put_32 (abfd, val, &data_buffer[0x0C]);
2215
0
      val = 0x58 + initsz;
2216
0
      bfd_put_32 (abfd, val, &data_buffer[0x40]);
2217
0
      memcpy (&data_buffer[val], fini, finisz);
2218
0
    }
2219
2220
0
  val = 0x10;
2221
0
  bfd_put_32 (abfd, val, &data_buffer[0x10]);
2222
0
  data_scnhdr.s_size = data_buffer_size;
2223
0
  bss_scnhdr.s_paddr = bss_scnhdr.s_vaddr = data_scnhdr.s_size;
2224
2225
  /* String table.  */
2226
0
  string_table_size = 4;
2227
0
  string_table_size += strlen (data_name) + 1;
2228
0
  string_table_size += strlen (rtinit_name) + 1;
2229
0
  string_table_size += initsz;
2230
0
  string_table_size += finisz;
2231
0
  if (rtld)
2232
0
    string_table_size += strlen (rtld_name) + 1;
2233
2234
0
  string_table = (bfd_byte *) bfd_zmalloc (string_table_size);
2235
0
  if (string_table == NULL)
2236
0
    return false;
2237
2238
0
  val = string_table_size;
2239
0
  bfd_put_32 (abfd, val, &string_table[0]);
2240
0
  st_tmp = string_table + 4;
2241
2242
  /* symbols
2243
     0. .data csect
2244
     2. __rtinit
2245
     4. init function
2246
     6. fini function
2247
     8. __rtld  */
2248
0
  memset (syment_ext, 0, 10 * SYMESZ);
2249
0
  memset (reloc_ext, 0, 3 * RELSZ);
2250
2251
  /* .data csect */
2252
0
  memset (&syment, 0, sizeof (struct internal_syment));
2253
0
  memset (&auxent, 0, sizeof (union internal_auxent));
2254
2255
0
  syment._n._n_n._n_offset = st_tmp - string_table;
2256
0
  memcpy (st_tmp, data_name, strlen (data_name));
2257
0
  st_tmp += strlen (data_name) + 1;
2258
2259
0
  syment.n_scnum = 2;
2260
0
  syment.n_sclass = C_HIDEXT;
2261
0
  syment.n_numaux = 1;
2262
0
  auxent.x_csect.x_scnlen.u64 = data_buffer_size;
2263
0
  auxent.x_csect.x_smtyp = 3 << 3 | XTY_SD;
2264
0
  auxent.x_csect.x_smclas = XMC_RW;
2265
0
  bfd_coff_swap_sym_out (abfd, &syment,
2266
0
       &syment_ext[filehdr.f_nsyms * SYMESZ]);
2267
0
  bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
2268
0
       syment.n_numaux,
2269
0
       &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
2270
0
  filehdr.f_nsyms += 2;
2271
2272
  /* __rtinit */
2273
0
  memset (&syment, 0, sizeof (struct internal_syment));
2274
0
  memset (&auxent, 0, sizeof (union internal_auxent));
2275
0
  syment._n._n_n._n_offset = st_tmp - string_table;
2276
0
  memcpy (st_tmp, rtinit_name, strlen (rtinit_name));
2277
0
  st_tmp += strlen (rtinit_name) + 1;
2278
2279
0
  syment.n_scnum = 2;
2280
0
  syment.n_sclass = C_EXT;
2281
0
  syment.n_numaux = 1;
2282
0
  auxent.x_csect.x_smtyp = XTY_LD;
2283
0
  auxent.x_csect.x_smclas = XMC_RW;
2284
0
  bfd_coff_swap_sym_out (abfd, &syment,
2285
0
       &syment_ext[filehdr.f_nsyms * SYMESZ]);
2286
0
  bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
2287
0
       syment.n_numaux,
2288
0
       &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
2289
0
  filehdr.f_nsyms += 2;
2290
2291
  /* Init.  */
2292
0
  if (initsz)
2293
0
    {
2294
0
      memset (&syment, 0, sizeof (struct internal_syment));
2295
0
      memset (&auxent, 0, sizeof (union internal_auxent));
2296
2297
0
      syment._n._n_n._n_offset = st_tmp - string_table;
2298
0
      memcpy (st_tmp, init, initsz);
2299
0
      st_tmp += initsz;
2300
2301
0
      syment.n_sclass = C_EXT;
2302
0
      syment.n_numaux = 1;
2303
0
      bfd_coff_swap_sym_out (abfd, &syment,
2304
0
           &syment_ext[filehdr.f_nsyms * SYMESZ]);
2305
0
      bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
2306
0
           syment.n_numaux,
2307
0
           &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
2308
      /* Reloc.  */
2309
0
      memset (&reloc, 0, sizeof (struct internal_reloc));
2310
0
      reloc.r_vaddr = 0x0018;
2311
0
      reloc.r_symndx = filehdr.f_nsyms;
2312
0
      reloc.r_type = R_POS;
2313
0
      reloc.r_size = 63;
2314
0
      bfd_coff_swap_reloc_out (abfd, &reloc, &reloc_ext[0]);
2315
2316
0
      filehdr.f_nsyms += 2;
2317
0
      data_scnhdr.s_nreloc += 1;
2318
0
    }
2319
2320
  /* Finit.  */
2321
0
  if (finisz)
2322
0
    {
2323
0
      memset (&syment, 0, sizeof (struct internal_syment));
2324
0
      memset (&auxent, 0, sizeof (union internal_auxent));
2325
2326
0
      syment._n._n_n._n_offset = st_tmp - string_table;
2327
0
      memcpy (st_tmp, fini, finisz);
2328
0
      st_tmp += finisz;
2329
2330
0
      syment.n_sclass = C_EXT;
2331
0
      syment.n_numaux = 1;
2332
0
      bfd_coff_swap_sym_out (abfd, &syment,
2333
0
           &syment_ext[filehdr.f_nsyms * SYMESZ]);
2334
0
      bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
2335
0
           syment.n_numaux,
2336
0
           &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
2337
2338
      /* Reloc.  */
2339
0
      memset (&reloc, 0, sizeof (struct internal_reloc));
2340
0
      reloc.r_vaddr = 0x0038;
2341
0
      reloc.r_symndx = filehdr.f_nsyms;
2342
0
      reloc.r_type = R_POS;
2343
0
      reloc.r_size = 63;
2344
0
      bfd_coff_swap_reloc_out (abfd, &reloc,
2345
0
             &reloc_ext[data_scnhdr.s_nreloc * RELSZ]);
2346
2347
0
      filehdr.f_nsyms += 2;
2348
0
      data_scnhdr.s_nreloc += 1;
2349
0
    }
2350
2351
0
  if (rtld)
2352
0
    {
2353
0
      memset (&syment, 0, sizeof (struct internal_syment));
2354
0
      memset (&auxent, 0, sizeof (union internal_auxent));
2355
2356
0
      syment._n._n_n._n_offset = st_tmp - string_table;
2357
0
      memcpy (st_tmp, rtld_name, strlen (rtld_name));
2358
0
      st_tmp += strlen (rtld_name) + 1;
2359
2360
0
      syment.n_sclass = C_EXT;
2361
0
      syment.n_numaux = 1;
2362
0
      bfd_coff_swap_sym_out (abfd, &syment,
2363
0
           &syment_ext[filehdr.f_nsyms * SYMESZ]);
2364
0
      bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
2365
0
           syment.n_numaux,
2366
0
           &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
2367
2368
      /* Reloc.  */
2369
0
      memset (&reloc, 0, sizeof (struct internal_reloc));
2370
0
      reloc.r_vaddr = 0x0000;
2371
0
      reloc.r_symndx = filehdr.f_nsyms;
2372
0
      reloc.r_type = R_POS;
2373
0
      reloc.r_size = 63;
2374
0
      bfd_coff_swap_reloc_out (abfd, &reloc,
2375
0
             &reloc_ext[data_scnhdr.s_nreloc * RELSZ]);
2376
2377
0
      filehdr.f_nsyms += 2;
2378
0
      data_scnhdr.s_nreloc += 1;
2379
2380
0
      bss_scnhdr.s_size = 0;
2381
0
    }
2382
2383
0
  data_scnhdr.s_relptr = data_scnhdr.s_scnptr + data_buffer_size;
2384
0
  filehdr.f_symptr = data_scnhdr.s_relptr + data_scnhdr.s_nreloc * RELSZ;
2385
2386
0
  bfd_coff_swap_filehdr_out (abfd, &filehdr, filehdr_ext);
2387
0
  bfd_bwrite (filehdr_ext, FILHSZ, abfd);
2388
0
  bfd_coff_swap_scnhdr_out (abfd, &text_scnhdr, &scnhdr_ext[SCNHSZ * 0]);
2389
0
  bfd_coff_swap_scnhdr_out (abfd, &data_scnhdr, &scnhdr_ext[SCNHSZ * 1]);
2390
0
  bfd_coff_swap_scnhdr_out (abfd, &bss_scnhdr, &scnhdr_ext[SCNHSZ * 2]);
2391
0
  bfd_bwrite (scnhdr_ext, 3 * SCNHSZ, abfd);
2392
0
  bfd_bwrite (data_buffer, data_buffer_size, abfd);
2393
0
  bfd_bwrite (reloc_ext, data_scnhdr.s_nreloc * RELSZ, abfd);
2394
0
  bfd_bwrite (syment_ext, filehdr.f_nsyms * SYMESZ, abfd);
2395
0
  bfd_bwrite (string_table, string_table_size, abfd);
2396
2397
0
  free (data_buffer);
2398
0
  data_buffer = NULL;
2399
2400
0
  return true;
2401
0
}
2402
2403
/* The typical dynamic reloc.  */
2404
2405
static reloc_howto_type xcoff64_dynamic_reloc =
2406
HOWTO (0,     /* type */
2407
       0,     /* rightshift */
2408
       8,     /* size */
2409
       64,      /* bitsize */
2410
       false,     /* pc_relative */
2411
       0,     /* bitpos */
2412
       complain_overflow_bitfield, /* complain_on_overflow */
2413
       0,     /* special_function */
2414
       "R_POS",     /* name */
2415
       true,      /* partial_inplace */
2416
       MINUS_ONE,   /* src_mask */
2417
       MINUS_ONE,   /* dst_mask */
2418
       false);      /* pcrel_offset */
2419
2420
/* Indirect call stub */
2421
static const unsigned long xcoff64_stub_indirect_call_code[4] =
2422
  {
2423
    0xe9820000, /* ld r12,0(r2) */
2424
    0xe80c0000, /* ld r0,0(r12) */
2425
    0x7c0903a6, /* mtctr r0 */
2426
    0x4e800420, /* bctr */
2427
  };
2428
2429
/* Shared call stub */
2430
static const unsigned long xcoff64_stub_shared_call_code[6] =
2431
  {
2432
    0xe9820000, /* ld r12,0(r2) */
2433
    0xf8410028, /* std r2,40(r1) */
2434
    0xe80c0000, /* ld r0,0(r12) */
2435
    0xe84c0008, /* ld r2,8(r12) */
2436
    0x7c0903a6, /* mtctr r0 */
2437
    0x4e800420, /* bctr */
2438
  };
2439
2440
static const unsigned long xcoff64_glink_code[10] =
2441
{
2442
  0xe9820000, /* ld r12,0(r2) */
2443
  0xf8410028, /* std r2,40(r1) */
2444
  0xe80c0000, /* ld r0,0(r12) */
2445
  0xe84c0008, /* ld r2,8(r12) */
2446
  0x7c0903a6, /* mtctr r0 */
2447
  0x4e800420, /* bctr */
2448
  0x00000000, /* start of traceback table */
2449
  0x000ca000, /* traceback table */
2450
  0x00000000, /* traceback table */
2451
  0x00000018, /* ??? */
2452
};
2453
2454
static const struct xcoff_backend_data_rec bfd_xcoff_backend_data =
2455
  {
2456
    { /* COFF backend, defined in libcoff.h.  */
2457
      _bfd_xcoff64_swap_aux_in,
2458
      _bfd_xcoff64_swap_sym_in,
2459
      _bfd_xcoff64_swap_lineno_in,
2460
      _bfd_xcoff64_swap_aux_out,
2461
      _bfd_xcoff64_swap_sym_out,
2462
      _bfd_xcoff64_swap_lineno_out,
2463
      xcoff64_swap_reloc_out,
2464
      coff_swap_filehdr_out,
2465
      coff_swap_aouthdr_out,
2466
      coff_swap_scnhdr_out,
2467
      FILHSZ,
2468
      AOUTSZ,
2469
      SCNHSZ,
2470
      SYMESZ,
2471
      AUXESZ,
2472
      RELSZ,
2473
      LINESZ,
2474
      FILNMLEN,
2475
      true,     /* _bfd_coff_long_filenames */
2476
      XCOFF_NO_LONG_SECTION_NAMES,  /* _bfd_coff_long_section_names */
2477
      3,      /* _bfd_coff_default_section_alignment_power */
2478
      true,     /* _bfd_coff_force_symnames_in_strings */
2479
      4,      /* _bfd_coff_debug_string_prefix_length */
2480
      32768,      /* _bfd_coff_max_nscns */
2481
      coff_swap_filehdr_in,
2482
      coff_swap_aouthdr_in,
2483
      coff_swap_scnhdr_in,
2484
      xcoff64_swap_reloc_in,
2485
      xcoff64_bad_format_hook,
2486
      coff_set_arch_mach_hook,
2487
      coff_mkobject_hook,
2488
      styp_to_sec_flags,
2489
      coff_set_alignment_hook,
2490
      coff_slurp_symbol_table,
2491
      symname_in_debug_hook,
2492
      coff_pointerize_aux_hook,
2493
      coff_print_aux,
2494
      dummy_reloc16_extra_cases,
2495
      dummy_reloc16_estimate,
2496
      NULL,     /* bfd_coff_symbol_classification */
2497
      coff_compute_section_file_positions,
2498
      NULL,     /* _bfd_coff_start_final_link */
2499
      xcoff64_ppc_relocate_section,
2500
      coff_rtype_to_howto,
2501
      NULL,     /* _bfd_coff_adjust_symndx */
2502
      _bfd_generic_link_add_one_symbol,
2503
      coff_link_output_has_begun,
2504
      coff_final_link_postscript,
2505
      NULL      /* print_pdata.  */
2506
    },
2507
2508
    0x01EF,     /* magic number */
2509
    bfd_arch_powerpc,
2510
    bfd_mach_ppc_620,
2511
2512
    /* Function pointers to xcoff specific swap routines.  */
2513
    xcoff64_swap_ldhdr_in,
2514
    xcoff64_swap_ldhdr_out,
2515
    xcoff64_swap_ldsym_in,
2516
    xcoff64_swap_ldsym_out,
2517
    xcoff64_swap_ldrel_in,
2518
    xcoff64_swap_ldrel_out,
2519
2520
    /* Sizes.  */
2521
    LDHDRSZ,
2522
    LDSYMSZ,
2523
    LDRELSZ,
2524
    24,       /* _xcoff_function_descriptor_size */
2525
    0,        /* _xcoff_small_aout_header_size */
2526
2527
    /* Versions.  */
2528
    2,        /* _xcoff_ldhdr_version */
2529
2530
    _bfd_xcoff64_put_symbol_name,
2531
    _bfd_xcoff64_put_ldsymbol_name,
2532
    &xcoff64_dynamic_reloc,
2533
    xcoff64_create_csect_from_smclas,
2534
2535
    /* Lineno and reloc count overflow.  */
2536
    xcoff64_is_lineno_count_overflow,
2537
    xcoff64_is_reloc_count_overflow,
2538
2539
    xcoff64_loader_symbol_offset,
2540
    xcoff64_loader_reloc_offset,
2541
2542
    /* glink.  */
2543
    &xcoff64_glink_code[0],
2544
    40,       /* _xcoff_glink_size */
2545
2546
    /* rtinit.  */
2547
    88,       /* _xcoff_rtinit_size */
2548
    xcoff64_generate_rtinit,
2549
2550
    /* Stub indirect call.  */
2551
    &xcoff64_stub_indirect_call_code[0],
2552
    16,       /* _xcoff_stub_indirect_call_size */
2553
2554
    /* Stub shared call.  */
2555
    &xcoff64_stub_shared_call_code[0],
2556
    24,       /* _xcoff_stub_shared_call_size */
2557
  };
2558
2559
/* The transfer vector that leads the outside world to all of the above.  */
2560
const bfd_target rs6000_xcoff64_vec =
2561
  {
2562
    "aixcoff64-rs6000",
2563
    bfd_target_xcoff_flavour,
2564
    BFD_ENDIAN_BIG,   /* data byte order is big */
2565
    BFD_ENDIAN_BIG,   /* header byte order is big */
2566
2567
    (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | DYNAMIC
2568
     | HAS_SYMS | HAS_LOCALS | WP_TEXT),
2569
2570
    SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA,
2571
    0,        /* leading char */
2572
    '/',      /* ar_pad_char */
2573
    15,       /* ar_max_namelen */
2574
    0,        /* match priority.  */
2575
    TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
2576
2577
    /* data */
2578
    bfd_getb64,
2579
    bfd_getb_signed_64,
2580
    bfd_putb64,
2581
    bfd_getb32,
2582
    bfd_getb_signed_32,
2583
    bfd_putb32,
2584
    bfd_getb16,
2585
    bfd_getb_signed_16,
2586
    bfd_putb16,
2587
2588
    /* hdrs */
2589
    bfd_getb64,
2590
    bfd_getb_signed_64,
2591
    bfd_putb64,
2592
    bfd_getb32,
2593
    bfd_getb_signed_32,
2594
    bfd_putb32,
2595
    bfd_getb16,
2596
    bfd_getb_signed_16,
2597
    bfd_putb16,
2598
2599
    { /* bfd_check_format */
2600
      _bfd_dummy_target,
2601
      coff_object_p,
2602
      xcoff64_archive_p,
2603
      CORE_FILE_P
2604
    },
2605
2606
    { /* bfd_set_format */
2607
      _bfd_bool_bfd_false_error,
2608
      coff_mkobject,
2609
      _bfd_generic_mkarchive,
2610
      _bfd_bool_bfd_false_error
2611
    },
2612
2613
    {/* bfd_write_contents */
2614
      _bfd_bool_bfd_false_error,
2615
      coff_write_object_contents,
2616
      _bfd_xcoff_write_archive_contents,
2617
      _bfd_bool_bfd_false_error
2618
    },
2619
2620
    /* Generic */
2621
    coff_close_and_cleanup,
2622
    coff_bfd_free_cached_info,
2623
    coff_new_section_hook,
2624
    _bfd_generic_get_section_contents,
2625
    _bfd_generic_get_section_contents_in_window,
2626
2627
    /* Copy */
2628
    _bfd_xcoff_copy_private_bfd_data,
2629
    _bfd_generic_bfd_merge_private_bfd_data,
2630
    _bfd_generic_init_private_section_data,
2631
    _bfd_generic_bfd_copy_private_section_data,
2632
    _bfd_generic_bfd_copy_private_symbol_data,
2633
    _bfd_generic_bfd_copy_private_header_data,
2634
    _bfd_generic_bfd_set_private_flags,
2635
    _bfd_generic_bfd_print_private_bfd_data,
2636
2637
    /* Core */
2638
    BFD_JUMP_TABLE_CORE (coff),
2639
2640
    /* Archive */
2641
    xcoff64_slurp_armap,
2642
    _bfd_noarchive_slurp_extended_name_table,
2643
    _bfd_noarchive_construct_extended_name_table,
2644
    bfd_dont_truncate_arname,
2645
    _bfd_xcoff_write_armap,
2646
    _bfd_xcoff_read_ar_hdr,
2647
    _bfd_generic_write_ar_hdr,
2648
    xcoff64_openr_next_archived_file,
2649
    _bfd_generic_get_elt_at_index,
2650
    _bfd_xcoff_stat_arch_elt,
2651
    _bfd_bool_bfd_true,
2652
2653
    /* Symbols */
2654
    coff_get_symtab_upper_bound,
2655
    coff_canonicalize_symtab,
2656
    coff_make_empty_symbol,
2657
    coff_print_symbol,
2658
    coff_get_symbol_info,
2659
    coff_get_symbol_version_string,
2660
    _bfd_xcoff_is_local_label_name,
2661
    coff_bfd_is_target_special_symbol,
2662
    coff_get_lineno,
2663
    coff_find_nearest_line,
2664
    coff_find_nearest_line_with_alt,
2665
    coff_find_line,
2666
    coff_find_inliner_info,
2667
    coff_bfd_make_debug_symbol,
2668
    _bfd_generic_read_minisymbols,
2669
    _bfd_generic_minisymbol_to_symbol,
2670
2671
    /* Reloc */
2672
    coff_get_reloc_upper_bound,
2673
    coff_canonicalize_reloc,
2674
    _bfd_generic_set_reloc,
2675
    xcoff64_reloc_type_lookup,
2676
    xcoff64_reloc_name_lookup,
2677
2678
    /* Write */
2679
    coff_set_arch_mach,
2680
    coff_set_section_contents,
2681
2682
    /* Link */
2683
    xcoff64_sizeof_headers,
2684
    bfd_generic_get_relocated_section_contents,
2685
    bfd_generic_relax_section,
2686
    _bfd_xcoff_bfd_link_hash_table_create,
2687
    _bfd_xcoff_bfd_link_add_symbols,
2688
    _bfd_generic_link_just_syms,
2689
    _bfd_generic_copy_link_hash_symbol_type,
2690
    _bfd_xcoff_bfd_final_link,
2691
    _bfd_generic_link_split_section,
2692
    _bfd_generic_link_check_relocs,
2693
    bfd_generic_gc_sections,
2694
    bfd_generic_lookup_section_flags,
2695
    bfd_generic_merge_sections,
2696
    bfd_generic_is_group_section,
2697
    bfd_generic_group_name,
2698
    bfd_generic_discard_group,
2699
    _bfd_generic_section_already_linked,
2700
    _bfd_xcoff_define_common_symbol,
2701
    _bfd_generic_link_hide_symbol,
2702
    bfd_generic_define_start_stop,
2703
2704
    /* Dynamic */
2705
    _bfd_xcoff_get_dynamic_symtab_upper_bound,
2706
    _bfd_xcoff_canonicalize_dynamic_symtab,
2707
    _bfd_nodynamic_get_synthetic_symtab,
2708
    _bfd_xcoff_get_dynamic_reloc_upper_bound,
2709
    _bfd_xcoff_canonicalize_dynamic_reloc,
2710
2711
    /* Opposite endian version, none exists */
2712
    NULL,
2713
2714
    &bfd_xcoff_backend_data,
2715
  };
2716
2717
extern bfd_cleanup xcoff64_core_p
2718
  (bfd *);
2719
extern bool xcoff64_core_file_matches_executable_p
2720
  (bfd *, bfd *);
2721
extern char *xcoff64_core_file_failing_command
2722
  (bfd *);
2723
extern int xcoff64_core_file_failing_signal
2724
  (bfd *);
2725
#define xcoff64_core_file_pid _bfd_nocore_core_file_pid
2726
2727
/* AIX 5 */
2728
static const struct xcoff_backend_data_rec bfd_xcoff_aix5_backend_data =
2729
  {
2730
    { /* COFF backend, defined in libcoff.h.  */
2731
      _bfd_xcoff64_swap_aux_in,
2732
      _bfd_xcoff64_swap_sym_in,
2733
      _bfd_xcoff64_swap_lineno_in,
2734
      _bfd_xcoff64_swap_aux_out,
2735
      _bfd_xcoff64_swap_sym_out,
2736
      _bfd_xcoff64_swap_lineno_out,
2737
      xcoff64_swap_reloc_out,
2738
      coff_swap_filehdr_out,
2739
      coff_swap_aouthdr_out,
2740
      coff_swap_scnhdr_out,
2741
      FILHSZ,
2742
      AOUTSZ,
2743
      SCNHSZ,
2744
      SYMESZ,
2745
      AUXESZ,
2746
      RELSZ,
2747
      LINESZ,
2748
      FILNMLEN,
2749
      true,     /* _bfd_coff_long_filenames */
2750
      XCOFF_NO_LONG_SECTION_NAMES,  /* _bfd_coff_long_section_names */
2751
      3,      /* _bfd_coff_default_section_alignment_power */
2752
      true,     /* _bfd_coff_force_symnames_in_strings */
2753
      4,      /* _bfd_coff_debug_string_prefix_length */
2754
      32768,      /* _bfd_coff_max_nscns */
2755
      coff_swap_filehdr_in,
2756
      coff_swap_aouthdr_in,
2757
      coff_swap_scnhdr_in,
2758
      xcoff64_swap_reloc_in,
2759
      xcoff64_bad_format_hook,
2760
      coff_set_arch_mach_hook,
2761
      coff_mkobject_hook,
2762
      styp_to_sec_flags,
2763
      coff_set_alignment_hook,
2764
      coff_slurp_symbol_table,
2765
      symname_in_debug_hook,
2766
      coff_pointerize_aux_hook,
2767
      coff_print_aux,
2768
      dummy_reloc16_extra_cases,
2769
      dummy_reloc16_estimate,
2770
      NULL,     /* bfd_coff_sym_is_global */
2771
      coff_compute_section_file_positions,
2772
      NULL,     /* _bfd_coff_start_final_link */
2773
      xcoff64_ppc_relocate_section,
2774
      coff_rtype_to_howto,
2775
      NULL,     /* _bfd_coff_adjust_symndx */
2776
      _bfd_generic_link_add_one_symbol,
2777
      coff_link_output_has_begun,
2778
      coff_final_link_postscript,
2779
      NULL      /* print_pdata.  */
2780
    },
2781
2782
    U64_TOCMAGIC,   /* magic number */
2783
    bfd_arch_powerpc,
2784
    bfd_mach_ppc_620,
2785
2786
    /* Function pointers to xcoff specific swap routines.  */
2787
    xcoff64_swap_ldhdr_in,
2788
    xcoff64_swap_ldhdr_out,
2789
    xcoff64_swap_ldsym_in,
2790
    xcoff64_swap_ldsym_out,
2791
    xcoff64_swap_ldrel_in,
2792
    xcoff64_swap_ldrel_out,
2793
2794
    /* Sizes.  */
2795
    LDHDRSZ,
2796
    LDSYMSZ,
2797
    LDRELSZ,
2798
    24,       /* _xcoff_function_descriptor_size */
2799
    0,        /* _xcoff_small_aout_header_size */
2800
    /* Versions.  */
2801
    2,        /* _xcoff_ldhdr_version */
2802
2803
    _bfd_xcoff64_put_symbol_name,
2804
    _bfd_xcoff64_put_ldsymbol_name,
2805
    &xcoff64_dynamic_reloc,
2806
    xcoff64_create_csect_from_smclas,
2807
2808
    /* Lineno and reloc count overflow.  */
2809
    xcoff64_is_lineno_count_overflow,
2810
    xcoff64_is_reloc_count_overflow,
2811
2812
    xcoff64_loader_symbol_offset,
2813
    xcoff64_loader_reloc_offset,
2814
2815
    /* glink.  */
2816
    &xcoff64_glink_code[0],
2817
    40,       /* _xcoff_glink_size */
2818
2819
    /* rtinit.  */
2820
    88,       /* _xcoff_rtinit_size */
2821
    xcoff64_generate_rtinit,
2822
2823
    /* Stub indirect call.  */
2824
    &xcoff64_stub_indirect_call_code[0],
2825
    16,       /* _xcoff_stub_indirect_call_size */
2826
2827
    /* Stub shared call.  */
2828
    &xcoff64_stub_shared_call_code[0],
2829
    24,       /* _xcoff_stub_shared_call_size */
2830
  };
2831
2832
/* The transfer vector that leads the outside world to all of the above.  */
2833
const bfd_target rs6000_xcoff64_aix_vec =
2834
  {
2835
    "aix5coff64-rs6000",
2836
    bfd_target_xcoff_flavour,
2837
    BFD_ENDIAN_BIG,   /* data byte order is big */
2838
    BFD_ENDIAN_BIG,   /* header byte order is big */
2839
2840
    (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | DYNAMIC
2841
     | HAS_SYMS | HAS_LOCALS | WP_TEXT),
2842
2843
    SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA,
2844
    0,        /* leading char */
2845
    '/',      /* ar_pad_char */
2846
    15,       /* ar_max_namelen */
2847
    0,        /* match priority.  */
2848
    TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
2849
2850
    /* data */
2851
    bfd_getb64,
2852
    bfd_getb_signed_64,
2853
    bfd_putb64,
2854
    bfd_getb32,
2855
    bfd_getb_signed_32,
2856
    bfd_putb32,
2857
    bfd_getb16,
2858
    bfd_getb_signed_16,
2859
    bfd_putb16,
2860
2861
    /* hdrs */
2862
    bfd_getb64,
2863
    bfd_getb_signed_64,
2864
    bfd_putb64,
2865
    bfd_getb32,
2866
    bfd_getb_signed_32,
2867
    bfd_putb32,
2868
    bfd_getb16,
2869
    bfd_getb_signed_16,
2870
    bfd_putb16,
2871
2872
    { /* bfd_check_format */
2873
      _bfd_dummy_target,
2874
      coff_object_p,
2875
      xcoff64_archive_p,
2876
      xcoff64_core_p
2877
    },
2878
2879
    { /* bfd_set_format */
2880
      _bfd_bool_bfd_false_error,
2881
      coff_mkobject,
2882
      _bfd_generic_mkarchive,
2883
      _bfd_bool_bfd_false_error
2884
    },
2885
2886
    {/* bfd_write_contents */
2887
      _bfd_bool_bfd_false_error,
2888
      coff_write_object_contents,
2889
      _bfd_xcoff_write_archive_contents,
2890
      _bfd_bool_bfd_false_error
2891
    },
2892
2893
    /* Generic */
2894
    coff_close_and_cleanup,
2895
    coff_bfd_free_cached_info,
2896
    coff_new_section_hook,
2897
    _bfd_generic_get_section_contents,
2898
    _bfd_generic_get_section_contents_in_window,
2899
2900
    /* Copy */
2901
    _bfd_xcoff_copy_private_bfd_data,
2902
    _bfd_generic_bfd_merge_private_bfd_data,
2903
    _bfd_generic_init_private_section_data,
2904
    _bfd_generic_bfd_copy_private_section_data,
2905
    _bfd_generic_bfd_copy_private_symbol_data,
2906
    _bfd_generic_bfd_copy_private_header_data,
2907
    _bfd_generic_bfd_set_private_flags,
2908
    _bfd_generic_bfd_print_private_bfd_data,
2909
2910
    /* Core */
2911
    BFD_JUMP_TABLE_CORE (xcoff64),
2912
2913
    /* Archive */
2914
    xcoff64_slurp_armap,
2915
    _bfd_noarchive_slurp_extended_name_table,
2916
    _bfd_noarchive_construct_extended_name_table,
2917
    bfd_dont_truncate_arname,
2918
    _bfd_xcoff_write_armap,
2919
    _bfd_xcoff_read_ar_hdr,
2920
    _bfd_generic_write_ar_hdr,
2921
    xcoff64_openr_next_archived_file,
2922
    _bfd_generic_get_elt_at_index,
2923
    _bfd_xcoff_stat_arch_elt,
2924
    _bfd_bool_bfd_true,
2925
2926
    /* Symbols */
2927
    coff_get_symtab_upper_bound,
2928
    coff_canonicalize_symtab,
2929
    coff_make_empty_symbol,
2930
    coff_print_symbol,
2931
    coff_get_symbol_info,
2932
    coff_get_symbol_version_string,
2933
    _bfd_xcoff_is_local_label_name,
2934
    coff_bfd_is_target_special_symbol,
2935
    coff_get_lineno,
2936
    coff_find_nearest_line,
2937
    coff_find_nearest_line_with_alt,
2938
    coff_find_line,
2939
    coff_find_inliner_info,
2940
    coff_bfd_make_debug_symbol,
2941
    _bfd_generic_read_minisymbols,
2942
    _bfd_generic_minisymbol_to_symbol,
2943
2944
    /* Reloc */
2945
    coff_get_reloc_upper_bound,
2946
    coff_canonicalize_reloc,
2947
    _bfd_generic_set_reloc,
2948
    xcoff64_reloc_type_lookup,
2949
    xcoff64_reloc_name_lookup,
2950
2951
    /* Write */
2952
    coff_set_arch_mach,
2953
    coff_set_section_contents,
2954
2955
    /* Link */
2956
    xcoff64_sizeof_headers,
2957
    bfd_generic_get_relocated_section_contents,
2958
    bfd_generic_relax_section,
2959
    _bfd_xcoff_bfd_link_hash_table_create,
2960
    _bfd_xcoff_bfd_link_add_symbols,
2961
    _bfd_generic_link_just_syms,
2962
    _bfd_generic_copy_link_hash_symbol_type,
2963
    _bfd_xcoff_bfd_final_link,
2964
    _bfd_generic_link_split_section,
2965
    _bfd_generic_link_check_relocs,
2966
    bfd_generic_gc_sections,
2967
    bfd_generic_lookup_section_flags,
2968
    bfd_generic_merge_sections,
2969
    bfd_generic_is_group_section,
2970
    bfd_generic_group_name,
2971
    bfd_generic_discard_group,
2972
    _bfd_generic_section_already_linked,
2973
    _bfd_xcoff_define_common_symbol,
2974
    _bfd_generic_link_hide_symbol,
2975
    bfd_generic_define_start_stop,
2976
2977
    /* Dynamic */
2978
    _bfd_xcoff_get_dynamic_symtab_upper_bound,
2979
    _bfd_xcoff_canonicalize_dynamic_symtab,
2980
    _bfd_nodynamic_get_synthetic_symtab,
2981
    _bfd_xcoff_get_dynamic_reloc_upper_bound,
2982
    _bfd_xcoff_canonicalize_dynamic_reloc,
2983
2984
    /* Opposite endian version, none exists.  */
2985
    NULL,
2986
2987
    & bfd_xcoff_aix5_backend_data,
2988
  };