Coverage Report

Created: 2026-03-10 08:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/binutils-gdb/bfd/coff-rs6000.c
Line
Count
Source
1
/* BFD back-end for IBM RS/6000 "XCOFF" files.
2
   Copyright (C) 1990-2026 Free Software Foundation, Inc.
3
   Written by Metin G. Ozisik, Mimi Phuong-Thao Vo, and John Gilmore.
4
   Archive support from Damon A. Permezel.
5
   Contributed by IBM Corporation and Cygnus Support.
6
7
   This file is part of BFD, the Binary File Descriptor library.
8
9
   This program is free software; you can redistribute it and/or modify
10
   it under the terms of the GNU General Public License as published by
11
   the Free Software Foundation; either version 3 of the License, or
12
   (at your option) any later version.
13
14
   This program is distributed in the hope that it will be useful,
15
   but WITHOUT ANY WARRANTY; without even the implied warranty of
16
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
   GNU General Public License for more details.
18
19
   You should have received a copy of the GNU General Public License
20
   along with this program; if not, write to the Free Software
21
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22
   MA 02110-1301, USA.  */
23
24
#include "sysdep.h"
25
#include "libiberty.h"
26
#include "bfd.h"
27
#include "bfdlink.h"
28
#include "libbfd.h"
29
#include "coff/internal.h"
30
#include "coff/xcoff.h"
31
#include "coff/rs6000.h"
32
#include "libcoff.h"
33
#include "libxcoff.h"
34
35
extern bool _bfd_xcoff_mkobject (bfd *);
36
extern bool _bfd_xcoff_copy_private_bfd_data (bfd *, bfd *);
37
extern bool _bfd_xcoff_is_local_label_name (bfd *, const char *);
38
extern reloc_howto_type *_bfd_xcoff_reloc_type_lookup
39
  (bfd *, bfd_reloc_code_real_type);
40
extern bool _bfd_xcoff_slurp_armap (bfd *);
41
extern bfd_cleanup _bfd_xcoff_archive_p (bfd *);
42
extern void * _bfd_xcoff_read_ar_hdr (bfd *);
43
extern bfd *_bfd_xcoff_openr_next_archived_file (bfd *, bfd *);
44
extern int _bfd_xcoff_stat_arch_elt (bfd *, struct stat *);
45
extern bool _bfd_xcoff_write_armap
46
  (bfd *, unsigned int, struct orl *, unsigned int, int);
47
extern bool _bfd_xcoff_write_archive_contents (bfd *);
48
extern int _bfd_xcoff_sizeof_headers (bfd *, struct bfd_link_info *);
49
extern void _bfd_xcoff_swap_sym_in (bfd *, void *, void *);
50
extern unsigned int _bfd_xcoff_swap_sym_out (bfd *, void *, void *);
51
extern void _bfd_xcoff_swap_aux_in (bfd *, void *, int, int, int, int, void *);
52
extern unsigned int _bfd_xcoff_swap_aux_out
53
  (bfd *, void *, int, int, int, int, void *);
54
static void xcoff_swap_reloc_in (bfd *, void *, void *);
55
static unsigned int xcoff_swap_reloc_out (bfd *, void *, void *);
56
57
/* Forward declare xcoff_rtype2howto for coffcode.h macro.  */
58
void xcoff_rtype2howto (arelent *, struct internal_reloc *);
59
60
/* coffcode.h needs these to be defined.  */
61
#define RS6000COFF_C 1
62
63
#define SELECT_RELOC(internal, howto)         \
64
0
  {                 \
65
0
    internal.r_type = howto->type;          \
66
0
    internal.r_size =             \
67
0
      ((howto->complain_on_overflow == complain_overflow_signed    \
68
0
  ? 0x80                \
69
0
  : 0)               \
70
0
       | (howto->bitsize - 1));           \
71
0
  }
72
73
206k
#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3)
74
#define COFF_LONG_FILENAMES
75
#define NO_COFF_SYMBOLS
76
4
#define RTYPE2HOWTO(cache_ptr, dst) xcoff_rtype2howto (cache_ptr, dst)
77
1.82k
#define coff_mkobject _bfd_xcoff_mkobject
78
#define coff_bfd_is_local_label_name _bfd_xcoff_is_local_label_name
79
#ifdef AIX_CORE
80
extern bfd_cleanup rs6000coff_core_p (bfd *abfd);
81
extern bool rs6000coff_core_file_matches_executable_p
82
  (bfd *cbfd, bfd *ebfd);
83
extern char *rs6000coff_core_file_failing_command (bfd *abfd);
84
extern int rs6000coff_core_file_failing_signal (bfd *abfd);
85
#define CORE_FILE_P rs6000coff_core_p
86
#define coff_core_file_failing_command \
87
  rs6000coff_core_file_failing_command
88
#define coff_core_file_failing_signal \
89
  rs6000coff_core_file_failing_signal
90
#define coff_core_file_matches_executable_p \
91
  rs6000coff_core_file_matches_executable_p
92
#define coff_core_file_pid \
93
  _bfd_nocore_core_file_pid
94
#else
95
#define CORE_FILE_P _bfd_dummy_target
96
#define coff_core_file_failing_command \
97
  _bfd_nocore_core_file_failing_command
98
#define coff_core_file_failing_signal \
99
  _bfd_nocore_core_file_failing_signal
100
#define coff_core_file_matches_executable_p \
101
  _bfd_nocore_core_file_matches_executable_p
102
#define coff_core_file_pid \
103
  _bfd_nocore_core_file_pid
104
#endif
105
#define coff_SWAP_sym_in _bfd_xcoff_swap_sym_in
106
#define coff_SWAP_sym_out _bfd_xcoff_swap_sym_out
107
#define coff_SWAP_aux_in _bfd_xcoff_swap_aux_in
108
#define coff_SWAP_aux_out _bfd_xcoff_swap_aux_out
109
#define coff_swap_reloc_in xcoff_swap_reloc_in
110
0
#define coff_swap_reloc_out xcoff_swap_reloc_out
111
#define NO_COFF_RELOCS
112
113
#ifndef bfd_pe_print_pdata
114
#define bfd_pe_print_pdata  NULL
115
#endif
116
117
#include "coffcode.h"
118
119
/* The main body of code is in coffcode.h.  */
120
121
static const char *normalize_filename (bfd *);
122
static bool xcoff_write_armap_old
123
  (bfd *, unsigned int, struct orl *, unsigned int, int);
124
static bool xcoff_write_armap_big
125
  (bfd *, unsigned int, struct orl *, unsigned int, int);
126
static bool xcoff_write_archive_contents_old (bfd *);
127
static bool xcoff_write_archive_contents_big (bfd *);
128
static void xcoff_swap_ldhdr_in (bfd *, const void *, struct internal_ldhdr *);
129
static void xcoff_swap_ldhdr_out (bfd *, const struct internal_ldhdr *, void *);
130
static void xcoff_swap_ldsym_in (bfd *, const void *, struct internal_ldsym *);
131
static void xcoff_swap_ldsym_out (bfd *, const struct internal_ldsym *, void *);
132
static void xcoff_swap_ldrel_in (bfd *, const void *, struct internal_ldrel *);
133
static void xcoff_swap_ldrel_out (bfd *, const struct internal_ldrel *, void *);
134
static bool xcoff_ppc_relocate_section
135
  (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
136
   struct internal_reloc *, struct internal_syment *, asection **);
137
static bool _bfd_xcoff_put_ldsymbol_name
138
  (bfd *, struct xcoff_loader_info *, struct internal_ldsym *, const char *);
139
static asection *xcoff_create_csect_from_smclas
140
  (bfd *, union internal_auxent *, const char *);
141
static bool xcoff_is_lineno_count_overflow (bfd *, bfd_vma);
142
static bool xcoff_is_reloc_count_overflow (bfd *, bfd_vma);
143
static bfd_vma xcoff_loader_symbol_offset (bfd *, struct internal_ldhdr *);
144
static bfd_vma xcoff_loader_reloc_offset (bfd *, struct internal_ldhdr *);
145
static bool xcoff_generate_rtinit
146
  (bfd *, const char *, const char *, bool);
147
static bool do_pad (bfd *, unsigned int);
148
static bool do_copy (bfd *, bfd *);
149
150
/* Relocation functions */
151
static xcoff_reloc_function xcoff_reloc_type_br;
152
153
static xcoff_complain_function xcoff_complain_overflow_dont_func;
154
static xcoff_complain_function xcoff_complain_overflow_bitfield_func;
155
static xcoff_complain_function xcoff_complain_overflow_signed_func;
156
static xcoff_complain_function xcoff_complain_overflow_unsigned_func;
157
158
xcoff_reloc_function *const
159
xcoff_calculate_relocation[XCOFF_MAX_CALCULATE_RELOCATION] =
160
{
161
  xcoff_reloc_type_pos,  /* R_POS   (0x00) */
162
  xcoff_reloc_type_neg,  /* R_NEG   (0x01) */
163
  xcoff_reloc_type_rel,  /* R_REL   (0x02) */
164
  xcoff_reloc_type_toc,  /* R_TOC   (0x03) */
165
  xcoff_reloc_type_toc,  /* R_TRL   (0x04) */
166
  xcoff_reloc_type_toc,  /* R_GL    (0x05) */
167
  xcoff_reloc_type_toc,  /* R_TCL   (0x06) */
168
  xcoff_reloc_type_fail, /*         (0x07) */
169
  xcoff_reloc_type_ba,   /* R_BA    (0x08) */
170
  xcoff_reloc_type_fail, /*         (0x09) */
171
  xcoff_reloc_type_br,   /* R_BR    (0x0a) */
172
  xcoff_reloc_type_fail, /*         (0x0b) */
173
  xcoff_reloc_type_pos,  /* R_RL    (0x0c) */
174
  xcoff_reloc_type_pos,  /* R_RLA   (0x0d) */
175
  xcoff_reloc_type_fail, /*         (0x0e) */
176
  xcoff_reloc_type_noop, /* R_REF   (0x0f) */
177
  xcoff_reloc_type_fail, /*         (0x10) */
178
  xcoff_reloc_type_fail, /*         (0x11) */
179
  xcoff_reloc_type_fail, /*         (0x12) */
180
  xcoff_reloc_type_toc,  /* R_TRLA  (0x13) */
181
  xcoff_reloc_type_fail, /* R_RRTBI (0x14) */
182
  xcoff_reloc_type_fail, /* R_RRTBA (0x15) */
183
  xcoff_reloc_type_ba,   /* R_CAI   (0x16) */
184
  xcoff_reloc_type_crel, /* R_CREL  (0x17) */
185
  xcoff_reloc_type_ba,   /* R_RBA   (0x18) */
186
  xcoff_reloc_type_ba,   /* R_RBAC  (0x19) */
187
  xcoff_reloc_type_br,   /* R_RBR   (0x1a) */
188
  xcoff_reloc_type_ba,   /* R_RBRC  (0x1b) */
189
  xcoff_reloc_type_fail, /*           (0x1c) */
190
  xcoff_reloc_type_fail, /*           (0x1d) */
191
  xcoff_reloc_type_fail, /*           (0x1e) */
192
  xcoff_reloc_type_fail, /*           (0x1f) */
193
  xcoff_reloc_type_tls,  /* R_TLS     (0x20) */
194
  xcoff_reloc_type_tls,  /* R_TLS_IE  (0x21) */
195
  xcoff_reloc_type_tls,  /* R_TLS_LD  (0x22) */
196
  xcoff_reloc_type_tls,  /* R_TLS_LE  (0x23) */
197
  xcoff_reloc_type_tls,  /* R_TLSM    (0x24) */
198
  xcoff_reloc_type_tls,  /* R_TLSML   (0x25) */
199
  xcoff_reloc_type_fail, /*           (0x26) */
200
  xcoff_reloc_type_fail, /*           (0x27) */
201
  xcoff_reloc_type_fail, /*           (0x28) */
202
  xcoff_reloc_type_fail, /*           (0x29) */
203
  xcoff_reloc_type_fail, /*           (0x2a) */
204
  xcoff_reloc_type_fail, /*           (0x2b) */
205
  xcoff_reloc_type_fail, /*           (0x2c) */
206
  xcoff_reloc_type_fail, /*           (0x2d) */
207
  xcoff_reloc_type_fail, /*           (0x2e) */
208
  xcoff_reloc_type_fail, /*           (0x2f) */
209
  xcoff_reloc_type_toc,  /* R_TOCU    (0x30) */
210
  xcoff_reloc_type_toc,  /* R_TOCL    (0x31) */
211
};
212
213
xcoff_complain_function *const
214
xcoff_complain_overflow[XCOFF_MAX_COMPLAIN_OVERFLOW] =
215
{
216
  xcoff_complain_overflow_dont_func,
217
  xcoff_complain_overflow_bitfield_func,
218
  xcoff_complain_overflow_signed_func,
219
  xcoff_complain_overflow_unsigned_func,
220
};
221
222
/* Information about one member of an archive.  */
223
struct member_layout
224
{
225
  /* The archive member that this structure describes.  */
226
  bfd *member;
227
228
  /* The number of bytes of padding that must be inserted before the
229
     start of the member in order to ensure that the section contents
230
     are correctly aligned.  */
231
  unsigned int leading_padding;
232
233
  /* The offset of MEMBER from the start of the archive (i.e. the end
234
     of the leading padding).  */
235
  file_ptr offset;
236
237
  /* The normalized name of MEMBER.  */
238
  const char *name;
239
240
  /* The length of NAME, without padding.  */
241
  bfd_size_type namlen;
242
243
  /* The length of NAME, with padding.  */
244
  bfd_size_type padded_namlen;
245
246
  /* The size of MEMBER's header, including the name and magic sequence.  */
247
  bfd_size_type header_size;
248
249
  /* The size of the MEMBER's contents.  */
250
  bfd_size_type contents_size;
251
252
  /* The number of bytes of padding that must be inserted after MEMBER
253
     in order to preserve even alignment.  */
254
  bfd_size_type trailing_padding;
255
};
256
257
/* A structure used for iterating over the members of an archive.  */
258
struct archive_iterator
259
{
260
  /* The archive itself.  */
261
  bfd *archive;
262
263
  /* Information about the current archive member.  */
264
  struct member_layout current;
265
266
  /* Information about the next archive member.  MEMBER is null if there
267
     are no more archive members, in which case OFFSET is the offset of
268
     the first unused byte.  */
269
  struct member_layout next;
270
};
271
272
/* Initialize INFO so that it describes member MEMBER of archive ARCHIVE.
273
   OFFSET is the even-padded offset of MEMBER, not including any leading
274
   padding needed for section alignment.  */
275
276
static void
277
member_layout_init (struct member_layout *info, bfd *archive,
278
        bfd *member, file_ptr offset)
279
333
{
280
333
  info->member = member;
281
333
  info->leading_padding = 0;
282
333
  if (member)
283
25
    {
284
25
      info->name = normalize_filename (member);
285
25
      info->namlen = strlen (info->name);
286
25
      info->padded_namlen = info->namlen + (info->namlen & 1);
287
25
      if (xcoff_big_format_p (archive))
288
25
  info->header_size = SIZEOF_AR_HDR_BIG;
289
0
      else
290
0
  info->header_size = SIZEOF_AR_HDR;
291
25
      info->header_size += info->padded_namlen + SXCOFFARFMAG;
292
25
      info->contents_size = arelt_size (member);
293
25
      info->trailing_padding = info->contents_size & 1;
294
295
25
      if (bfd_check_format (member, bfd_object)
296
1
    && bfd_get_flavour (member) == bfd_target_xcoff_flavour
297
0
    && (member->flags & DYNAMIC) != 0)
298
0
  info->leading_padding
299
0
    = (-(offset + info->header_size)
300
0
       & ((1 << bfd_xcoff_text_align_power (member)) - 1));
301
25
    }
302
333
  info->offset = offset + info->leading_padding;
303
333
}
304
305
/* Set up ITERATOR to iterate through archive ARCHIVE.  */
306
307
static void
308
archive_iterator_begin (struct archive_iterator *iterator,
309
      bfd *archive)
310
308
{
311
308
  iterator->archive = archive;
312
308
  member_layout_init (&iterator->next, archive, archive->archive_head,
313
308
          xcoff_big_format_p (archive)
314
308
          ? SIZEOF_AR_FILE_HDR_BIG
315
308
          : SIZEOF_AR_FILE_HDR);
316
308
}
317
318
/* Make ITERATOR visit the first unvisited archive member.  Return true
319
   on success; return false if all members have been visited.  */
320
321
static bool
322
archive_iterator_next (struct archive_iterator *iterator)
323
333
{
324
333
  if (!iterator->next.member)
325
308
    return false;
326
327
25
  iterator->current = iterator->next;
328
25
  member_layout_init (&iterator->next, iterator->archive,
329
25
          iterator->current.member->archive_next,
330
25
          iterator->current.offset
331
25
          + iterator->current.header_size
332
25
          + iterator->current.contents_size
333
25
          + iterator->current.trailing_padding);
334
25
  return true;
335
333
}
336
337
/* We use our own tdata type.  Its first field is the COFF tdata type,
338
   so the COFF routines are compatible.  */
339
340
bool
341
_bfd_xcoff_mkobject (bfd *abfd)
342
4.59k
{
343
4.59k
  coff_data_type *coff;
344
4.59k
  size_t amt = sizeof (struct xcoff_tdata);
345
346
4.59k
  abfd->tdata.xcoff_obj_data = (struct xcoff_tdata *) bfd_zalloc (abfd, amt);
347
4.59k
  if (abfd->tdata.xcoff_obj_data == NULL)
348
0
    return false;
349
4.59k
  coff = coff_data (abfd);
350
4.59k
  coff->symbols = (coff_symbol_type *) NULL;
351
4.59k
  coff->conversion_table = (unsigned int *) NULL;
352
4.59k
  coff->raw_syments = (struct coff_ptr_struct *) NULL;
353
4.59k
  coff->relocbase = 0;
354
355
4.59k
  xcoff_data (abfd)->modtype = ('1' << 8) | 'L';
356
357
  /* We set cputype to -1 to indicate that it has not been
358
     initialized.  */
359
4.59k
  xcoff_data (abfd)->cputype = -1;
360
361
4.59k
  xcoff_data (abfd)->csects = NULL;
362
4.59k
  xcoff_data (abfd)->debug_indices = NULL;
363
364
  /* text section alignment is different than the default */
365
4.59k
  bfd_xcoff_text_align_power (abfd) = 2;
366
367
4.59k
  return true;
368
4.59k
}
369
370
/* Copy XCOFF data from one BFD to another.  */
371
372
bool
373
_bfd_xcoff_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
374
111
{
375
111
  struct xcoff_tdata *ix, *ox;
376
111
  asection *sec;
377
378
111
  if (ibfd->xvec != obfd->xvec)
379
0
    return true;
380
111
  ix = xcoff_data (ibfd);
381
111
  ox = xcoff_data (obfd);
382
111
  ox->full_aouthdr = ix->full_aouthdr;
383
111
  ox->toc = ix->toc;
384
111
  if (ix->sntoc == 0)
385
90
    ox->sntoc = 0;
386
21
  else
387
21
    {
388
21
      sec = coff_section_from_bfd_index (ibfd, ix->sntoc);
389
21
      if (sec == NULL || sec->output_section == NULL)
390
1
  ox->sntoc = 0;
391
20
      else
392
20
  ox->sntoc = sec->output_section->target_index;
393
21
    }
394
111
  if (ix->snentry == 0)
395
95
    ox->snentry = 0;
396
16
  else
397
16
    {
398
16
      sec = coff_section_from_bfd_index (ibfd, ix->snentry);
399
16
      if (sec == NULL || sec->output_section == NULL)
400
2
  ox->snentry = 0;
401
14
      else
402
14
  ox->snentry = sec->output_section->target_index;
403
16
    }
404
111
  bfd_xcoff_text_align_power (obfd) = bfd_xcoff_text_align_power (ibfd);
405
111
  bfd_xcoff_data_align_power (obfd) = bfd_xcoff_data_align_power (ibfd);
406
111
  ox->modtype = ix->modtype;
407
111
  ox->cputype = ix->cputype;
408
111
  ox->maxdata = ix->maxdata;
409
111
  ox->maxstack = ix->maxstack;
410
111
  return true;
411
111
}
412
413
/* I don't think XCOFF really has a notion of local labels based on
414
   name.  This will mean that ld -X doesn't actually strip anything.
415
   The AIX native linker does not have a -X option, and it ignores the
416
   -x option.  */
417
418
bool
419
_bfd_xcoff_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
420
        const char *name ATTRIBUTE_UNUSED)
421
0
{
422
0
  return false;
423
0
}
424

425
void
426
_bfd_xcoff_swap_sym_in (bfd *abfd, void * ext1, void * in1)
427
22.8k
{
428
22.8k
  SYMENT *ext = (SYMENT *)ext1;
429
22.8k
  struct internal_syment * in = (struct internal_syment *)in1;
430
431
22.8k
  if (ext->e.e_name[0] != 0)
432
8.33k
    {
433
8.33k
      memcpy (in->_n._n_name, ext->e.e_name, SYMNMLEN);
434
8.33k
    }
435
14.5k
  else
436
14.5k
    {
437
14.5k
      in->_n._n_n._n_zeroes = 0;
438
14.5k
      in->_n._n_n._n_offset = H_GET_32 (abfd, ext->e.e.e_offset);
439
14.5k
    }
440
441
22.8k
  in->n_value = H_GET_32 (abfd, ext->e_value);
442
22.8k
  in->n_scnum = (short) H_GET_16 (abfd, ext->e_scnum);
443
22.8k
  in->n_type = H_GET_16 (abfd, ext->e_type);
444
22.8k
  in->n_sclass = H_GET_8 (abfd, ext->e_sclass);
445
22.8k
  in->n_numaux = H_GET_8 (abfd, ext->e_numaux);
446
22.8k
}
447
448
unsigned int
449
_bfd_xcoff_swap_sym_out (bfd *abfd, void * inp, void * extp)
450
15
{
451
15
  struct internal_syment *in = (struct internal_syment *)inp;
452
15
  SYMENT *ext =(SYMENT *)extp;
453
454
15
  if (in->_n._n_name[0] != 0)
455
10
    {
456
10
      memcpy (ext->e.e_name, in->_n._n_name, SYMNMLEN);
457
10
    }
458
5
  else
459
5
    {
460
5
      H_PUT_32 (abfd, 0, ext->e.e.e_zeroes);
461
5
      H_PUT_32 (abfd, in->_n._n_n._n_offset, ext->e.e.e_offset);
462
5
    }
463
464
15
  H_PUT_32 (abfd, in->n_value, ext->e_value);
465
15
  H_PUT_16 (abfd, in->n_scnum, ext->e_scnum);
466
15
  H_PUT_16 (abfd, in->n_type, ext->e_type);
467
15
  H_PUT_8 (abfd, in->n_sclass, ext->e_sclass);
468
15
  H_PUT_8 (abfd, in->n_numaux, ext->e_numaux);
469
15
  return bfd_coff_symesz (abfd);
470
15
}
471
472
void
473
_bfd_xcoff_swap_aux_in (bfd *abfd, void * ext1, int type ATTRIBUTE_UNUSED,
474
      int in_class, int indx, int numaux, void * in1)
475
72.8k
{
476
72.8k
  AUXENT * ext = (AUXENT *)ext1;
477
72.8k
  union internal_auxent *in = (union internal_auxent *)in1;
478
479
72.8k
  switch (in_class)
480
72.8k
    {
481
50.2k
    default:
482
50.2k
      _bfd_error_handler
483
  /* xgettext: c-format */
484
50.2k
  (_("%pB: unsupported swap_aux_in for storage class %#x"),
485
50.2k
   abfd, (unsigned int) in_class);
486
50.2k
      bfd_set_error (bfd_error_bad_value);
487
50.2k
      break;
488
489
4.03k
    case C_FILE:
490
4.03k
      if (ext->x_file.x_n.x_fname[0] == 0)
491
1.08k
  {
492
1.08k
    in->x_file.x_n.x_n.x_zeroes = 0;
493
1.08k
    in->x_file.x_n.x_n.x_offset =
494
1.08k
      H_GET_32 (abfd, ext->x_file.x_n.x_n.x_offset);
495
1.08k
  }
496
2.94k
      else
497
2.94k
  memcpy (in->x_file.x_n.x_fname, ext->x_file.x_n.x_fname, FILNMLEN);
498
4.03k
      in->x_file.x_ftype = H_GET_8 (abfd, ext->x_file.x_ftype);
499
4.03k
      break;
500
501
      /* RS/6000 "csect" auxents.
502
         There is always a CSECT auxiliary entry. But functions can
503
         have FCN ones too. In this case, CSECT is always the last
504
         one. */
505
3.90k
    case C_EXT:
506
6.55k
    case C_AIX_WEAKEXT:
507
8.54k
    case C_HIDEXT:
508
8.54k
      if (indx + 1 == numaux)
509
1.42k
  {
510
1.42k
    in->x_csect.x_scnlen.u64 = H_GET_32 (abfd, ext->x_csect.x_scnlen);
511
1.42k
    in->x_csect.x_parmhash = H_GET_32 (abfd, ext->x_csect.x_parmhash);
512
1.42k
    in->x_csect.x_snhash   = H_GET_16 (abfd, ext->x_csect.x_snhash);
513
    /* We don't have to hack bitfields in x_smtyp because it's
514
       defined by shifts-and-ands, which are equivalent on all
515
       byte orders.  */
516
1.42k
    in->x_csect.x_smtyp    = H_GET_8 (abfd, ext->x_csect.x_smtyp);
517
1.42k
    in->x_csect.x_smclas   = H_GET_8 (abfd, ext->x_csect.x_smclas);
518
1.42k
    in->x_csect.x_stab     = H_GET_32 (abfd, ext->x_csect.x_stab);
519
1.42k
    in->x_csect.x_snstab   = H_GET_16 (abfd, ext->x_csect.x_snstab);
520
1.42k
  }
521
7.12k
      else
522
7.12k
  {
523
    /* x_exptr isn't supported.  */
524
7.12k
    in->x_sym.x_misc.x_fsize
525
7.12k
      = H_GET_32 (abfd, ext->x_fcn.x_fsize);
526
7.12k
    in->x_sym.x_fcnary.x_fcn.x_lnnoptr
527
7.12k
      = H_GET_32 (abfd, ext->x_fcn.x_lnnoptr);
528
7.12k
    in->x_sym.x_fcnary.x_fcn.x_endndx.u32
529
7.12k
      = H_GET_32 (abfd, ext->x_fcn.x_endndx);
530
7.12k
  }
531
8.54k
      break;
532
533
2.53k
    case C_STAT:
534
2.53k
      in->x_scn.x_scnlen = H_GET_32 (abfd, ext->x_scn.x_scnlen);
535
2.53k
      in->x_scn.x_nreloc = H_GET_16 (abfd, ext->x_scn.x_nreloc);
536
2.53k
      in->x_scn.x_nlinno = H_GET_16 (abfd, ext->x_scn.x_nlinno);
537
      /* PE defines some extra fields; we zero them out for
538
   safety.  */
539
2.53k
      in->x_scn.x_checksum = 0;
540
2.53k
      in->x_scn.x_associated = 0;
541
2.53k
      in->x_scn.x_comdat = 0;
542
2.53k
      break;
543
544
1.62k
    case C_BLOCK:
545
3.38k
    case C_FCN:
546
3.38k
      in->x_sym.x_misc.x_lnsz.x_lnno
547
3.38k
  = H_GET_32 (abfd, ext->x_sym.x_lnno);
548
3.38k
      break;
549
550
4.08k
    case C_DWARF:
551
4.08k
      in->x_sect.x_scnlen = H_GET_32 (abfd, ext->x_sect.x_scnlen);
552
4.08k
      in->x_sect.x_nreloc = H_GET_32 (abfd, ext->x_sect.x_nreloc);
553
4.08k
      break;
554
555
72.8k
    }
556
72.8k
}
557
558
unsigned int
559
_bfd_xcoff_swap_aux_out (bfd *abfd, void * inp, int type ATTRIBUTE_UNUSED,
560
       int in_class, int indx, int numaux, void * extp)
561
23
{
562
23
  union internal_auxent *in = (union internal_auxent *)inp;
563
23
  AUXENT *ext = (AUXENT *)extp;
564
565
23
  memset (ext, 0, bfd_coff_auxesz (abfd));
566
23
  switch (in_class)
567
23
    {
568
6
    default:
569
6
      _bfd_error_handler
570
  /* xgettext: c-format */
571
6
  (_("%pB: unsupported swap_aux_out for storage class %#x"),
572
6
   abfd, (unsigned int) in_class);
573
6
      bfd_set_error (bfd_error_bad_value);
574
6
      break;
575
576
3
    case C_FILE:
577
3
      if (in->x_file.x_n.x_fname[0] == 0)
578
0
  {
579
0
    H_PUT_32 (abfd, 0, ext->x_file.x_n.x_n.x_zeroes);
580
0
    H_PUT_32 (abfd, in->x_file.x_n.x_n.x_offset,
581
0
        ext->x_file.x_n.x_n.x_offset);
582
0
  }
583
3
      else
584
3
  memcpy (ext->x_file.x_n.x_fname, in->x_file.x_n.x_fname, FILNMLEN);
585
3
      H_PUT_8 (abfd, in->x_file.x_ftype, ext->x_file.x_ftype);
586
3
      break;
587
588
      /* RS/6000 "csect" auxents */
589
5
    case C_EXT:
590
5
    case C_AIX_WEAKEXT:
591
7
    case C_HIDEXT:
592
7
      if (indx + 1 == numaux)
593
3
  {
594
3
    H_PUT_32 (abfd, in->x_csect.x_scnlen.u64, ext->x_csect.x_scnlen);
595
3
    H_PUT_32 (abfd, in->x_csect.x_parmhash, ext->x_csect.x_parmhash);
596
3
    H_PUT_16 (abfd, in->x_csect.x_snhash, ext->x_csect.x_snhash);
597
    /* We don't have to hack bitfields in x_smtyp because it's
598
       defined by shifts-and-ands, which are equivalent on all
599
       byte orders.  */
600
3
    H_PUT_8 (abfd, in->x_csect.x_smtyp, ext->x_csect.x_smtyp);
601
3
    H_PUT_8 (abfd, in->x_csect.x_smclas, ext->x_csect.x_smclas);
602
3
    H_PUT_32 (abfd, in->x_csect.x_stab, ext->x_csect.x_stab);
603
3
    H_PUT_16 (abfd, in->x_csect.x_snstab, ext->x_csect.x_snstab);
604
3
  }
605
4
      else
606
4
  {
607
4
    H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize, ext->x_fcn.x_fsize);
608
4
    H_PUT_32 (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr,
609
4
        ext->x_fcn.x_lnnoptr);
610
4
    H_PUT_32 (abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.u32,
611
4
        ext->x_fcn.x_endndx);
612
4
  }
613
7
      break;
614
615
0
    case C_STAT:
616
0
      H_PUT_32 (abfd, in->x_scn.x_scnlen, ext->x_scn.x_scnlen);
617
0
      H_PUT_16 (abfd, in->x_scn.x_nreloc, ext->x_scn.x_nreloc);
618
0
      H_PUT_16 (abfd, in->x_scn.x_nlinno, ext->x_scn.x_nlinno);
619
0
      break;
620
621
0
    case C_BLOCK:
622
0
    case C_FCN:
623
0
      H_PUT_32 (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext->x_sym.x_lnno);
624
0
      break;
625
626
7
    case C_DWARF:
627
7
      H_PUT_32 (abfd, in->x_sect.x_scnlen, ext->x_sect.x_scnlen);
628
7
      H_PUT_32 (abfd, in->x_sect.x_nreloc, ext->x_sect.x_nreloc);
629
7
      break;
630
23
    }
631
632
23
  return bfd_coff_auxesz (abfd);
633
23
}
634

635
/* The XCOFF reloc table.
636
   XCOFF relocations aren't defined only by the type field r_type.
637
   The bitsize and whether they are signed or not, are defined by
638
   r_size field.  Thus, it's complicated to create a constant
639
   table reference every possible relocation.
640
   This table contains the "default" relocation and few modified
641
   relocations what were already there.  It's enough when
642
   xcoff_rtype2howto is called.
643
   For relocations from an input bfd to an output bfd, the default
644
   relocation is retrieved and when manually adapted.
645
646
   For now, it seems to be enought.  */
647
648
reloc_howto_type xcoff_howto_table[] =
649
{
650
  /* 0x00: Standard 32 bit relocation.  */
651
  HOWTO (R_POS,     /* type */
652
   0,     /* rightshift */
653
   4,     /* size */
654
   32,      /* bitsize */
655
   false,     /* pc_relative */
656
   0,     /* bitpos */
657
   complain_overflow_bitfield, /* complain_on_overflow */
658
   0,     /* special_function */
659
   "R_POS",   /* name */
660
   true,      /* partial_inplace */
661
   0xffffffff,    /* src_mask */
662
   0xffffffff,    /* dst_mask */
663
   false),    /* pcrel_offset */
664
665
  /* 0x01: 32 bit relocation, but store negative value.  */
666
  HOWTO (R_NEG,     /* type */
667
   0,     /* rightshift */
668
   -4,      /* size */
669
   32,      /* bitsize */
670
   false,     /* pc_relative */
671
   0,     /* bitpos */
672
   complain_overflow_bitfield, /* complain_on_overflow */
673
   0,     /* special_function */
674
   "R_NEG",   /* name */
675
   true,      /* partial_inplace */
676
   0xffffffff,    /* src_mask */
677
   0xffffffff,    /* dst_mask */
678
   false),    /* pcrel_offset */
679
680
  /* 0x02: 32 bit PC relative relocation.  */
681
  HOWTO (R_REL,     /* type */
682
   0,     /* rightshift */
683
   4,     /* size */
684
   32,      /* bitsize */
685
   true,      /* pc_relative */
686
   0,     /* bitpos */
687
   complain_overflow_signed, /* complain_on_overflow */
688
   0,     /* special_function */
689
   "R_REL",   /* name */
690
   true,      /* partial_inplace */
691
   0xffffffff,    /* src_mask */
692
   0xffffffff,    /* dst_mask */
693
   false),    /* pcrel_offset */
694
695
  /* 0x03: 16 bit TOC relative relocation.  */
696
  HOWTO (R_TOC,     /* type */
697
   0,     /* rightshift */
698
   2,     /* size */
699
   16,      /* bitsize */
700
   false,     /* pc_relative */
701
   0,     /* bitpos */
702
   complain_overflow_bitfield, /* complain_on_overflow */
703
   0,     /* special_function */
704
   "R_TOC",   /* name */
705
   true,      /* partial_inplace */
706
   0,     /* src_mask */
707
   0xffff,    /* dst_mask */
708
   false),    /* pcrel_offset */
709
710
  /* 0x04: Same as R_TOC  */
711
  HOWTO (R_TRL,     /* type */
712
   0,     /* rightshift */
713
   2,     /* size */
714
   16,      /* bitsize */
715
   false,     /* pc_relative */
716
   0,     /* bitpos */
717
   complain_overflow_bitfield, /* complain_on_overflow */
718
   0,     /* special_function */
719
   "R_TRL",   /* name */
720
   true,      /* partial_inplace */
721
   0,     /* src_mask */
722
   0xffff,    /* dst_mask */
723
   false),    /* pcrel_offset */
724
725
  /* 0x05: External TOC relative symbol.  */
726
  HOWTO (R_GL,      /* type */
727
   0,     /* rightshift */
728
   2,     /* size */
729
   16,      /* bitsize */
730
   false,     /* pc_relative */
731
   0,     /* bitpos */
732
   complain_overflow_bitfield, /* complain_on_overflow */
733
   0,     /* special_function */
734
   "R_GL",    /* name */
735
   true,      /* partial_inplace */
736
   0,     /* src_mask */
737
   0xffff,    /* dst_mask */
738
   false),    /* pcrel_offset */
739
740
  /* 0x06: Local TOC relative symbol.  */
741
  HOWTO (R_TCL,     /* type */
742
   0,     /* rightshift */
743
   2,     /* size */
744
   16,      /* bitsize */
745
   false,     /* pc_relative */
746
   0,     /* bitpos */
747
   complain_overflow_bitfield, /* complain_on_overflow */
748
   0,     /* special_function */
749
   "R_TCL",   /* name */
750
   true,      /* partial_inplace */
751
   0,     /* src_mask */
752
   0xffff,    /* dst_mask */
753
   false),    /* pcrel_offset */
754
755
  EMPTY_HOWTO (7),
756
757
  /* 0x08: Same as R_RBA.  */
758
  HOWTO (R_BA,      /* type */
759
   0,     /* rightshift */
760
   4,     /* size */
761
   26,      /* bitsize */
762
   false,     /* pc_relative */
763
   0,     /* bitpos */
764
   complain_overflow_bitfield, /* complain_on_overflow */
765
   0,     /* special_function */
766
   "R_BA_26",   /* name */
767
   true,      /* partial_inplace */
768
   0x03fffffc,    /* src_mask */
769
   0x03fffffc,    /* dst_mask */
770
   false),    /* pcrel_offset */
771
772
  EMPTY_HOWTO (9),
773
774
  /* 0x0a: Same as R_RBR.  */
775
  HOWTO (R_BR,      /* type */
776
   0,     /* rightshift */
777
   4,     /* size */
778
   26,      /* bitsize */
779
   true,      /* pc_relative */
780
   0,     /* bitpos */
781
   complain_overflow_signed, /* complain_on_overflow */
782
   0,     /* special_function */
783
   "R_BR",    /* name */
784
   true,      /* partial_inplace */
785
   0x03fffffc,    /* src_mask */
786
   0x03fffffc,    /* dst_mask */
787
   false),    /* pcrel_offset */
788
789
  EMPTY_HOWTO (0xb),
790
791
  /* 0x0c: Same as R_POS.  */
792
  HOWTO (R_RL,      /* type */
793
   0,     /* rightshift */
794
   4,     /* size */
795
   32,      /* bitsize */
796
   false,     /* pc_relative */
797
   0,     /* bitpos */
798
   complain_overflow_bitfield, /* complain_on_overflow */
799
   0,     /* special_function */
800
   "R_RL",    /* name */
801
   true,      /* partial_inplace */
802
   0xffffffff,    /* src_mask */
803
   0xffffffff,    /* dst_mask */
804
   false),    /* pcrel_offset */
805
806
  /* 0x0d: Same as R_POS.  */
807
  HOWTO (R_RLA,     /* type */
808
   0,     /* rightshift */
809
   4,     /* size */
810
   32,      /* bitsize */
811
   false,     /* pc_relative */
812
   0,     /* bitpos */
813
   complain_overflow_bitfield, /* complain_on_overflow */
814
   0,     /* special_function */
815
   "R_RLA",   /* name */
816
   true,      /* partial_inplace */
817
   0xffffffff,    /* src_mask */
818
   0xffffffff,    /* dst_mask */
819
   false),    /* pcrel_offset */
820
821
  EMPTY_HOWTO (0xe),
822
823
  /* 0x0f: Non-relocating reference.  Bitsize is 1 so that r_rsize is 0.  */
824
  HOWTO (R_REF,     /* type */
825
   0,     /* rightshift */
826
   1,     /* size */
827
   1,     /* bitsize */
828
   false,     /* pc_relative */
829
   0,     /* bitpos */
830
   complain_overflow_dont, /* complain_on_overflow */
831
   0,     /* special_function */
832
   "R_REF",   /* name */
833
   false,     /* partial_inplace */
834
   0,     /* src_mask */
835
   0,     /* dst_mask */
836
   false),    /* pcrel_offset */
837
838
  EMPTY_HOWTO (0x10),
839
  EMPTY_HOWTO (0x11),
840
  EMPTY_HOWTO (0x12),
841
842
  /* 0x13: Same as R_TOC.  */
843
  HOWTO (R_TRLA,    /* type */
844
   0,     /* rightshift */
845
   2,     /* size */
846
   16,      /* bitsize */
847
   false,     /* pc_relative */
848
   0,     /* bitpos */
849
   complain_overflow_bitfield, /* complain_on_overflow */
850
   0,     /* special_function */
851
   "R_TRLA",    /* name */
852
   true,      /* partial_inplace */
853
   0,     /* src_mask */
854
   0xffff,    /* dst_mask */
855
   false),    /* pcrel_offset */
856
857
  /* 0x14: Modifiable relative branch.  */
858
  HOWTO (R_RRTBI,   /* type */
859
   1,     /* rightshift */
860
   4,     /* size */
861
   32,      /* bitsize */
862
   false,     /* pc_relative */
863
   0,     /* bitpos */
864
   complain_overflow_bitfield, /* complain_on_overflow */
865
   0,     /* special_function */
866
   "R_RRTBI",   /* name */
867
   true,      /* partial_inplace */
868
   0xffffffff,    /* src_mask */
869
   0xffffffff,    /* dst_mask */
870
   false),    /* pcrel_offset */
871
872
  /* 0x15: Modifiable absolute branch.  */
873
  HOWTO (R_RRTBA,   /* type */
874
   1,     /* rightshift */
875
   4,     /* size */
876
   32,      /* bitsize */
877
   false,     /* pc_relative */
878
   0,     /* bitpos */
879
   complain_overflow_bitfield, /* complain_on_overflow */
880
   0,     /* special_function */
881
   "R_RRTBA",   /* name */
882
   true,      /* partial_inplace */
883
   0xffffffff,    /* src_mask */
884
   0xffffffff,    /* dst_mask */
885
   false),    /* pcrel_offset */
886
887
  /* 0x16: Modifiable call absolute indirect.  */
888
  HOWTO (R_CAI,     /* type */
889
   0,     /* rightshift */
890
   2,     /* size */
891
   16,      /* bitsize */
892
   false,     /* pc_relative */
893
   0,     /* bitpos */
894
   complain_overflow_bitfield, /* complain_on_overflow */
895
   0,     /* special_function */
896
   "R_CAI",   /* name */
897
   true,      /* partial_inplace */
898
   0xffff,    /* src_mask */
899
   0xffff,    /* dst_mask */
900
   false),    /* pcrel_offset */
901
902
  /* 0x17: Modifiable call relative.  */
903
  HOWTO (R_CREL,    /* type */
904
   0,     /* rightshift */
905
   2,     /* size */
906
   16,      /* bitsize */
907
   false,     /* pc_relative */
908
   0,     /* bitpos */
909
   complain_overflow_bitfield, /* complain_on_overflow */
910
   0,     /* special_function */
911
   "R_CREL",    /* name */
912
   true,      /* partial_inplace */
913
   0xffff,    /* src_mask */
914
   0xffff,    /* dst_mask */
915
   false),    /* pcrel_offset */
916
917
  /* 0x18: Modifiable branch absolute.  */
918
  HOWTO (R_RBA,     /* type */
919
   0,     /* rightshift */
920
   4,     /* size */
921
   26,      /* bitsize */
922
   false,     /* pc_relative */
923
   0,     /* bitpos */
924
   complain_overflow_bitfield, /* complain_on_overflow */
925
   0,     /* special_function */
926
   "R_RBA",   /* name */
927
   true,      /* partial_inplace */
928
   0x03fffffc,    /* src_mask */
929
   0x03fffffc,    /* dst_mask */
930
   false),    /* pcrel_offset */
931
932
  /* 0x19: Modifiable branch absolute.  */
933
  HOWTO (R_RBAC,    /* type */
934
   0,     /* rightshift */
935
   4,     /* size */
936
   32,      /* bitsize */
937
   false,     /* pc_relative */
938
   0,     /* bitpos */
939
   complain_overflow_bitfield, /* complain_on_overflow */
940
   0,     /* special_function */
941
   "R_RBAC",    /* name */
942
   true,      /* partial_inplace */
943
   0xffffffff,    /* src_mask */
944
   0xffffffff,    /* dst_mask */
945
   false),    /* pcrel_offset */
946
947
  /* 0x1a: Modifiable branch relative.  */
948
  HOWTO (R_RBR,     /* type */
949
   0,     /* rightshift */
950
   4,     /* size */
951
   26,      /* bitsize */
952
   false,     /* pc_relative */
953
   0,     /* bitpos */
954
   complain_overflow_signed, /* complain_on_overflow */
955
   0,     /* special_function */
956
   "R_RBR_26",    /* name */
957
   true,      /* partial_inplace */
958
   0x03fffffc,    /* src_mask */
959
   0x03fffffc,    /* dst_mask */
960
   false),    /* pcrel_offset */
961
962
  /* 0x1b: Modifiable branch absolute.  */
963
  HOWTO (R_RBRC,    /* type */
964
   0,     /* rightshift */
965
   2,     /* size */
966
   16,      /* bitsize */
967
   false,     /* pc_relative */
968
   0,     /* bitpos */
969
   complain_overflow_bitfield, /* complain_on_overflow */
970
   0,     /* special_function */
971
   "R_RBRC",    /* name */
972
   true,      /* partial_inplace */
973
   0xffff,    /* src_mask */
974
   0xffff,    /* dst_mask */
975
   false),    /* pcrel_offset */
976
977
  /* 0x1c: 16 bit Non modifiable absolute branch.  */
978
  HOWTO (R_BA,      /* type */
979
   0,     /* rightshift */
980
   2,     /* size */
981
   16,      /* bitsize */
982
   false,     /* pc_relative */
983
   0,     /* bitpos */
984
   complain_overflow_bitfield, /* complain_on_overflow */
985
   0,     /* special_function */
986
   "R_BA_16",   /* name */
987
   true,      /* partial_inplace */
988
   0xfffc,    /* src_mask */
989
   0xfffc,    /* dst_mask */
990
   false),    /* pcrel_offset */
991
992
  /* 0x1d: Modifiable branch relative.  */
993
  HOWTO (R_RBR,     /* type */
994
   0,     /* rightshift */
995
   2,     /* size */
996
   16,      /* bitsize */
997
   true,      /* pc_relative */
998
   0,     /* bitpos */
999
   complain_overflow_signed, /* complain_on_overflow */
1000
   0,     /* special_function */
1001
   "R_RBR_16",    /* name */
1002
   true,      /* partial_inplace */
1003
   0xfffc,    /* src_mask */
1004
   0xfffc,    /* dst_mask */
1005
   false),    /* pcrel_offset */
1006
1007
  /* 0x1e: Modifiable branch relative.  */
1008
  HOWTO (R_RBA,     /* type */
1009
   0,     /* rightshift */
1010
   2,     /* size */
1011
   16,      /* bitsize */
1012
   false,     /* pc_relative */
1013
   0,     /* bitpos */
1014
   complain_overflow_signed, /* complain_on_overflow */
1015
   0,     /* special_function */
1016
   "R_RBA_16",    /* name */
1017
   true,      /* partial_inplace */
1018
   0xffff,    /* src_mask */
1019
   0xffff,    /* dst_mask */
1020
   false),    /* pcrel_offset */
1021
1022
  EMPTY_HOWTO (0x1f),
1023
1024
  /* 0x20: General-dynamic TLS relocation.  */
1025
  HOWTO (R_TLS,     /* type */
1026
   0,     /* rightshift */
1027
   4,     /* size */
1028
   32,      /* bitsize */
1029
   false,     /* pc_relative */
1030
   0,     /* bitpos */
1031
   complain_overflow_bitfield, /* complain_on_overflow */
1032
   0,     /* special_function */
1033
   "R_TLS",   /* name */
1034
   true,      /* partial_inplace */
1035
   0xffffffff,    /* src_mask */
1036
   0xffffffff,    /* dst_mask */
1037
   false),    /* pcrel_offset */
1038
1039
  /* 0x21: Initial-exec TLS relocation.  */
1040
  HOWTO (R_TLS_IE,    /* type */
1041
   0,     /* rightshift */
1042
   4,     /* size */
1043
   32,      /* bitsize */
1044
   false,     /* pc_relative */
1045
   0,     /* bitpos */
1046
   complain_overflow_bitfield, /* complain_on_overflow */
1047
   0,     /* special_function */
1048
   "R_TLS_IE",    /* name */
1049
   true,      /* partial_inplace */
1050
   0xffffffff,    /* src_mask */
1051
   0xffffffff,    /* dst_mask */
1052
   false),    /* pcrel_offset */
1053
1054
  /* 0x22: Local-dynamic TLS relocation.  */
1055
  HOWTO (R_TLS_LD,    /* type */
1056
   0,     /* rightshift */
1057
   4,     /* size */
1058
   32,      /* bitsize */
1059
   false,     /* pc_relative */
1060
   0,     /* bitpos */
1061
   complain_overflow_bitfield, /* complain_on_overflow */
1062
   0,     /* special_function */
1063
   "R_TLS_LD",    /* name */
1064
   true,      /* partial_inplace */
1065
   0xffffffff,    /* src_mask */
1066
   0xffffffff,    /* dst_mask */
1067
   false),    /* pcrel_offset */
1068
1069
  /* 0x23: Local-exec TLS relocation.  */
1070
  HOWTO (R_TLS_LE,    /* type */
1071
   0,     /* rightshift */
1072
   4,     /* size */
1073
   32,      /* bitsize */
1074
   false,     /* pc_relative */
1075
   0,     /* bitpos */
1076
   complain_overflow_bitfield, /* complain_on_overflow */
1077
   0,     /* special_function */
1078
   "R_TLS_LE",    /* name */
1079
   true,      /* partial_inplace */
1080
   0xffffffff,    /* src_mask */
1081
   0xffffffff,    /* dst_mask */
1082
   false),    /* pcrel_offset */
1083
1084
  /* 0x24: TLS relocation.  */
1085
  HOWTO (R_TLSM,    /* type */
1086
   0,     /* rightshift */
1087
   4,     /* size */
1088
   32,      /* bitsize */
1089
   false,     /* pc_relative */
1090
   0,     /* bitpos */
1091
   complain_overflow_bitfield, /* complain_on_overflow */
1092
   0,     /* special_function */
1093
   "R_TLSM",    /* name */
1094
   true,      /* partial_inplace */
1095
   0xffffffff,    /* src_mask */
1096
   0xffffffff,    /* dst_mask */
1097
   false),    /* pcrel_offset */
1098
1099
1100
  /* 0x25: TLS module relocation.  */
1101
  HOWTO (R_TLSML,   /* type */
1102
   0,     /* rightshift */
1103
   4,     /* size */
1104
   32,      /* bitsize */
1105
   false,     /* pc_relative */
1106
   0,     /* bitpos */
1107
   complain_overflow_bitfield, /* complain_on_overflow */
1108
   0,     /* special_function */
1109
   "R_TLSML",   /* name */
1110
   true,      /* partial_inplace */
1111
   0xffffffff,    /* src_mask */
1112
   0xffffffff,    /* dst_mask */
1113
   false),    /* pcrel_offset */
1114
1115
  EMPTY_HOWTO(0x26),
1116
  EMPTY_HOWTO(0x27),
1117
  EMPTY_HOWTO(0x28),
1118
  EMPTY_HOWTO(0x29),
1119
  EMPTY_HOWTO(0x2a),
1120
  EMPTY_HOWTO(0x2b),
1121
  EMPTY_HOWTO(0x2c),
1122
  EMPTY_HOWTO(0x2d),
1123
  EMPTY_HOWTO(0x2e),
1124
  EMPTY_HOWTO(0x2f),
1125
1126
  /* 0x30: High-order 16 bit TOC relative relocation.  */
1127
  HOWTO (R_TOCU,    /* type */
1128
   16,      /* rightshift */
1129
   2,     /* size */
1130
   16,      /* bitsize */
1131
   false,     /* pc_relative */
1132
   0,     /* bitpos */
1133
   complain_overflow_bitfield, /* complain_on_overflow */
1134
   0,     /* special_function */
1135
   "R_TOCU",    /* name */
1136
   true,      /* partial_inplace */
1137
   0,     /* src_mask */
1138
   0xffff,    /* dst_mask */
1139
   false),    /* pcrel_offset */
1140
1141
  /* 0x31: Low-order 16 bit TOC relative relocation.  */
1142
  HOWTO (R_TOCL,    /* type */
1143
   0,     /* rightshift */
1144
   2,     /* size */
1145
   16,      /* bitsize */
1146
   false,     /* pc_relative */
1147
   0,     /* bitpos */
1148
   complain_overflow_dont, /* complain_on_overflow */
1149
   0,     /* special_function */
1150
   "R_TOCL",    /* name */
1151
   true,      /* partial_inplace */
1152
   0,     /* src_mask */
1153
   0xffff,    /* dst_mask */
1154
   false),    /* pcrel_offset */
1155
1156
};
1157
1158
void
1159
xcoff_rtype2howto (arelent *relent, struct internal_reloc *internal)
1160
4
{
1161
4
  if (internal->r_type > R_TOCL)
1162
0
    abort ();
1163
1164
  /* Default howto layout works most of the time */
1165
4
  relent->howto = &xcoff_howto_table[internal->r_type];
1166
1167
  /* Special case some 16 bit reloc */
1168
4
  if (15 == (internal->r_size & 0x1f))
1169
0
    {
1170
0
      if (R_BA == internal->r_type)
1171
0
  relent->howto = &xcoff_howto_table[0x1c];
1172
0
      else if (R_RBR == internal->r_type)
1173
0
  relent->howto = &xcoff_howto_table[0x1d];
1174
0
      else if (R_RBA == internal->r_type)
1175
0
  relent->howto = &xcoff_howto_table[0x1e];
1176
0
    }
1177
1178
  /* The r_size field of an XCOFF reloc encodes the bitsize of the
1179
     relocation, as well as indicating whether it is signed or not.
1180
     Doublecheck that the relocation information gathered from the
1181
     type matches this information.  The bitsize is not significant
1182
     for R_REF relocs.  */
1183
4
  if (relent->howto->dst_mask != 0
1184
1
      && (relent->howto->bitsize
1185
1
    != ((unsigned int) internal->r_size & 0x1f) + 1))
1186
0
    abort ();
1187
4
}
1188
1189
reloc_howto_type *
1190
_bfd_xcoff_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1191
            bfd_reloc_code_real_type code)
1192
0
{
1193
0
  switch (code)
1194
0
    {
1195
0
    case BFD_RELOC_PPC_B26:
1196
0
      return &xcoff_howto_table[0xa];
1197
0
    case BFD_RELOC_PPC_BA16:
1198
0
      return &xcoff_howto_table[0x1c];
1199
0
    case BFD_RELOC_PPC_BA26:
1200
0
      return &xcoff_howto_table[8];
1201
0
    case BFD_RELOC_PPC_TOC16:
1202
0
      return &xcoff_howto_table[3];
1203
0
    case BFD_RELOC_PPC_TOC16_HI:
1204
0
      return &xcoff_howto_table[0x30];
1205
0
    case BFD_RELOC_PPC_TOC16_LO:
1206
0
      return &xcoff_howto_table[0x31];
1207
0
    case BFD_RELOC_PPC_B16:
1208
0
      return &xcoff_howto_table[0x1d];
1209
0
    case BFD_RELOC_32:
1210
0
    case BFD_RELOC_CTOR:
1211
0
      return &xcoff_howto_table[0];
1212
0
    case BFD_RELOC_NONE:
1213
0
      return &xcoff_howto_table[0xf];
1214
0
    case BFD_RELOC_PPC_NEG:
1215
0
      return &xcoff_howto_table[0x1];
1216
0
    case BFD_RELOC_PPC_TLSGD:
1217
0
      return &xcoff_howto_table[0x20];
1218
0
    case BFD_RELOC_PPC_TLSIE:
1219
0
      return &xcoff_howto_table[0x21];
1220
0
    case BFD_RELOC_PPC_TLSLD:
1221
0
      return &xcoff_howto_table[0x22];
1222
0
    case BFD_RELOC_PPC_TLSLE:
1223
0
      return &xcoff_howto_table[0x23];
1224
0
    case BFD_RELOC_PPC_TLSM:
1225
0
      return &xcoff_howto_table[0x24];
1226
0
    case BFD_RELOC_PPC_TLSML:
1227
0
      return &xcoff_howto_table[0x25];
1228
0
    default:
1229
0
      return NULL;
1230
0
    }
1231
0
}
1232
1233
static reloc_howto_type *
1234
_bfd_xcoff_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1235
            const char *r_name)
1236
0
{
1237
0
  unsigned int i;
1238
1239
0
  for (i = 0;
1240
0
       i < sizeof (xcoff_howto_table) / sizeof (xcoff_howto_table[0]);
1241
0
       i++)
1242
0
    if (xcoff_howto_table[i].name != NULL
1243
0
  && strcasecmp (xcoff_howto_table[i].name, r_name) == 0)
1244
0
      return &xcoff_howto_table[i];
1245
1246
0
  return NULL;
1247
0
}
1248

1249
/* XCOFF archive support.  The original version of this code was by
1250
   Damon A. Permezel.  It was enhanced to permit cross support, and
1251
   writing archive files, by Ian Lance Taylor, Cygnus Support.
1252
1253
   XCOFF uses its own archive format.  Everything is hooked together
1254
   with file offset links, so it is possible to rapidly update an
1255
   archive in place.  Of course, we don't do that.  An XCOFF archive
1256
   has a real file header, not just an ARMAG string.  The structure of
1257
   the file header and of each archive header appear below.
1258
1259
   An XCOFF archive also has a member table, which is a list of
1260
   elements in the archive (you can get that by looking through the
1261
   linked list, but you have to read a lot more of the file).  The
1262
   member table has a normal archive header with an empty name.  It is
1263
   normally (and perhaps must be) the second to last entry in the
1264
   archive.  The member table data is almost printable ASCII.  It
1265
   starts with a 12 character decimal string which is the number of
1266
   entries in the table.  For each entry it has a 12 character decimal
1267
   string which is the offset in the archive of that member.  These
1268
   entries are followed by a series of null terminated strings which
1269
   are the member names for each entry.
1270
1271
   Finally, an XCOFF archive has a global symbol table, which is what
1272
   we call the armap.  The global symbol table has a normal archive
1273
   header with an empty name.  It is normally (and perhaps must be)
1274
   the last entry in the archive.  The contents start with a four byte
1275
   binary number which is the number of entries.  This is followed by
1276
   a that many four byte binary numbers; each is the file offset of an
1277
   entry in the archive.  These numbers are followed by a series of
1278
   null terminated strings, which are symbol names.
1279
1280
   AIX 4.3 introduced a new archive format which can handle larger
1281
   files and also 32- and 64-bit objects in the same archive.  The
1282
   things said above remain true except that there is now more than
1283
   one global symbol table.  The one is used to index 32-bit objects,
1284
   the other for 64-bit objects.
1285
1286
   The new archives (recognizable by the new ARMAG string) has larger
1287
   field lengths so that we cannot really share any code.  Also we have
1288
   to take care that we are not generating the new form of archives
1289
   on AIX 4.2 or earlier systems.  */
1290
1291
/* PR 21786:  The PE/COFF standard does not require NUL termination for any of
1292
   the ASCII fields in the archive headers.  So in order to be able to extract
1293
   numerical values we provide our own versions of strtol and strtoll which
1294
   take a maximum length as an additional parameter.  Also - just to save space,
1295
   we omit the endptr return parameter, since we know that it is never used.  */
1296
1297
static unsigned long
1298
_bfd_strntol (const char * nptr, int base, unsigned int maxlen)
1299
5.60k
{
1300
5.60k
  char buf[24]; /* Should be enough.  */
1301
1302
5.60k
  BFD_ASSERT (maxlen < (sizeof (buf) - 1));
1303
1304
5.60k
  memcpy (buf, nptr, maxlen);
1305
5.60k
  buf[maxlen] = 0;
1306
5.60k
  return strtol (buf, NULL, base);
1307
5.60k
}
1308
1309
static unsigned long long
1310
_bfd_strntoll (const char * nptr, int base, unsigned int maxlen)
1311
0
{
1312
0
  char buf[32]; /* Should be enough.  */
1313
1314
0
  BFD_ASSERT (maxlen < (sizeof (buf) - 1));
1315
1316
0
  memcpy (buf, nptr, maxlen);
1317
0
  buf[maxlen] = 0;
1318
0
  return strtoll (buf, NULL, base);
1319
0
}
1320
1321
/* Macro to read an ASCII value stored in an archive header field.  */
1322
#define GET_VALUE_IN_FIELD(VAR, FIELD, BASE)      \
1323
4.93k
  do                \
1324
4.93k
    {               \
1325
4.93k
      (VAR) = (sizeof (VAR) > sizeof (long)      \
1326
4.93k
         ? _bfd_strntoll (FIELD, BASE, sizeof FIELD)  \
1327
4.93k
         : _bfd_strntol (FIELD, BASE, sizeof FIELD));  \
1328
4.93k
    }               \
1329
4.93k
  while (0)
1330
1331
#define EQ_VALUE_IN_FIELD(VAR, FIELD, BASE)     \
1332
1.08k
  (sizeof (VAR) > sizeof (long)          \
1333
1.08k
   ? (VAR) == _bfd_strntoll (FIELD, BASE, sizeof FIELD)    \
1334
1.08k
   : (VAR) == _bfd_strntol (FIELD, BASE, sizeof FIELD))
1335
1336
/* Read in the armap of an XCOFF archive.  */
1337
1338
bool
1339
_bfd_xcoff_slurp_armap (bfd *abfd)
1340
1.84k
{
1341
1.84k
  ufile_ptr off;
1342
1.84k
  size_t namlen;
1343
1.84k
  bfd_size_type sz;
1344
1.84k
  bfd_byte *contents, *cend;
1345
1.84k
  bfd_vma c, i;
1346
1.84k
  carsym *arsym;
1347
1.84k
  bfd_byte *p;
1348
1349
1.84k
  if (x_artdata (abfd) == NULL)
1350
0
    {
1351
0
      abfd->has_armap = false;
1352
0
      return true;
1353
0
    }
1354
1355
1.84k
  if (! xcoff_big_format_p (abfd))
1356
572
    {
1357
      /* This is for the old format.  */
1358
572
      struct xcoff_ar_hdr hdr;
1359
1360
572
      GET_VALUE_IN_FIELD (off, x_artdata (abfd)->u.hdr.symoff, 10);
1361
572
      if (off == 0)
1362
85
  {
1363
85
    abfd->has_armap = false;
1364
85
    return true;
1365
85
  }
1366
1367
487
      if (bfd_seek (abfd, off, SEEK_SET) != 0)
1368
99
  return false;
1369
1370
      /* The symbol table starts with a normal archive header.  */
1371
388
      if (bfd_read (&hdr, SIZEOF_AR_HDR, abfd) != SIZEOF_AR_HDR)
1372
90
  return false;
1373
1374
      /* Skip the name (normally empty).  */
1375
298
      GET_VALUE_IN_FIELD (namlen, hdr.namlen, 10);
1376
298
      off = ((namlen + 1) & ~ (size_t) 1) + SXCOFFARFMAG;
1377
298
      if (bfd_seek (abfd, off, SEEK_CUR) != 0)
1378
5
  return false;
1379
1380
293
      GET_VALUE_IN_FIELD (sz, hdr.size, 10);
1381
293
      if (sz + 1 < 5)
1382
7
  {
1383
7
    bfd_set_error (bfd_error_bad_value);
1384
7
    return false;
1385
7
  }
1386
1387
      /* Read in the entire symbol table.  */
1388
286
      contents = (bfd_byte *) _bfd_alloc_and_read (abfd, sz + 1, sz);
1389
286
      if (contents == NULL)
1390
192
  return false;
1391
1392
      /* Ensure strings are NULL terminated so we don't wander off the
1393
   end of the buffer.  */
1394
94
      contents[sz] = 0;
1395
1396
      /* The symbol table starts with a four byte count.  */
1397
94
      c = H_GET_32 (abfd, contents);
1398
1399
94
      if (c >= sz / 4)
1400
49
  {
1401
49
    bfd_set_error (bfd_error_bad_value);
1402
49
    return false;
1403
49
  }
1404
1405
45
      bfd_ardata (abfd)->symdefs =
1406
45
  ((carsym *) bfd_alloc (abfd, c * sizeof (carsym)));
1407
45
      if (bfd_ardata (abfd)->symdefs == NULL)
1408
0
  return false;
1409
1410
      /* After the count comes a list of four byte file offsets.  */
1411
45
      for (i = 0, arsym = bfd_ardata (abfd)->symdefs, p = contents + 4;
1412
1.60k
     i < c;
1413
1.56k
     ++i, ++arsym, p += 4)
1414
1.56k
  arsym->u.file_offset = H_GET_32 (abfd, p);
1415
45
    }
1416
1.27k
  else
1417
1.27k
    {
1418
      /* This is for the new format.  */
1419
1.27k
      struct xcoff_ar_hdr_big hdr;
1420
1421
1.27k
      GET_VALUE_IN_FIELD (off, x_artdata (abfd)->u.bhdr.symoff, 10);
1422
1.27k
      if (off == 0)
1423
354
  {
1424
354
    abfd->has_armap = false;
1425
354
    return true;
1426
354
  }
1427
1428
923
      if (bfd_seek (abfd, off, SEEK_SET) != 0)
1429
179
  return false;
1430
1431
      /* The symbol table starts with a normal archive header.  */
1432
744
      if (bfd_read (&hdr, SIZEOF_AR_HDR_BIG, abfd) != SIZEOF_AR_HDR_BIG)
1433
72
  return false;
1434
1435
      /* Skip the name (normally empty).  */
1436
672
      GET_VALUE_IN_FIELD (namlen, hdr.namlen, 10);
1437
672
      off = ((namlen + 1) & ~ (size_t) 1) + SXCOFFARFMAG;
1438
672
      if (bfd_seek (abfd, off, SEEK_CUR) != 0)
1439
5
  return false;
1440
1441
667
      GET_VALUE_IN_FIELD (sz, hdr.size, 10);
1442
667
      if (sz + 1 < 9)
1443
28
  {
1444
28
    bfd_set_error (bfd_error_bad_value);
1445
28
    return false;
1446
28
  }
1447
1448
      /* Read in the entire symbol table.  */
1449
639
      contents = (bfd_byte *) _bfd_alloc_and_read (abfd, sz + 1, sz);
1450
639
      if (contents == NULL)
1451
293
  return false;
1452
1453
      /* Ensure strings are NULL terminated so we don't wander off the
1454
   end of the buffer.  */
1455
346
      contents[sz] = 0;
1456
1457
      /* The symbol table starts with an eight byte count.  */
1458
346
      c = H_GET_64 (abfd, contents);
1459
1460
346
      if (c >= sz / 8)
1461
304
  {
1462
304
    bfd_set_error (bfd_error_bad_value);
1463
304
    return false;
1464
304
  }
1465
1466
42
      bfd_ardata (abfd)->symdefs =
1467
42
  ((carsym *) bfd_alloc (abfd, c * sizeof (carsym)));
1468
42
      if (bfd_ardata (abfd)->symdefs == NULL)
1469
0
  return false;
1470
1471
      /* After the count comes a list of eight byte file offsets.  */
1472
42
      for (i = 0, arsym = bfd_ardata (abfd)->symdefs, p = contents + 8;
1473
687
     i < c;
1474
645
     ++i, ++arsym, p += 8)
1475
645
  arsym->u.file_offset = H_GET_64 (abfd, p);
1476
42
    }
1477
1478
  /* After the file offsets come null terminated symbol names.  */
1479
87
  cend = contents + sz;
1480
87
  for (i = 0, arsym = bfd_ardata (abfd)->symdefs;
1481
1.59k
       i < c;
1482
1.50k
       ++i, ++arsym, p += strlen ((char *) p) + 1)
1483
1.53k
    {
1484
1.53k
      if (p >= cend)
1485
29
  {
1486
29
    bfd_set_error (bfd_error_bad_value);
1487
29
    return false;
1488
29
  }
1489
1.50k
      arsym->name = (char *) p;
1490
1.50k
    }
1491
1492
58
  bfd_ardata (abfd)->symdef_count = c;
1493
58
  abfd->has_armap = true;
1494
1495
58
  return true;
1496
87
}
1497
1498
/* See if this is an XCOFF archive.  */
1499
1500
bfd_cleanup
1501
_bfd_xcoff_archive_p (bfd *abfd)
1502
111k
{
1503
111k
  char magic[SXCOFFARMAG];
1504
111k
  size_t amt = SXCOFFARMAG;
1505
1506
111k
  BFD_ASSERT (!bfd_is_fake_archive (abfd));
1507
1508
111k
  if (bfd_read (magic, amt, abfd) != amt)
1509
488
    {
1510
488
      if (bfd_get_error () != bfd_error_system_call)
1511
286
  bfd_set_error (bfd_error_wrong_format);
1512
488
      return NULL;
1513
488
    }
1514
1515
110k
  if (strncmp (magic, XCOFFARMAG, SXCOFFARMAG) != 0
1516
110k
      && strncmp (magic, XCOFFARMAGBIG, SXCOFFARMAG) != 0)
1517
108k
    {
1518
108k
      bfd_set_error (bfd_error_wrong_format);
1519
108k
      return NULL;
1520
108k
    }
1521
1522
1.89k
  amt = sizeof (struct artdata) + sizeof (struct xcoff_artdata);
1523
1.89k
  bfd_ardata (abfd) = bfd_zalloc (abfd, amt);
1524
1.89k
  if (bfd_ardata (abfd) == NULL)
1525
0
    return NULL;
1526
1527
1.89k
  bfd_ardata (abfd)->tdata = (void *) ((struct artdata *) bfd_ardata (abfd) + 1);
1528
1529
  /* Now handle the two formats.  */
1530
1.89k
  if (magic[1] != 'b')
1531
593
    {
1532
      /* This is the old format.  */
1533
593
      struct xcoff_ar_file_hdr hdr;
1534
1535
      /* Copy over the magic string.  */
1536
593
      memcpy (hdr.magic, magic, SXCOFFARMAG);
1537
1538
      /* Now read the rest of the file header.  */
1539
593
      amt = SIZEOF_AR_FILE_HDR - SXCOFFARMAG;
1540
593
      if (bfd_read (&hdr.memoff, amt, abfd) != amt)
1541
21
  {
1542
21
    if (bfd_get_error () != bfd_error_system_call)
1543
21
      bfd_set_error (bfd_error_wrong_format);
1544
21
    goto error_ret;
1545
21
  }
1546
1547
572
      GET_VALUE_IN_FIELD (bfd_ardata (abfd)->first_file.file_offset,
1548
572
        hdr.firstmemoff, 10);
1549
1550
572
      memcpy (&x_artdata (abfd)->u.hdr, &hdr, SIZEOF_AR_FILE_HDR);
1551
572
    }
1552
1.30k
  else
1553
1.30k
    {
1554
      /* This is the new format.  */
1555
1.30k
      struct xcoff_ar_file_hdr_big hdr;
1556
1557
      /* Copy over the magic string.  */
1558
1.30k
      memcpy (hdr.magic, magic, SXCOFFARMAG);
1559
1560
      /* Now read the rest of the file header.  */
1561
1.30k
      amt = SIZEOF_AR_FILE_HDR_BIG - SXCOFFARMAG;
1562
1.30k
      if (bfd_read (&hdr.memoff, amt, abfd) != amt)
1563
26
  {
1564
26
    if (bfd_get_error () != bfd_error_system_call)
1565
26
      bfd_set_error (bfd_error_wrong_format);
1566
26
    goto error_ret;
1567
26
  }
1568
1569
1.27k
      bfd_ardata (abfd)->first_file.file_offset
1570
1.27k
  = bfd_scan_vma (hdr.firstmemoff, (const char **) 0, 10);
1571
1572
1.27k
      memcpy (&x_artdata (abfd)->u.bhdr, &hdr, SIZEOF_AR_FILE_HDR_BIG);
1573
1.27k
    }
1574
1575
1.84k
  if (! _bfd_xcoff_slurp_armap (abfd))
1576
1.35k
    {
1577
1.39k
    error_ret:
1578
1.39k
      bfd_release (abfd, bfd_ardata (abfd));
1579
1.39k
      return NULL;
1580
1.35k
    }
1581
1582
497
  return _bfd_no_cleanup;
1583
1.84k
}
1584
1585
/* Track file ranges occupied by elements.  Add [START,END) to the
1586
   list of ranges and return TRUE if there is no overlap between the
1587
   new and any other element or the archive file header.  This is
1588
   aimed at preventing infinite looping on malformed archives, for
1589
   "ar" and similar which typically use code like:
1590
   .  for (last = bfd_openr_next_archived_file (archive, NULL);
1591
   .       last;
1592
   .       last = next)
1593
   .    {
1594
   .      do_something_with (last);
1595
   .      next = bfd_openr_next_archived_file (archive, last);
1596
   .      bfd_close (last);
1597
   .    }
1598
   The check implemented here is only possible due to the fact that
1599
   for XCOFF archives bfd_openr_next_archived_file is the only code
1600
   path leading to _bfd_read_ar_hdr.  _bfd_read_ar_hdr is not called
1601
   when reading the armap, nor do XCOFF archives use the extended name
1602
   scheme implemented in archive.c.
1603
1604
   Note that the check relies on the previous element being closed,
1605
   and there is one case where add_range might fail but I think it is
1606
   sufficently unusual that it doesn't warrant fixing:
1607
   If the loop body above called bfd_openr_next_archived_file twice
1608
   with the same arguments and the element returned is bfd_close'd
1609
   between those calls then we'll return false here for the second
1610
   call.  (For why this is so see _bfd_look_for_bfd_in_cache in
1611
   _bfd_get_elt_at_filepos, and know that bfd_close removes elements
1612
   from the cache.)  */
1613
1614
static bool
1615
add_range (bfd *abfd, ufile_ptr start, ufile_ptr end)
1616
171
{
1617
171
  if (end <= start)
1618
1
    {
1619
52
    err:
1620
52
      bfd_set_error (bfd_error_malformed_archive);
1621
52
      return false;
1622
1
    }
1623
1624
  /* This list is kept sorted by address.  Find the highest address
1625
     range on the list that ends before the new range starts.  Exit
1626
     the loop with that range in LO, and the mext higher range in HI.  */
1627
170
  struct ar_ranges *hi = &x_artdata (abfd)->ranges;
1628
170
  struct ar_ranges *lo = NULL;
1629
299
  while (hi && hi->end <= start)
1630
129
    {
1631
129
      lo = hi;
1632
129
      hi = hi->next;
1633
129
    }
1634
1635
170
  if (lo == NULL)
1636
    /* Start overlaps the file header or elements adjacent to it.  */
1637
47
    goto err;
1638
1639
123
  if (hi && hi->start < end)
1640
    /* Overlap with another element.  */
1641
4
    goto err;
1642
1643
  /* A zero size element with a one char name is this big.  */
1644
119
  unsigned min_elt = x_artdata (abfd)->ar_hdr_size + 2 + SXCOFFARFMAG;
1645
119
  if (start - lo->end < min_elt)
1646
45
    {
1647
      /* Merge into an existing range.  */
1648
45
      lo->end = end;
1649
45
      if (hi && hi->start - end < min_elt)
1650
0
  {
1651
    /* In fact, we can merge two ranges.  */
1652
0
    lo->end = hi->end;
1653
0
    lo->next = hi->next;
1654
    /* The list uses bfd_alloc so don't free HI.  */
1655
0
  }
1656
45
      return true;
1657
45
    }
1658
1659
74
  if (hi && hi->start - end < min_elt)
1660
0
    {
1661
      /* Merge into an existing range.  */
1662
0
      hi->start = start;
1663
0
      return true;
1664
0
    }
1665
1666
74
  struct ar_ranges *newr = bfd_alloc (abfd, sizeof (*newr));
1667
74
  if (newr == NULL)
1668
0
    return false;
1669
74
  newr->start = start;
1670
74
  newr->end = end;
1671
74
  newr->next = hi;
1672
74
  lo->next = newr;
1673
74
  return true;
1674
74
}
1675
1676
/* Read the archive header in an XCOFF archive.  */
1677
1678
void *
1679
_bfd_xcoff_read_ar_hdr (bfd *abfd)
1680
276
{
1681
276
  bfd_size_type namlen;
1682
276
  struct areltdata *ret;
1683
276
  bfd_size_type amt;
1684
276
  ufile_ptr start = abfd->where;
1685
1686
276
  if (! xcoff_big_format_p (abfd))
1687
101
    {
1688
101
      struct xcoff_ar_hdr hdr;
1689
101
      struct xcoff_ar_hdr *hdrp;
1690
1691
101
      if (bfd_read (&hdr, SIZEOF_AR_HDR, abfd) != SIZEOF_AR_HDR)
1692
26
  return NULL;
1693
1694
75
      GET_VALUE_IN_FIELD (namlen, hdr.namlen, 10);
1695
75
      if (namlen > bfd_get_file_size (abfd))
1696
9
  return NULL;
1697
66
      amt = sizeof (struct areltdata) + SIZEOF_AR_HDR + namlen + 1;
1698
66
      ret = (struct areltdata *) bfd_malloc (amt);
1699
66
      if (ret == NULL)
1700
0
  return ret;
1701
1702
66
      hdrp = (struct xcoff_ar_hdr *) (ret + 1);
1703
66
      memcpy (hdrp, &hdr, SIZEOF_AR_HDR);
1704
66
      if (bfd_read ((char *) hdrp + SIZEOF_AR_HDR, namlen, abfd) != namlen)
1705
2
  {
1706
2
    free (ret);
1707
2
    return NULL;
1708
2
  }
1709
64
      ((char *) hdrp)[SIZEOF_AR_HDR + namlen] = '\0';
1710
1711
64
      ret->arch_header = (char *) hdrp;
1712
64
      GET_VALUE_IN_FIELD (ret->parsed_size, hdr.size, 10);
1713
64
      ret->filename = (char *) hdrp + SIZEOF_AR_HDR;
1714
64
    }
1715
175
  else
1716
175
    {
1717
175
      struct xcoff_ar_hdr_big hdr;
1718
175
      struct xcoff_ar_hdr_big *hdrp;
1719
1720
175
      if (bfd_read (&hdr, SIZEOF_AR_HDR_BIG, abfd) != SIZEOF_AR_HDR_BIG)
1721
48
  return NULL;
1722
1723
127
      GET_VALUE_IN_FIELD (namlen, hdr.namlen, 10);
1724
127
      if (namlen > bfd_get_file_size (abfd))
1725
18
  return NULL;
1726
109
      amt = sizeof (struct areltdata) + SIZEOF_AR_HDR_BIG + namlen + 1;
1727
109
      ret = (struct areltdata *) bfd_malloc (amt);
1728
109
      if (ret == NULL)
1729
0
  return ret;
1730
1731
109
      hdrp = (struct xcoff_ar_hdr_big *) (ret + 1);
1732
109
      memcpy (hdrp, &hdr, SIZEOF_AR_HDR_BIG);
1733
109
      if (bfd_read ((char *) hdrp + SIZEOF_AR_HDR_BIG, namlen, abfd) != namlen)
1734
2
  {
1735
2
    free (ret);
1736
2
    return NULL;
1737
2
  }
1738
107
      ((char *) hdrp)[SIZEOF_AR_HDR_BIG + namlen] = '\0';
1739
1740
107
      ret->arch_header = (char *) hdrp;
1741
107
      GET_VALUE_IN_FIELD (ret->parsed_size, hdr.size, 10);
1742
107
      ret->filename = (char *) hdrp + SIZEOF_AR_HDR_BIG;
1743
107
    }
1744
1745
  /* Size occupied by the header above that covered in the fixed
1746
     SIZEOF_AR_HDR or SIZEOF_AR_HDR_BIG.  */
1747
171
  ret->extra_size = namlen + (namlen & 1) + SXCOFFARFMAG;
1748
1749
  /* Skip over the XCOFFARFMAG at the end of the file name.  */
1750
171
  if (bfd_seek (abfd, (namlen & 1) + SXCOFFARFMAG, SEEK_CUR) != 0
1751
171
      || !add_range (abfd, start, abfd->where + ret->parsed_size))
1752
52
    {
1753
52
      free (ret);
1754
52
      return NULL;
1755
52
    }
1756
1757
119
  return ret;
1758
171
}
1759
1760
/* Open the next element in an XCOFF archive.  */
1761
1762
bfd *
1763
_bfd_xcoff_openr_next_archived_file (bfd *archive, bfd *last_file)
1764
414
{
1765
414
  ufile_ptr filestart;
1766
1767
414
  BFD_ASSERT (!bfd_is_fake_archive (archive));
1768
1769
414
  if (x_artdata (archive) == NULL)
1770
0
    {
1771
0
      bfd_set_error (bfd_error_invalid_operation);
1772
0
      return NULL;
1773
0
    }
1774
1775
414
  if (! xcoff_big_format_p (archive))
1776
133
    {
1777
133
      if (last_file == NULL)
1778
94
  {
1779
    /* If we are scanning over elements twice in an open archive,
1780
       which can happen in gdb after a fork, ensure we start the
1781
       second scan with clean ranges.  */
1782
94
    x_artdata (archive)->ranges.start = 0;
1783
94
    x_artdata (archive)->ranges.end = SIZEOF_AR_FILE_HDR;
1784
94
    x_artdata (archive)->ranges.next = NULL;
1785
94
    x_artdata (archive)->ar_hdr_size = SIZEOF_AR_HDR;
1786
94
    filestart = bfd_ardata (archive)->first_file.file_offset;
1787
94
  }
1788
39
      else
1789
39
  GET_VALUE_IN_FIELD (filestart, arch_xhdr (last_file)->nextoff, 10);
1790
1791
133
      if (filestart == 0
1792
118
    || EQ_VALUE_IN_FIELD (filestart,
1793
133
        x_artdata (archive)->u.hdr.memoff, 10)
1794
117
    || EQ_VALUE_IN_FIELD (filestart,
1795
133
        x_artdata (archive)->u.hdr.symoff, 10))
1796
17
  {
1797
17
    bfd_set_error (bfd_error_no_more_archived_files);
1798
17
    return NULL;
1799
17
  }
1800
133
    }
1801
281
  else
1802
281
    {
1803
281
      if (last_file == NULL)
1804
235
  {
1805
235
    x_artdata (archive)->ranges.start = 0;
1806
235
    x_artdata (archive)->ranges.end = SIZEOF_AR_FILE_HDR_BIG;
1807
235
    x_artdata (archive)->ranges.next = NULL;
1808
235
    x_artdata (archive)->ar_hdr_size = SIZEOF_AR_HDR_BIG;
1809
235
    filestart = bfd_ardata (archive)->first_file.file_offset;
1810
235
  }
1811
46
      else
1812
46
  GET_VALUE_IN_FIELD (filestart, arch_xhdr_big (last_file)->nextoff, 10);
1813
1814
281
      if (filestart == 0
1815
221
    || EQ_VALUE_IN_FIELD (filestart,
1816
281
        x_artdata (archive)->u.bhdr.memoff, 10)
1817
219
    || EQ_VALUE_IN_FIELD (filestart,
1818
281
        x_artdata (archive)->u.bhdr.symoff, 10))
1819
62
  {
1820
62
    bfd_set_error (bfd_error_no_more_archived_files);
1821
62
    return NULL;
1822
62
  }
1823
281
    }
1824
1825
  /* Check that we aren't pointing back at the last element.  This is
1826
     necessary depite the add_range checking in _bfd_xcoff_read_ar_hdr
1827
     because archive.c leaves the last element open and thus in the
1828
     archive element cache until the next element is opened.  */
1829
335
  if (last_file != NULL)
1830
65
    {
1831
65
      ufile_ptr laststart = last_file->proxy_handle.file_offset;
1832
65
      laststart -= x_artdata (archive)->ar_hdr_size;
1833
65
      laststart -= arch_eltdata (last_file)->extra_size;
1834
65
      if (filestart == laststart)
1835
4
  {
1836
4
    bfd_set_error (bfd_error_malformed_archive);
1837
4
    return NULL;
1838
4
  }
1839
65
    }
1840
1841
331
  return _bfd_get_elt_at_filepos (archive, filestart, NULL);
1842
335
}
1843
1844
/* Stat an element in an XCOFF archive.  */
1845
1846
int
1847
_bfd_xcoff_stat_arch_elt (bfd *abfd, struct stat *s)
1848
220
{
1849
220
  if (abfd->arelt_data == NULL)
1850
189
    {
1851
189
      bfd_set_error (bfd_error_invalid_operation);
1852
189
      return -1;
1853
189
    }
1854
1855
31
  if (! xcoff_big_format_p (abfd->my_archive))
1856
22
    {
1857
22
      struct xcoff_ar_hdr *hdrp = arch_xhdr (abfd);
1858
1859
22
      GET_VALUE_IN_FIELD (s->st_mtime, hdrp->date, 10);
1860
22
      GET_VALUE_IN_FIELD (s->st_uid, hdrp->uid, 10);
1861
22
      GET_VALUE_IN_FIELD (s->st_gid, hdrp->gid, 10);
1862
22
      GET_VALUE_IN_FIELD (s->st_mode, hdrp->mode, 8);
1863
22
      s->st_size = arch_eltdata (abfd)->parsed_size;
1864
22
    }
1865
9
  else
1866
9
    {
1867
9
      struct xcoff_ar_hdr_big *hdrp = arch_xhdr_big (abfd);
1868
1869
9
      GET_VALUE_IN_FIELD (s->st_mtime, hdrp->date, 10);
1870
9
      GET_VALUE_IN_FIELD (s->st_uid, hdrp->uid, 10);
1871
9
      GET_VALUE_IN_FIELD (s->st_gid, hdrp->gid, 10);
1872
9
      GET_VALUE_IN_FIELD (s->st_mode, hdrp->mode, 8);
1873
9
      s->st_size = arch_eltdata (abfd)->parsed_size;
1874
9
    }
1875
1876
31
  return 0;
1877
220
}
1878
1879
/* Normalize a file name for inclusion in an archive.  */
1880
1881
static const char *
1882
normalize_filename (bfd *abfd)
1883
75
{
1884
75
  const char *file;
1885
75
  const char *filename;
1886
1887
75
  file = bfd_get_filename (abfd);
1888
75
  filename = strrchr (file, '/');
1889
75
  if (filename != NULL)
1890
75
    filename++;
1891
0
  else
1892
0
    filename = file;
1893
75
  return filename;
1894
75
}
1895
1896
/* Write out an XCOFF armap.  */
1897
1898
static bool
1899
xcoff_write_armap_old (bfd *abfd, unsigned int elength ATTRIBUTE_UNUSED,
1900
           struct orl *map, unsigned int orl_count, int stridx)
1901
0
{
1902
0
  struct archive_iterator iterator;
1903
0
  struct xcoff_ar_hdr hdr;
1904
0
  char *p;
1905
0
  unsigned char buf[4];
1906
0
  unsigned int i;
1907
1908
0
  memset (&hdr, 0, sizeof hdr);
1909
0
  sprintf (hdr.size, "%ld", (long) (4 + orl_count * 4 + stridx));
1910
0
  sprintf (hdr.nextoff, "%d", 0);
1911
0
  memcpy (hdr.prevoff, x_artdata (abfd)->u.hdr.memoff,
1912
0
    XCOFFARMAG_ELEMENT_SIZE);
1913
0
  sprintf (hdr.date, "%d", 0);
1914
0
  sprintf (hdr.uid, "%d", 0);
1915
0
  sprintf (hdr.gid, "%d", 0);
1916
0
  sprintf (hdr.mode, "%d", 0);
1917
0
  sprintf (hdr.namlen, "%d", 0);
1918
1919
  /* We need spaces, not null bytes, in the header.  */
1920
0
  for (p = (char *) &hdr; p < (char *) &hdr + SIZEOF_AR_HDR; p++)
1921
0
    if (*p == '\0')
1922
0
      *p = ' ';
1923
1924
0
  if (bfd_write (&hdr, SIZEOF_AR_HDR, abfd) != SIZEOF_AR_HDR
1925
0
      || bfd_write (XCOFFARFMAG, SXCOFFARFMAG, abfd) != SXCOFFARFMAG)
1926
0
    return false;
1927
1928
0
  H_PUT_32 (abfd, orl_count, buf);
1929
0
  if (bfd_write (buf, 4, abfd) != 4)
1930
0
    return false;
1931
1932
0
  i = 0;
1933
0
  archive_iterator_begin (&iterator, abfd);
1934
0
  while (i < orl_count && archive_iterator_next (&iterator))
1935
0
    while (map[i].abfd == iterator.current.member)
1936
0
      {
1937
0
  H_PUT_32 (abfd, iterator.current.offset, buf);
1938
0
  if (bfd_write (buf, 4, abfd) != 4)
1939
0
    return false;
1940
0
  ++i;
1941
0
      }
1942
1943
0
  for (i = 0; i < orl_count; i++)
1944
0
    {
1945
0
      const char *name;
1946
0
      size_t namlen;
1947
1948
0
      name = *map[i].name;
1949
0
      namlen = strlen (name);
1950
0
      if (bfd_write (name, namlen + 1, abfd) != namlen + 1)
1951
0
  return false;
1952
0
    }
1953
1954
0
  if ((stridx & 1) != 0)
1955
0
    {
1956
0
      char b;
1957
1958
0
      b = '\0';
1959
0
      if (bfd_write (&b, 1, abfd) != 1)
1960
0
  return false;
1961
0
    }
1962
1963
0
  return true;
1964
0
}
1965
1966
static char buff20[XCOFFARMAGBIG_ELEMENT_SIZE + 1];
1967
1.95k
#define FMT20  "%-20" PRId64
1968
1.27k
#define FMT12  "%-12d"
1969
25
#define FMT12_OCTAL  "%-12o"
1970
326
#define FMT4  "%-4d"
1971
#define PRINT20(d, v) \
1972
1.95k
  sprintf (buff20, FMT20, (uint64_t) (v)), \
1973
1.95k
  memcpy ((void *) (d), buff20, 20)
1974
1975
#define PRINT12(d, v) \
1976
1.27k
  sprintf (buff20, FMT12, (int)(v)), \
1977
1.27k
  memcpy ((void *) (d), buff20, 12)
1978
1979
#define PRINT12_OCTAL(d, v) \
1980
25
  sprintf (buff20, FMT12_OCTAL, (unsigned int)(v)), \
1981
25
  memcpy ((void *) (d), buff20, 12)
1982
1983
#define PRINT4(d, v) \
1984
326
  sprintf (buff20, FMT4, (int)(v)), \
1985
326
  memcpy ((void *) (d), buff20, 4)
1986
1987
#define READ20(d, v) \
1988
0
  buff20[20] = 0, \
1989
0
  memcpy (buff20, (d), 20), \
1990
0
  (v) = bfd_scan_vma (buff20, (const char **) NULL, 10)
1991
1992
static bool
1993
do_pad (bfd *abfd, unsigned int number)
1994
57
{
1995
57
  bfd_byte b = 0;
1996
1997
  /* Limit pad to <= 4096.  */
1998
57
  if (number > 4096)
1999
0
    return false;
2000
2001
66
  while (number--)
2002
9
    if (bfd_write (&b, 1, abfd) != 1)
2003
0
      return false;
2004
2005
57
  return true;
2006
57
}
2007
2008
static bool
2009
do_copy (bfd *out_bfd, bfd *in_bfd)
2010
25
{
2011
25
  bfd_size_type remaining;
2012
25
  bfd_byte buffer[8 * 1024];
2013
2014
25
  if (bfd_seek (in_bfd, 0, SEEK_SET) != 0)
2015
0
    return false;
2016
2017
25
  remaining = arelt_size (in_bfd);
2018
2019
25
  while (remaining >= sizeof (buffer))
2020
0
    {
2021
0
      if (bfd_read (buffer, sizeof (buffer), in_bfd) != sizeof (buffer)
2022
0
    || bfd_write (buffer, sizeof (buffer), out_bfd) != sizeof (buffer))
2023
0
  return false;
2024
2025
0
      remaining -= sizeof (buffer);
2026
0
    }
2027
2028
25
  if (remaining)
2029
12
    {
2030
12
      if (bfd_read (buffer, remaining, in_bfd) != remaining
2031
12
    || bfd_write (buffer, remaining, out_bfd) != remaining)
2032
0
  return false;
2033
12
    }
2034
2035
25
  return true;
2036
25
}
2037
2038
static bool
2039
xcoff_write_armap_big (bfd *abfd, unsigned int elength ATTRIBUTE_UNUSED,
2040
           struct orl *map, unsigned int orl_count, int stridx)
2041
0
{
2042
0
  struct archive_iterator iterator;
2043
0
  struct xcoff_ar_file_hdr_big *fhdr;
2044
0
  bfd_vma i, sym_32, sym_64, str_32, str_64;
2045
0
  const bfd_arch_info_type *arch_info;
2046
0
  bfd *current_bfd;
2047
0
  size_t string_length;
2048
0
  file_ptr nextoff, prevoff;
2049
2050
  /* First, we look through the symbols and work out which are
2051
     from 32-bit objects and which from 64-bit ones.  */
2052
0
  sym_32 = sym_64 = str_32 = str_64 = 0;
2053
2054
0
  i = 0;
2055
0
  for (current_bfd = abfd->archive_head;
2056
0
       current_bfd != NULL && i < orl_count;
2057
0
       current_bfd = current_bfd->archive_next)
2058
0
    {
2059
0
      arch_info = bfd_get_arch_info (current_bfd);
2060
0
      while (map[i].abfd == current_bfd)
2061
0
  {
2062
0
    string_length = strlen (*map[i].name) + 1;
2063
0
    if (arch_info->bits_per_address == 64)
2064
0
      {
2065
0
        sym_64++;
2066
0
        str_64 += string_length;
2067
0
      }
2068
0
    else
2069
0
      {
2070
0
        sym_32++;
2071
0
        str_32 += string_length;
2072
0
      }
2073
0
    i++;
2074
0
  }
2075
0
    }
2076
2077
  /* A quick sanity check... */
2078
0
  BFD_ASSERT (sym_64 + sym_32 == orl_count);
2079
  /* Explicit cast to int for compiler.  */
2080
0
  BFD_ASSERT ((int)(str_64 + str_32) == stridx);
2081
2082
0
  fhdr = &x_artdata (abfd)->u.bhdr;
2083
2084
  /* xcoff_write_archive_contents_big passes nextoff in symoff. */
2085
0
  READ20 (fhdr->memoff, prevoff);
2086
0
  READ20 (fhdr->symoff, nextoff);
2087
2088
0
  BFD_ASSERT (nextoff == bfd_tell (abfd));
2089
2090
  /* Write out the symbol table.
2091
     Layout :
2092
2093
     standard big archive header
2094
     0x0000         ar_size [0x14]
2095
     0x0014         ar_nxtmem [0x14]
2096
     0x0028         ar_prvmem [0x14]
2097
     0x003C         ar_date [0x0C]
2098
     0x0048         ar_uid  [0x0C]
2099
     0x0054         ar_gid  [0x0C]
2100
     0x0060         ar_mod  [0x0C]
2101
     0x006C         ar_namelen[0x04]
2102
     0x0070         ar_fmag [SXCOFFARFMAG]
2103
2104
     Symbol table
2105
     0x0072         num_syms  [0x08], binary
2106
     0x0078         offsets [0x08 * num_syms], binary
2107
     0x0086 + 0x08 * num_syms names [??]
2108
     ??           pad to even bytes.
2109
  */
2110
2111
0
  if (sym_32)
2112
0
    {
2113
0
      struct xcoff_ar_hdr_big *hdr;
2114
0
      char *symbol_table;
2115
0
      char *st;
2116
2117
0
      bfd_vma symbol_table_size =
2118
0
  SIZEOF_AR_HDR_BIG
2119
0
  + SXCOFFARFMAG
2120
0
  + 8
2121
0
  + 8 * sym_32
2122
0
  + str_32 + (str_32 & 1);
2123
2124
0
      symbol_table = bfd_zmalloc (symbol_table_size);
2125
0
      if (symbol_table == NULL)
2126
0
  return false;
2127
2128
0
      hdr = (struct xcoff_ar_hdr_big *) symbol_table;
2129
2130
0
      PRINT20 (hdr->size, 8 + 8 * sym_32 + str_32 + (str_32 & 1));
2131
2132
0
      if (sym_64)
2133
0
  PRINT20 (hdr->nextoff, nextoff + symbol_table_size);
2134
0
      else
2135
0
  PRINT20 (hdr->nextoff, 0);
2136
2137
0
      PRINT20 (hdr->prevoff, prevoff);
2138
0
      PRINT12 (hdr->date, 0);
2139
0
      PRINT12 (hdr->uid, 0);
2140
0
      PRINT12 (hdr->gid, 0);
2141
0
      PRINT12 (hdr->mode, 0);
2142
0
      PRINT4 (hdr->namlen, 0) ;
2143
2144
0
      st = symbol_table + SIZEOF_AR_HDR_BIG;
2145
0
      memcpy (st, XCOFFARFMAG, SXCOFFARFMAG);
2146
0
      st += SXCOFFARFMAG;
2147
2148
0
      bfd_h_put_64 (abfd, sym_32, st);
2149
0
      st += 8;
2150
2151
      /* loop over the 32 bit offsets */
2152
0
      i = 0;
2153
0
      archive_iterator_begin (&iterator, abfd);
2154
0
      while (i < orl_count && archive_iterator_next (&iterator))
2155
0
  {
2156
0
    arch_info = bfd_get_arch_info (iterator.current.member);
2157
0
    while (map[i].abfd == iterator.current.member)
2158
0
      {
2159
0
        if (arch_info->bits_per_address == 32)
2160
0
    {
2161
0
      bfd_h_put_64 (abfd, iterator.current.offset, st);
2162
0
      st += 8;
2163
0
    }
2164
0
        i++;
2165
0
      }
2166
0
  }
2167
2168
      /* loop over the 32 bit symbol names */
2169
0
      i = 0;
2170
0
      for (current_bfd = abfd->archive_head;
2171
0
     current_bfd != NULL && i < orl_count;
2172
0
     current_bfd = current_bfd->archive_next)
2173
0
  {
2174
0
    arch_info = bfd_get_arch_info (current_bfd);
2175
0
    while (map[i].abfd == current_bfd)
2176
0
      {
2177
0
        if (arch_info->bits_per_address == 32)
2178
0
    {
2179
0
      string_length = sprintf (st, "%s", *map[i].name);
2180
0
      st += string_length + 1;
2181
0
    }
2182
0
        i++;
2183
0
      }
2184
0
  }
2185
2186
0
      if (bfd_write (symbol_table, symbol_table_size, abfd)
2187
0
    != symbol_table_size)
2188
0
  {
2189
0
    free (symbol_table);
2190
0
    return false;
2191
0
  }
2192
0
      free (symbol_table);
2193
2194
0
      prevoff = nextoff;
2195
0
      nextoff = nextoff + symbol_table_size;
2196
0
    }
2197
0
  else
2198
0
    PRINT20 (fhdr->symoff, 0);
2199
2200
0
  if (sym_64)
2201
0
    {
2202
0
      struct xcoff_ar_hdr_big *hdr;
2203
0
      char *symbol_table;
2204
0
      char *st;
2205
2206
0
      bfd_vma symbol_table_size =
2207
0
  SIZEOF_AR_HDR_BIG
2208
0
  + SXCOFFARFMAG
2209
0
  + 8
2210
0
  + 8 * sym_64
2211
0
  + str_64 + (str_64 & 1);
2212
2213
0
      symbol_table = bfd_zmalloc (symbol_table_size);
2214
0
      if (symbol_table == NULL)
2215
0
  return false;
2216
2217
0
      hdr = (struct xcoff_ar_hdr_big *) symbol_table;
2218
2219
0
      PRINT20 (hdr->size, 8 + 8 * sym_64 + str_64 + (str_64 & 1));
2220
0
      PRINT20 (hdr->nextoff, 0);
2221
0
      PRINT20 (hdr->prevoff, prevoff);
2222
0
      PRINT12 (hdr->date, 0);
2223
0
      PRINT12 (hdr->uid, 0);
2224
0
      PRINT12 (hdr->gid, 0);
2225
0
      PRINT12 (hdr->mode, 0);
2226
0
      PRINT4 (hdr->namlen, 0);
2227
2228
0
      st = symbol_table + SIZEOF_AR_HDR_BIG;
2229
0
      memcpy (st, XCOFFARFMAG, SXCOFFARFMAG);
2230
0
      st += SXCOFFARFMAG;
2231
2232
0
      bfd_h_put_64 (abfd, sym_64, st);
2233
0
      st += 8;
2234
2235
      /* loop over the 64 bit offsets */
2236
0
      i = 0;
2237
0
      archive_iterator_begin (&iterator, abfd);
2238
0
      while (i < orl_count && archive_iterator_next (&iterator))
2239
0
  {
2240
0
    arch_info = bfd_get_arch_info (iterator.current.member);
2241
0
    while (map[i].abfd == iterator.current.member)
2242
0
      {
2243
0
        if (arch_info->bits_per_address == 64)
2244
0
    {
2245
0
      bfd_h_put_64 (abfd, iterator.current.offset, st);
2246
0
      st += 8;
2247
0
    }
2248
0
        i++;
2249
0
      }
2250
0
  }
2251
2252
      /* loop over the 64 bit symbol names */
2253
0
      i = 0;
2254
0
      for (current_bfd = abfd->archive_head;
2255
0
     current_bfd != NULL && i < orl_count;
2256
0
     current_bfd = current_bfd->archive_next)
2257
0
  {
2258
0
    arch_info = bfd_get_arch_info (current_bfd);
2259
0
    while (map[i].abfd == current_bfd)
2260
0
      {
2261
0
        if (arch_info->bits_per_address == 64)
2262
0
    {
2263
0
      string_length = sprintf (st, "%s", *map[i].name);
2264
0
      st += string_length + 1;
2265
0
    }
2266
0
        i++;
2267
0
      }
2268
0
  }
2269
2270
0
      if (bfd_write (symbol_table, symbol_table_size, abfd)
2271
0
    != symbol_table_size)
2272
0
  {
2273
0
    free (symbol_table);
2274
0
    return false;
2275
0
  }
2276
0
      free (symbol_table);
2277
2278
0
      PRINT20 (fhdr->symoff64, nextoff);
2279
0
    }
2280
0
  else
2281
0
    PRINT20 (fhdr->symoff64, 0);
2282
2283
0
  return true;
2284
0
}
2285
2286
bool
2287
_bfd_xcoff_write_armap (bfd *abfd, unsigned int elength ATTRIBUTE_UNUSED,
2288
      struct orl *map, unsigned int orl_count, int stridx)
2289
0
{
2290
0
  if (! xcoff_big_format_p (abfd))
2291
0
    return xcoff_write_armap_old (abfd, elength, map, orl_count, stridx);
2292
0
  else
2293
0
    return xcoff_write_armap_big (abfd, elength, map, orl_count, stridx);
2294
0
}
2295
2296
/* Write out an XCOFF archive.  We always write an entire archive,
2297
   rather than fussing with the freelist and so forth.  */
2298
2299
static bool
2300
xcoff_write_archive_contents_old (bfd *abfd)
2301
7
{
2302
7
  struct archive_iterator iterator;
2303
7
  struct xcoff_artdata xtdata;
2304
7
  struct xcoff_ar_file_hdr *fhdr = &xtdata.u.hdr;
2305
7
  bfd_size_type count;
2306
7
  bfd_size_type total_namlen;
2307
7
  file_ptr *offsets;
2308
7
  bool makemap;
2309
7
  bool hasobjects;
2310
7
  file_ptr prevoff, nextoff;
2311
7
  bfd *sub;
2312
7
  size_t i;
2313
7
  struct xcoff_ar_hdr ahdr;
2314
7
  bfd_size_type size;
2315
7
  char *p;
2316
7
  char decbuf[XCOFFARMAG_ELEMENT_SIZE + 1];
2317
2318
7
  memset (&xtdata, 0, sizeof (xtdata));
2319
7
  memcpy (fhdr->magic, XCOFFARMAG, SXCOFFARMAG);
2320
7
  sprintf (fhdr->firstmemoff, "%zu", SIZEOF_AR_FILE_HDR);
2321
7
  sprintf (fhdr->freeoff, "%d", 0);
2322
2323
7
  count = 0;
2324
7
  total_namlen = 0;
2325
7
  for (sub = abfd->archive_head; sub != NULL; sub = sub->archive_next)
2326
0
    {
2327
0
      ++count;
2328
0
      total_namlen += strlen (normalize_filename (sub)) + 1;
2329
0
      if (sub->arelt_data == NULL)
2330
0
  {
2331
0
    sub->arelt_data = bfd_zmalloc (sizeof (struct areltdata));
2332
0
    if (sub->arelt_data == NULL)
2333
0
      return false;
2334
0
  }
2335
0
      if (arch_xhdr (sub) == NULL)
2336
0
  {
2337
0
    struct xcoff_ar_hdr *ahdrp;
2338
0
    struct stat s;
2339
2340
0
    if ((sub->flags & BFD_IN_MEMORY) != 0)
2341
0
      {
2342
        /* Assume we just "made" the member, and fake it.  */
2343
0
        struct bfd_in_memory *bim
2344
0
    = (struct bfd_in_memory *) sub->iostream;
2345
0
        time (&s.st_mtime);
2346
0
        s.st_uid = getuid ();
2347
0
        s.st_gid = getgid ();
2348
0
        s.st_mode = 0644;
2349
0
        s.st_size = bim->size;
2350
0
      }
2351
0
    else if (stat (bfd_get_filename (sub), &s) != 0)
2352
0
      {
2353
0
        bfd_set_input_error (sub, bfd_error_system_call);
2354
0
        return false;
2355
0
      }
2356
2357
0
    if ((abfd->flags & BFD_DETERMINISTIC_OUTPUT) != 0)
2358
0
      {
2359
0
        s.st_mtime = 0;
2360
0
        s.st_uid = 0;
2361
0
        s.st_gid = 0;
2362
0
        s.st_mode = 0644;
2363
0
      }
2364
2365
0
    ahdrp = bfd_zalloc (sub, sizeof (*ahdrp));
2366
0
    if (ahdrp == NULL)
2367
0
      return false;
2368
2369
0
    sprintf (ahdrp->size, "%ld", (long) s.st_size);
2370
0
    sprintf (ahdrp->date, "%ld", (long) s.st_mtime);
2371
0
    sprintf (ahdrp->uid, "%ld", (long) s.st_uid);
2372
0
    sprintf (ahdrp->gid, "%ld", (long) s.st_gid);
2373
0
    sprintf (ahdrp->mode, "%o", (unsigned int) s.st_mode);
2374
2375
0
    arch_eltdata (sub)->arch_header = (char *) ahdrp;
2376
0
    arch_eltdata (sub)->parsed_size = s.st_size;
2377
0
  }
2378
0
    }
2379
7
  offsets = (file_ptr *) bfd_alloc (abfd, count * sizeof (file_ptr));
2380
7
  if (offsets == NULL)
2381
0
    return false;
2382
2383
7
  if (bfd_seek (abfd, SIZEOF_AR_FILE_HDR, SEEK_SET) != 0)
2384
0
    return false;
2385
2386
7
  makemap = bfd_has_map (abfd);
2387
7
  hasobjects = false;
2388
7
  prevoff = 0;
2389
7
  for (archive_iterator_begin (&iterator, abfd), i = 0;
2390
7
       archive_iterator_next (&iterator);
2391
7
       i++)
2392
0
    {
2393
0
      bfd_size_type namlen;
2394
0
      struct xcoff_ar_hdr *ahdrp;
2395
2396
0
      if (makemap && ! hasobjects)
2397
0
  {
2398
0
    if (bfd_check_format (iterator.current.member, bfd_object))
2399
0
      hasobjects = true;
2400
0
  }
2401
2402
0
      ahdrp = arch_xhdr (iterator.current.member);
2403
0
      sprintf (ahdrp->prevoff, "%ld", (long) prevoff);
2404
0
      sprintf (ahdrp->namlen, "%ld", (long) iterator.current.namlen);
2405
0
      sprintf (ahdrp->nextoff, "%ld", (long) iterator.next.offset);
2406
2407
      /* We need spaces, not null bytes, in the header.  */
2408
0
      for (p = (char *) ahdrp; p < (char *) ahdrp + SIZEOF_AR_HDR; p++)
2409
0
  if (*p == '\0')
2410
0
    *p = ' ';
2411
2412
0
      if (!do_pad (abfd, iterator.current.leading_padding))
2413
0
  return false;
2414
2415
0
      BFD_ASSERT (iterator.current.offset == bfd_tell (abfd));
2416
0
      namlen = iterator.current.padded_namlen;
2417
0
      if (bfd_write (ahdrp, SIZEOF_AR_HDR, abfd) != SIZEOF_AR_HDR
2418
0
    || bfd_write (iterator.current.name, namlen, abfd) != namlen
2419
0
    || bfd_write (XCOFFARFMAG, SXCOFFARFMAG, abfd) != SXCOFFARFMAG
2420
0
    || bfd_seek (iterator.current.member, 0, SEEK_SET) != 0
2421
0
    || !do_copy (abfd, iterator.current.member)
2422
0
    || !do_pad (abfd, iterator.current.trailing_padding))
2423
0
  return false;
2424
2425
0
      offsets[i] = iterator.current.offset;
2426
0
      prevoff = iterator.current.offset;
2427
0
    }
2428
2429
7
  sprintf (fhdr->lastmemoff, "%ld", (long) prevoff);
2430
2431
  /* Write out the member table.  */
2432
2433
7
  nextoff = iterator.next.offset;
2434
7
  BFD_ASSERT (nextoff == bfd_tell (abfd));
2435
7
  sprintf (fhdr->memoff, "%ld", (long) nextoff);
2436
2437
7
  memset (&ahdr, 0, sizeof ahdr);
2438
7
  sprintf (ahdr.size, "%ld", (long) (XCOFFARMAG_ELEMENT_SIZE
2439
7
             + count * XCOFFARMAG_ELEMENT_SIZE
2440
7
             + total_namlen));
2441
7
  sprintf (ahdr.prevoff, "%ld", (long) prevoff);
2442
7
  sprintf (ahdr.date, "%d", 0);
2443
7
  sprintf (ahdr.uid, "%d", 0);
2444
7
  sprintf (ahdr.gid, "%d", 0);
2445
7
  sprintf (ahdr.mode, "%d", 0);
2446
7
  sprintf (ahdr.namlen, "%d", 0);
2447
2448
7
  size = (SIZEOF_AR_HDR
2449
7
    + XCOFFARMAG_ELEMENT_SIZE
2450
7
    + count * XCOFFARMAG_ELEMENT_SIZE
2451
7
    + total_namlen
2452
7
    + SXCOFFARFMAG);
2453
2454
7
  prevoff = nextoff;
2455
7
  nextoff += size + (size & 1);
2456
2457
7
  if (makemap && hasobjects)
2458
0
    sprintf (ahdr.nextoff, "%ld", (long) nextoff);
2459
7
  else
2460
7
    sprintf (ahdr.nextoff, "%d", 0);
2461
2462
  /* We need spaces, not null bytes, in the header.  */
2463
623
  for (p = (char *) &ahdr; p < (char *) &ahdr + SIZEOF_AR_HDR; p++)
2464
616
    if (*p == '\0')
2465
553
      *p = ' ';
2466
2467
7
  if ((bfd_write (&ahdr, SIZEOF_AR_HDR, abfd) != SIZEOF_AR_HDR)
2468
7
      || bfd_write (XCOFFARFMAG, SXCOFFARFMAG, abfd) != SXCOFFARFMAG)
2469
0
    return false;
2470
2471
7
  sprintf (decbuf, "%-12ld", (long) count);
2472
7
  if (bfd_write (decbuf, XCOFFARMAG_ELEMENT_SIZE, abfd)
2473
7
      != XCOFFARMAG_ELEMENT_SIZE)
2474
0
    return false;
2475
7
  for (i = 0; i < (size_t) count; i++)
2476
0
    {
2477
0
      sprintf (decbuf, "%-12ld", (long) offsets[i]);
2478
0
      if (bfd_write (decbuf, XCOFFARMAG_ELEMENT_SIZE, abfd)
2479
0
    != XCOFFARMAG_ELEMENT_SIZE)
2480
0
  return false;
2481
0
    }
2482
7
  for (sub = abfd->archive_head; sub != NULL; sub = sub->archive_next)
2483
0
    {
2484
0
      const char *name;
2485
0
      bfd_size_type namlen;
2486
2487
0
      name = normalize_filename (sub);
2488
0
      namlen = strlen (name);
2489
0
      if (bfd_write (name, namlen + 1, abfd) != namlen + 1)
2490
0
  return false;
2491
0
    }
2492
2493
7
  if (! do_pad (abfd, size & 1))
2494
0
    return false;
2495
2496
  /* Write out the armap, if appropriate.  */
2497
7
  if (! makemap || ! hasobjects)
2498
7
    sprintf (fhdr->symoff, "%d", 0);
2499
0
  else
2500
0
    {
2501
0
      BFD_ASSERT (nextoff == bfd_tell (abfd));
2502
0
      sprintf (fhdr->symoff, "%ld", (long) nextoff);
2503
0
      bfd_ardata (abfd)->tdata = &xtdata;
2504
0
      bool ret = _bfd_compute_and_push_armap (abfd, 0, false,
2505
0
                _bfd_write_armap);
2506
0
      bfd_ardata (abfd)->tdata = NULL;
2507
0
      if (!ret)
2508
0
  return false;
2509
0
    }
2510
2511
  /* Write out the archive file header.  */
2512
2513
  /* We need spaces, not null bytes, in the header.  */
2514
483
  for (p = (char *) fhdr; p < (char *) fhdr + SIZEOF_AR_FILE_HDR; p++)
2515
476
    if (*p == '\0')
2516
371
      *p = ' ';
2517
2518
7
  if (bfd_seek (abfd, 0, SEEK_SET) != 0
2519
7
      || (bfd_write (fhdr, SIZEOF_AR_FILE_HDR, abfd) != SIZEOF_AR_FILE_HDR))
2520
0
    return false;
2521
2522
7
  return true;
2523
7
}
2524
2525
static bool
2526
xcoff_write_archive_contents_big (bfd *abfd)
2527
301
{
2528
301
  struct xcoff_artdata xtdata;
2529
301
  struct xcoff_ar_file_hdr_big *fhdr = &xtdata.u.bhdr;
2530
301
  bfd_size_type count;
2531
301
  bfd_size_type total_namlen;
2532
301
  file_ptr *offsets;
2533
301
  bool makemap;
2534
301
  bool hasobjects;
2535
301
  file_ptr prevoff, nextoff;
2536
301
  bfd *current_bfd;
2537
301
  size_t i;
2538
301
  struct xcoff_ar_hdr_big *hdr;
2539
301
  bfd_size_type size;
2540
301
  char *member_table, *mt;
2541
301
  bfd_vma member_table_size;
2542
301
  struct archive_iterator iterator;
2543
2544
301
  memset (&xtdata, 0, sizeof (xtdata));
2545
301
  memcpy (fhdr->magic, XCOFFARMAGBIG, SXCOFFARMAG);
2546
2547
301
  if (bfd_seek (abfd, SIZEOF_AR_FILE_HDR_BIG, SEEK_SET) != 0)
2548
0
    return false;
2549
2550
  /* Calculate count and total_namlen.  */
2551
301
  makemap = bfd_has_map (abfd);
2552
301
  hasobjects = false;
2553
301
  for (current_bfd = abfd->archive_head, count = 0, total_namlen = 0;
2554
326
       current_bfd != NULL;
2555
301
       current_bfd = current_bfd->archive_next, count++)
2556
25
    {
2557
25
      total_namlen += strlen (normalize_filename (current_bfd)) + 1;
2558
2559
25
      if (makemap
2560
8
    && ! hasobjects
2561
8
    && bfd_check_format (current_bfd, bfd_object))
2562
0
  hasobjects = true;
2563
2564
25
      if (current_bfd->arelt_data == NULL)
2565
25
  {
2566
25
    size = sizeof (struct areltdata);
2567
25
    current_bfd->arelt_data = bfd_zmalloc (size);
2568
25
    if (current_bfd->arelt_data == NULL)
2569
0
      return false;
2570
25
  }
2571
2572
25
      if (arch_xhdr_big (current_bfd) == NULL)
2573
25
  {
2574
25
    struct xcoff_ar_hdr_big *ahdrp;
2575
25
    struct stat s;
2576
2577
25
    if ((current_bfd->flags & BFD_IN_MEMORY) != 0)
2578
0
      {
2579
        /* Assume we just "made" the member, and fake it.  */
2580
0
        struct bfd_in_memory *bim
2581
0
    = (struct bfd_in_memory *) current_bfd->iostream;
2582
0
        time (&s.st_mtime);
2583
0
        s.st_uid = getuid ();
2584
0
        s.st_gid = getgid ();
2585
0
        s.st_mode = 0644;
2586
0
        s.st_size = bim->size;
2587
0
      }
2588
25
    else if (stat (bfd_get_filename (current_bfd), &s) != 0)
2589
0
      {
2590
0
        bfd_set_input_error (current_bfd, bfd_error_system_call);
2591
0
        return false;
2592
0
      }
2593
2594
25
    if ((abfd->flags & BFD_DETERMINISTIC_OUTPUT) != 0)
2595
0
      {
2596
0
        s.st_mtime = 0;
2597
0
        s.st_uid = 0;
2598
0
        s.st_gid = 0;
2599
0
        s.st_mode = 0644;
2600
0
      }
2601
2602
25
    ahdrp = bfd_zalloc (current_bfd, sizeof (*ahdrp));
2603
25
    if (ahdrp == NULL)
2604
0
      return false;
2605
2606
25
    PRINT20 (ahdrp->size, s.st_size);
2607
25
    PRINT12 (ahdrp->date, s.st_mtime);
2608
25
    PRINT12 (ahdrp->uid,  s.st_uid);
2609
25
    PRINT12 (ahdrp->gid,  s.st_gid);
2610
25
    PRINT12_OCTAL (ahdrp->mode, s.st_mode);
2611
2612
25
    arch_eltdata (current_bfd)->arch_header = (char *) ahdrp;
2613
25
    arch_eltdata (current_bfd)->parsed_size = s.st_size;
2614
25
  }
2615
25
    }
2616
2617
301
  offsets = NULL;
2618
301
  if (count)
2619
22
    {
2620
22
      offsets = (file_ptr *) bfd_malloc (count * sizeof (file_ptr));
2621
22
      if (offsets == NULL)
2622
0
  return false;
2623
22
    }
2624
2625
301
  prevoff = 0;
2626
301
  for (archive_iterator_begin (&iterator, abfd), i = 0;
2627
326
       archive_iterator_next (&iterator);
2628
301
       i++)
2629
25
    {
2630
25
      bfd_size_type namlen;
2631
25
      struct xcoff_ar_hdr_big *ahdrp;
2632
2633
25
      ahdrp = arch_xhdr_big (iterator.current.member);
2634
25
      PRINT20 (ahdrp->prevoff, prevoff);
2635
25
      PRINT4 (ahdrp->namlen, iterator.current.namlen);
2636
25
      PRINT20 (ahdrp->nextoff, iterator.next.offset);
2637
2638
25
      if (!do_pad (abfd, iterator.current.leading_padding))
2639
0
  {
2640
0
    free (offsets);
2641
0
    return false;
2642
0
  }
2643
2644
25
      BFD_ASSERT (iterator.current.offset == bfd_tell (abfd));
2645
25
      namlen = iterator.current.padded_namlen;
2646
25
      if (bfd_write (ahdrp, SIZEOF_AR_HDR_BIG, abfd) != SIZEOF_AR_HDR_BIG
2647
25
    || bfd_write (iterator.current.name, namlen, abfd) != namlen
2648
25
    || bfd_write (XCOFFARFMAG, SXCOFFARFMAG, abfd) != SXCOFFARFMAG
2649
25
    || bfd_seek (iterator.current.member, 0, SEEK_SET) != 0
2650
25
    || !do_copy (abfd, iterator.current.member)
2651
25
    || !do_pad (abfd, iterator.current.trailing_padding))
2652
0
  {
2653
0
    free (offsets);
2654
0
    return false;
2655
0
  }
2656
2657
25
      offsets[i] = iterator.current.offset;
2658
25
      prevoff = iterator.current.offset;
2659
25
    }
2660
2661
301
  if (count)
2662
22
    {
2663
22
      PRINT20 (fhdr->firstmemoff, offsets[0]);
2664
22
      PRINT20 (fhdr->lastmemoff, prevoff);
2665
22
    }
2666
2667
  /* Write out the member table.
2668
     Layout :
2669
2670
     standard big archive header
2671
     0x0000         ar_size [0x14]
2672
     0x0014         ar_nxtmem [0x14]
2673
     0x0028         ar_prvmem [0x14]
2674
     0x003C         ar_date [0x0C]
2675
     0x0048         ar_uid  [0x0C]
2676
     0x0054         ar_gid  [0x0C]
2677
     0x0060         ar_mod  [0x0C]
2678
     0x006C         ar_namelen[0x04]
2679
     0x0070         ar_fmag [0x02]
2680
2681
     Member table
2682
     0x0072         count [0x14]
2683
     0x0086         offsets [0x14 * counts]
2684
     0x0086 + 0x14 * counts   names [??]
2685
     ??           pad to even bytes.
2686
   */
2687
2688
301
  nextoff = iterator.next.offset;
2689
301
  BFD_ASSERT (nextoff == bfd_tell (abfd));
2690
2691
301
  member_table_size = (SIZEOF_AR_HDR_BIG
2692
301
           + SXCOFFARFMAG
2693
301
           + XCOFFARMAGBIG_ELEMENT_SIZE
2694
301
           + count * XCOFFARMAGBIG_ELEMENT_SIZE
2695
301
           + total_namlen);
2696
2697
301
  member_table_size += member_table_size & 1;
2698
301
  member_table = bfd_zmalloc (member_table_size);
2699
301
  if (member_table == NULL)
2700
0
    {
2701
0
      free (offsets);
2702
0
      return false;
2703
0
    }
2704
2705
301
  hdr = (struct xcoff_ar_hdr_big *) member_table;
2706
2707
301
  PRINT20 (hdr->size, (XCOFFARMAGBIG_ELEMENT_SIZE
2708
301
           + count * XCOFFARMAGBIG_ELEMENT_SIZE
2709
301
           + total_namlen + (total_namlen & 1)));
2710
301
  if (makemap && hasobjects)
2711
0
    PRINT20 (hdr->nextoff, nextoff + member_table_size);
2712
301
  else
2713
301
    PRINT20 (hdr->nextoff, 0);
2714
301
  PRINT20 (hdr->prevoff, prevoff);
2715
301
  PRINT12 (hdr->date, 0);
2716
301
  PRINT12 (hdr->uid, 0);
2717
301
  PRINT12 (hdr->gid, 0);
2718
301
  PRINT12 (hdr->mode, 0);
2719
301
  PRINT4 (hdr->namlen, 0);
2720
2721
301
  mt = member_table + SIZEOF_AR_HDR_BIG;
2722
301
  memcpy (mt, XCOFFARFMAG, SXCOFFARFMAG);
2723
301
  mt += SXCOFFARFMAG;
2724
2725
301
  PRINT20 (mt, count);
2726
301
  mt += XCOFFARMAGBIG_ELEMENT_SIZE;
2727
326
  for (i = 0; i < (size_t) count; i++)
2728
25
    {
2729
25
      PRINT20 (mt, offsets[i]);
2730
25
      mt += XCOFFARMAGBIG_ELEMENT_SIZE;
2731
25
    }
2732
2733
301
  if (count)
2734
22
    {
2735
22
      free (offsets);
2736
22
      offsets = NULL;
2737
22
    }
2738
2739
301
  for (current_bfd = abfd->archive_head;
2740
326
       current_bfd != NULL;
2741
301
       current_bfd = current_bfd->archive_next)
2742
25
    {
2743
25
      const char *name;
2744
25
      size_t namlen;
2745
2746
25
      name = normalize_filename (current_bfd);
2747
25
      namlen = sprintf (mt, "%s", name);
2748
25
      mt += namlen + 1;
2749
25
    }
2750
2751
301
  if (bfd_write (member_table, member_table_size, abfd) != member_table_size)
2752
0
    return false;
2753
2754
301
  free (member_table);
2755
2756
301
  PRINT20 (fhdr->memoff, nextoff);
2757
2758
301
  prevoff = nextoff;
2759
301
  nextoff += member_table_size;
2760
2761
  /* Write out the armap, if appropriate.  */
2762
2763
301
  if (! makemap || ! hasobjects)
2764
301
    PRINT20 (fhdr->symoff, 0);
2765
0
  else
2766
0
    {
2767
0
      BFD_ASSERT (nextoff == bfd_tell (abfd));
2768
2769
      /* Save nextoff in fhdr->symoff so the armap routine can use it.  */
2770
0
      PRINT20 (fhdr->symoff, nextoff);
2771
2772
0
      bfd_ardata (abfd)->tdata = &xtdata;
2773
0
      bool ret = _bfd_compute_and_push_armap (abfd, 0, false,
2774
0
                _bfd_write_armap);
2775
0
      bfd_ardata (abfd)->tdata = NULL;
2776
0
      if (!ret)
2777
0
  return false;
2778
0
    }
2779
2780
  /* Write out the archive file header.  */
2781
2782
301
  if (bfd_seek (abfd, 0, SEEK_SET) != 0
2783
301
      || (bfd_write (fhdr, SIZEOF_AR_FILE_HDR_BIG, abfd)
2784
301
    != SIZEOF_AR_FILE_HDR_BIG))
2785
0
    return false;
2786
2787
301
  return true;
2788
301
}
2789
2790
bool
2791
_bfd_xcoff_write_archive_contents (bfd *abfd)
2792
308
{
2793
308
  if (! xcoff_big_format_p (abfd))
2794
7
    return xcoff_write_archive_contents_old (abfd);
2795
301
  else
2796
301
    return xcoff_write_archive_contents_big (abfd);
2797
308
}
2798

2799
/* We can't use the usual coff_sizeof_headers routine, because AIX
2800
   always uses an a.out header.  */
2801
2802
int
2803
_bfd_xcoff_sizeof_headers (bfd *abfd,
2804
         struct bfd_link_info *info ATTRIBUTE_UNUSED)
2805
0
{
2806
0
  int size;
2807
2808
0
  size = FILHSZ;
2809
0
  if (xcoff_data (abfd)->full_aouthdr)
2810
0
    size += AOUTSZ;
2811
0
  else
2812
0
    size += SMALL_AOUTSZ;
2813
0
  size += abfd->section_count * SCNHSZ;
2814
2815
0
  if (info->strip != strip_all)
2816
0
    {
2817
      /* There can be additional sections just for dealing with overflow in
2818
   reloc and lineno counts. But the numbers of relocs and lineno aren't
2819
   known when bfd_sizeof_headers is called, so we compute them by
2820
   summing the numbers from input sections.  */
2821
0
      struct nbr_reloc_lineno
2822
0
      {
2823
0
  unsigned int reloc_count;
2824
0
  unsigned int lineno_count;
2825
0
      };
2826
0
      struct nbr_reloc_lineno *n_rl;
2827
0
      bfd *sub;
2828
0
      unsigned int max_index;
2829
0
      asection *s;
2830
2831
      /* Although the number of sections is known, the maximum value of
2832
   section->index isn't (because some sections may have been removed).
2833
   Don't try to renumber sections, just compute the upper bound.  */
2834
0
      max_index = 0;
2835
0
      for (s = abfd->sections; s != NULL; s = s->next)
2836
0
  if (s->index > max_index)
2837
0
    max_index = s->index;
2838
2839
      /* Allocate the per section counters. It could be possible to use a
2840
   preallocated array as the number of sections is limited on XCOFF,
2841
   but this creates a maintainance issue.  */
2842
0
      n_rl = bfd_zmalloc ((max_index + 1) * sizeof (*n_rl));
2843
0
      if (n_rl == NULL)
2844
0
  return -1;
2845
2846
      /* Sum.  */
2847
0
      for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
2848
0
  for (s = sub->sections; s != NULL; s = s->next)
2849
0
    if (s->output_section->owner == abfd
2850
0
        && !bfd_section_removed_from_list (abfd, s->output_section))
2851
0
      {
2852
0
        struct nbr_reloc_lineno *e = &n_rl[s->output_section->index];
2853
0
        e->reloc_count += s->reloc_count;
2854
0
        e->lineno_count += s->lineno_count;
2855
0
      }
2856
2857
      /* Add the size of a section for each section with an overflow.  */
2858
0
      for (s = abfd->sections; s != NULL; s = s->next)
2859
0
  {
2860
0
    struct nbr_reloc_lineno *e = &n_rl[s->index];
2861
2862
0
    if (e->reloc_count >= 0xffff
2863
0
        || (e->lineno_count >= 0xffff && info->strip != strip_debugger))
2864
0
      size += SCNHSZ;
2865
0
  }
2866
2867
0
      free (n_rl);
2868
0
    }
2869
2870
0
  return size;
2871
0
}
2872

2873
/* Routines to swap information in the XCOFF .loader section.  If we
2874
   ever need to write an XCOFF loader, this stuff will need to be
2875
   moved to another file shared by the linker (which XCOFF calls the
2876
   ``binder'') and the loader.  */
2877
2878
/* Swap in the ldhdr structure.  */
2879
2880
static void
2881
xcoff_swap_ldhdr_in (bfd *abfd, const void * s, struct internal_ldhdr *dst)
2882
0
{
2883
0
  const struct external_ldhdr *src = (const struct external_ldhdr *) s;
2884
2885
0
  dst->l_version = bfd_get_32 (abfd, src->l_version);
2886
0
  dst->l_nsyms = bfd_get_32 (abfd, src->l_nsyms);
2887
0
  dst->l_nreloc = bfd_get_32 (abfd, src->l_nreloc);
2888
0
  dst->l_istlen = bfd_get_32 (abfd, src->l_istlen);
2889
0
  dst->l_nimpid = bfd_get_32 (abfd, src->l_nimpid);
2890
0
  dst->l_impoff = bfd_get_32 (abfd, src->l_impoff);
2891
0
  dst->l_stlen = bfd_get_32 (abfd, src->l_stlen);
2892
0
  dst->l_stoff = bfd_get_32 (abfd, src->l_stoff);
2893
0
}
2894
2895
/* Swap out the ldhdr structure.  */
2896
2897
static void
2898
xcoff_swap_ldhdr_out (bfd *abfd, const struct internal_ldhdr *src, void * d)
2899
0
{
2900
0
  struct external_ldhdr *dst = (struct external_ldhdr *) d;
2901
2902
0
  bfd_put_32 (abfd, (bfd_vma) src->l_version, dst->l_version);
2903
0
  bfd_put_32 (abfd, src->l_nsyms, dst->l_nsyms);
2904
0
  bfd_put_32 (abfd, src->l_nreloc, dst->l_nreloc);
2905
0
  bfd_put_32 (abfd, src->l_istlen, dst->l_istlen);
2906
0
  bfd_put_32 (abfd, src->l_nimpid, dst->l_nimpid);
2907
0
  bfd_put_32 (abfd, src->l_impoff, dst->l_impoff);
2908
0
  bfd_put_32 (abfd, src->l_stlen, dst->l_stlen);
2909
0
  bfd_put_32 (abfd, src->l_stoff, dst->l_stoff);
2910
0
}
2911
2912
/* Swap in the ldsym structure.  */
2913
2914
static void
2915
xcoff_swap_ldsym_in (bfd *abfd, const void * s, struct internal_ldsym *dst)
2916
0
{
2917
0
  const struct external_ldsym *src = (const struct external_ldsym *) s;
2918
2919
0
  if (bfd_get_32 (abfd, src->_l._l_l._l_zeroes) != 0) {
2920
0
    memcpy (dst->_l._l_name, src->_l._l_name, SYMNMLEN);
2921
0
  } else {
2922
0
    dst->_l._l_l._l_zeroes = 0;
2923
0
    dst->_l._l_l._l_offset = bfd_get_32 (abfd, src->_l._l_l._l_offset);
2924
0
  }
2925
0
  dst->l_value = bfd_get_32 (abfd, src->l_value);
2926
0
  dst->l_scnum = bfd_get_16 (abfd, src->l_scnum);
2927
0
  dst->l_smtype = bfd_get_8 (abfd, src->l_smtype);
2928
0
  dst->l_smclas = bfd_get_8 (abfd, src->l_smclas);
2929
0
  dst->l_ifile = bfd_get_32 (abfd, src->l_ifile);
2930
0
  dst->l_parm = bfd_get_32 (abfd, src->l_parm);
2931
0
}
2932
2933
/* Swap out the ldsym structure.  */
2934
2935
static void
2936
xcoff_swap_ldsym_out (bfd *abfd, const struct internal_ldsym *src, void * d)
2937
0
{
2938
0
  struct external_ldsym *dst = (struct external_ldsym *) d;
2939
2940
0
  if (src->_l._l_l._l_zeroes != 0)
2941
0
    memcpy (dst->_l._l_name, src->_l._l_name, SYMNMLEN);
2942
0
  else
2943
0
    {
2944
0
      bfd_put_32 (abfd, (bfd_vma) 0, dst->_l._l_l._l_zeroes);
2945
0
      bfd_put_32 (abfd, (bfd_vma) src->_l._l_l._l_offset,
2946
0
      dst->_l._l_l._l_offset);
2947
0
    }
2948
0
  bfd_put_32 (abfd, src->l_value, dst->l_value);
2949
0
  bfd_put_16 (abfd, (bfd_vma) src->l_scnum, dst->l_scnum);
2950
0
  bfd_put_8 (abfd, src->l_smtype, dst->l_smtype);
2951
0
  bfd_put_8 (abfd, src->l_smclas, dst->l_smclas);
2952
0
  bfd_put_32 (abfd, src->l_ifile, dst->l_ifile);
2953
0
  bfd_put_32 (abfd, src->l_parm, dst->l_parm);
2954
0
}
2955
2956
static void
2957
xcoff_swap_reloc_in (bfd *abfd, void * s, void * d)
2958
4
{
2959
4
  struct external_reloc *src = (struct external_reloc *) s;
2960
4
  struct internal_reloc *dst = (struct internal_reloc *) d;
2961
2962
4
  memset (dst, 0, sizeof (struct internal_reloc));
2963
2964
4
  dst->r_vaddr = bfd_get_32 (abfd, src->r_vaddr);
2965
4
  dst->r_symndx = bfd_get_32 (abfd, src->r_symndx);
2966
4
  dst->r_size = bfd_get_8 (abfd, src->r_size);
2967
4
  dst->r_type = bfd_get_8 (abfd, src->r_type);
2968
4
}
2969
2970
static unsigned int
2971
xcoff_swap_reloc_out (bfd *abfd, void * s, void * d)
2972
0
{
2973
0
  struct internal_reloc *src = (struct internal_reloc *) s;
2974
0
  struct external_reloc *dst = (struct external_reloc *) d;
2975
2976
0
  bfd_put_32 (abfd, src->r_vaddr, dst->r_vaddr);
2977
0
  bfd_put_32 (abfd, src->r_symndx, dst->r_symndx);
2978
0
  bfd_put_8 (abfd, src->r_type, dst->r_type);
2979
0
  bfd_put_8 (abfd, src->r_size, dst->r_size);
2980
2981
0
  return bfd_coff_relsz (abfd);
2982
0
}
2983
2984
/* Swap in the ldrel structure.  */
2985
2986
static void
2987
xcoff_swap_ldrel_in (bfd *abfd, const void * s, struct internal_ldrel *dst)
2988
0
{
2989
0
  const struct external_ldrel *src = (const struct external_ldrel *) s;
2990
2991
0
  dst->l_vaddr = bfd_get_32 (abfd, src->l_vaddr);
2992
0
  dst->l_symndx = bfd_get_32 (abfd, src->l_symndx);
2993
0
  dst->l_rtype = bfd_get_16 (abfd, src->l_rtype);
2994
0
  dst->l_rsecnm = bfd_get_16 (abfd, src->l_rsecnm);
2995
0
}
2996
2997
/* Swap out the ldrel structure.  */
2998
2999
static void
3000
xcoff_swap_ldrel_out (bfd *abfd, const struct internal_ldrel *src, void * d)
3001
0
{
3002
0
  struct external_ldrel *dst = (struct external_ldrel *) d;
3003
3004
0
  bfd_put_32 (abfd, src->l_vaddr, dst->l_vaddr);
3005
0
  bfd_put_32 (abfd, src->l_symndx, dst->l_symndx);
3006
0
  bfd_put_16 (abfd, (bfd_vma) src->l_rtype, dst->l_rtype);
3007
0
  bfd_put_16 (abfd, (bfd_vma) src->l_rsecnm, dst->l_rsecnm);
3008
0
}
3009

3010
3011
bool
3012
xcoff_reloc_type_noop (bfd *input_bfd ATTRIBUTE_UNUSED,
3013
           asection *input_section ATTRIBUTE_UNUSED,
3014
           bfd *output_bfd ATTRIBUTE_UNUSED,
3015
           struct internal_reloc *rel ATTRIBUTE_UNUSED,
3016
           struct internal_syment *sym ATTRIBUTE_UNUSED,
3017
           struct reloc_howto_struct *howto ATTRIBUTE_UNUSED,
3018
           bfd_vma val ATTRIBUTE_UNUSED,
3019
           bfd_vma addend ATTRIBUTE_UNUSED,
3020
           bfd_vma *relocation ATTRIBUTE_UNUSED,
3021
           bfd_byte *contents ATTRIBUTE_UNUSED,
3022
           struct bfd_link_info *info ATTRIBUTE_UNUSED)
3023
0
{
3024
0
  return true;
3025
0
}
3026
3027
bool
3028
xcoff_reloc_type_fail (bfd *input_bfd,
3029
           asection *input_section ATTRIBUTE_UNUSED,
3030
           bfd *output_bfd ATTRIBUTE_UNUSED,
3031
           struct internal_reloc *rel,
3032
           struct internal_syment *sym ATTRIBUTE_UNUSED,
3033
           struct reloc_howto_struct *howto ATTRIBUTE_UNUSED,
3034
           bfd_vma val ATTRIBUTE_UNUSED,
3035
           bfd_vma addend ATTRIBUTE_UNUSED,
3036
           bfd_vma *relocation ATTRIBUTE_UNUSED,
3037
           bfd_byte *contents ATTRIBUTE_UNUSED,
3038
           struct bfd_link_info *info ATTRIBUTE_UNUSED)
3039
0
{
3040
0
  _bfd_error_handler
3041
    /* xgettext: c-format */
3042
0
    (_("%pB: unsupported relocation type %#x"),
3043
0
     input_bfd, (unsigned int) rel->r_type);
3044
0
  bfd_set_error (bfd_error_bad_value);
3045
0
  return false;
3046
0
}
3047
3048
bool
3049
xcoff_reloc_type_pos (bfd *input_bfd ATTRIBUTE_UNUSED,
3050
          asection *input_section ATTRIBUTE_UNUSED,
3051
          bfd *output_bfd ATTRIBUTE_UNUSED,
3052
          struct internal_reloc *rel ATTRIBUTE_UNUSED,
3053
          struct internal_syment *sym ATTRIBUTE_UNUSED,
3054
          struct reloc_howto_struct *howto ATTRIBUTE_UNUSED,
3055
          bfd_vma val,
3056
          bfd_vma addend,
3057
          bfd_vma *relocation,
3058
          bfd_byte *contents ATTRIBUTE_UNUSED,
3059
          struct bfd_link_info *info ATTRIBUTE_UNUSED)
3060
0
{
3061
0
  *relocation = val + addend;
3062
0
  return true;
3063
0
}
3064
3065
bool
3066
xcoff_reloc_type_neg (bfd *input_bfd ATTRIBUTE_UNUSED,
3067
          asection *input_section ATTRIBUTE_UNUSED,
3068
          bfd *output_bfd ATTRIBUTE_UNUSED,
3069
          struct internal_reloc *rel ATTRIBUTE_UNUSED,
3070
          struct internal_syment *sym ATTRIBUTE_UNUSED,
3071
          struct reloc_howto_struct *howto ATTRIBUTE_UNUSED,
3072
          bfd_vma val,
3073
          bfd_vma addend,
3074
          bfd_vma *relocation,
3075
          bfd_byte *contents ATTRIBUTE_UNUSED,
3076
          struct bfd_link_info *info ATTRIBUTE_UNUSED)
3077
0
{
3078
0
  *relocation = - val - addend;
3079
0
  return true;
3080
0
}
3081
3082
bool
3083
xcoff_reloc_type_rel (bfd *input_bfd ATTRIBUTE_UNUSED,
3084
          asection *input_section,
3085
          bfd *output_bfd ATTRIBUTE_UNUSED,
3086
          struct internal_reloc *rel ATTRIBUTE_UNUSED,
3087
          struct internal_syment *sym ATTRIBUTE_UNUSED,
3088
          struct reloc_howto_struct *howto,
3089
          bfd_vma val,
3090
          bfd_vma addend,
3091
          bfd_vma *relocation,
3092
          bfd_byte *contents ATTRIBUTE_UNUSED,
3093
          struct bfd_link_info *info ATTRIBUTE_UNUSED)
3094
0
{
3095
0
  howto->pc_relative = true;
3096
3097
  /* A PC relative reloc includes the section address.  */
3098
0
  addend += input_section->vma;
3099
3100
0
  *relocation = val + addend;
3101
0
  *relocation -= (input_section->output_section->vma
3102
0
      + input_section->output_offset);
3103
0
  return true;
3104
0
}
3105
3106
bool
3107
xcoff_reloc_type_toc (bfd *input_bfd,
3108
          asection *input_section ATTRIBUTE_UNUSED,
3109
          bfd *output_bfd,
3110
          struct internal_reloc *rel,
3111
          struct internal_syment *sym ATTRIBUTE_UNUSED,
3112
          struct reloc_howto_struct *howto ATTRIBUTE_UNUSED,
3113
          bfd_vma val,
3114
          bfd_vma addend ATTRIBUTE_UNUSED,
3115
          bfd_vma *relocation,
3116
          bfd_byte *contents ATTRIBUTE_UNUSED,
3117
          struct bfd_link_info *info ATTRIBUTE_UNUSED)
3118
0
{
3119
0
  struct xcoff_link_hash_entry *h;
3120
3121
0
  if (0 > rel->r_symndx)
3122
0
    return false;
3123
3124
0
  h = obj_xcoff_sym_hashes (input_bfd)[rel->r_symndx];
3125
3126
0
  if (h != NULL && h->smclas != XMC_TD)
3127
0
    {
3128
0
      if (h->toc_section == NULL)
3129
0
  {
3130
0
    _bfd_error_handler
3131
      /* xgettext: c-format */
3132
0
      (_("%pB: TOC reloc at %#" PRIx64 " to symbol `%s' with no TOC entry"),
3133
0
       input_bfd, (uint64_t) rel->r_vaddr, h->root.root.string);
3134
0
    bfd_set_error (bfd_error_bad_value);
3135
0
    return false;
3136
0
  }
3137
3138
0
      BFD_ASSERT ((h->flags & XCOFF_SET_TOC) == 0);
3139
0
      val = (h->toc_section->output_section->vma
3140
0
        + h->toc_section->output_offset);
3141
0
    }
3142
3143
  /* We can't use the preexisting value written down by the
3144
     assembly, as R_TOCU needs to be adjusted when the final
3145
     R_TOCL value is signed.  */
3146
0
  *relocation = val - xcoff_data (output_bfd)->toc;
3147
3148
0
  if (rel->r_type == R_TOCU)
3149
0
    *relocation = ((*relocation + 0x8000) >> 16) & 0xffff;
3150
0
  if (rel->r_type == R_TOCL)
3151
0
    *relocation = *relocation & 0x0000ffff;
3152
3153
0
  return true;
3154
0
}
3155
3156
bool
3157
xcoff_reloc_type_ba (bfd *input_bfd ATTRIBUTE_UNUSED,
3158
         asection *input_section ATTRIBUTE_UNUSED,
3159
         bfd *output_bfd ATTRIBUTE_UNUSED,
3160
         struct internal_reloc *rel ATTRIBUTE_UNUSED,
3161
         struct internal_syment *sym ATTRIBUTE_UNUSED,
3162
         struct reloc_howto_struct *howto,
3163
         bfd_vma val,
3164
         bfd_vma addend,
3165
         bfd_vma *relocation,
3166
         bfd_byte *contents ATTRIBUTE_UNUSED,
3167
         struct bfd_link_info *info ATTRIBUTE_UNUSED)
3168
0
{
3169
0
  howto->src_mask &= ~3;
3170
0
  howto->dst_mask = howto->src_mask;
3171
3172
0
  *relocation = val + addend;
3173
3174
0
  return true;
3175
0
}
3176
3177
static bool
3178
xcoff_reloc_type_br (bfd *input_bfd,
3179
         asection *input_section,
3180
         bfd *output_bfd ATTRIBUTE_UNUSED,
3181
         struct internal_reloc *rel,
3182
         struct internal_syment *sym ATTRIBUTE_UNUSED,
3183
         struct reloc_howto_struct *howto,
3184
         bfd_vma val,
3185
         bfd_vma addend,
3186
         bfd_vma *relocation,
3187
         bfd_byte *contents,
3188
         struct bfd_link_info *info)
3189
0
{
3190
0
  struct xcoff_link_hash_entry *h;
3191
0
  bfd_vma section_offset;
3192
0
  struct xcoff_stub_hash_entry *stub_entry = NULL;
3193
0
  enum xcoff_stub_type stub_type;
3194
3195
0
  if (0 > rel->r_symndx)
3196
0
    return false;
3197
3198
0
  h = obj_xcoff_sym_hashes (input_bfd)[rel->r_symndx];
3199
0
  section_offset = rel->r_vaddr - input_section->vma;
3200
3201
  /* If we see an R_BR or R_RBR reloc which is jumping to global
3202
     linkage code, and it is followed by an appropriate cror nop
3203
     instruction, we replace the cror with lwz r2,20(r1).  This
3204
     restores the TOC after the glink code.  Contrariwise, if the
3205
     call is followed by a lwz r2,20(r1), but the call is not
3206
     going to global linkage code, we can replace the load with a
3207
     cror.  */
3208
0
  if (NULL != h
3209
0
      && (bfd_link_hash_defined == h->root.type
3210
0
    || bfd_link_hash_defweak == h->root.type)
3211
0
      && section_offset + 8 <= input_section->size)
3212
0
    {
3213
0
      bfd_byte *pnext;
3214
0
      unsigned long next;
3215
3216
0
      pnext = contents + section_offset + 4;
3217
0
      next = bfd_get_32 (input_bfd, pnext);
3218
3219
      /* The _ptrgl function is magic.  It is used by the AIX
3220
   compiler to call a function through a pointer.  */
3221
0
      if (h->smclas == XMC_GL || strcmp (h->root.root.string, "._ptrgl") == 0)
3222
0
  {
3223
0
    if (next == 0x4def7b82      /* cror 15,15,15 */
3224
0
        || next == 0x4ffffb82      /* cror 31,31,31 */
3225
0
        || next == 0x60000000)     /* ori r0,r0,0 */
3226
0
      bfd_put_32 (input_bfd, 0x80410014, pnext);  /* lwz r2,20(r1) */
3227
3228
0
  }
3229
0
      else
3230
0
  {
3231
0
    if (next == 0x80410014)     /* lwz r2,20(r1) */
3232
0
      bfd_put_32 (input_bfd, 0x60000000, pnext);  /* ori r0,r0,0 */
3233
0
  }
3234
0
    }
3235
0
  else if (NULL != h && bfd_link_hash_undefined == h->root.type)
3236
0
    {
3237
      /* Normally, this relocation is against a defined symbol.  In the
3238
   case where this is a partial link and the output section offset
3239
   is greater than 2^25, the linker will return an invalid error
3240
   message that the relocation has been truncated.  Yes it has been
3241
   truncated but no it not important.  For this case, disable the
3242
   overflow checking. */
3243
3244
0
      howto->complain_on_overflow = complain_overflow_dont;
3245
0
    }
3246
3247
  /* Check if a stub is needed.  */
3248
0
  stub_type = bfd_xcoff_type_of_stub (input_section, rel, val, h);
3249
0
  if (stub_type != xcoff_stub_none)
3250
0
    {
3251
0
      asection *stub_csect;
3252
3253
0
      stub_entry = bfd_xcoff_get_stub_entry (input_section, h, info);
3254
0
      if (stub_entry == NULL)
3255
0
  {
3256
0
    _bfd_error_handler (_("Unable to find the stub entry targeting %s"),
3257
0
            h->root.root.string);
3258
0
    bfd_set_error (bfd_error_bad_value);
3259
0
    return false;
3260
0
  }
3261
3262
0
      stub_csect = stub_entry->hcsect->root.u.def.section;
3263
0
      val = (stub_entry->stub_offset
3264
0
       + stub_csect->output_section->vma
3265
0
       + stub_csect->output_offset);
3266
0
    }
3267
3268
  /* The original PC-relative relocation is biased by -r_vaddr, so adding
3269
     the value below will give the absolute target address.  */
3270
0
  *relocation = val + addend + rel->r_vaddr;
3271
3272
0
  howto->src_mask &= ~3;
3273
0
  howto->dst_mask = howto->src_mask;
3274
3275
0
  if (h != NULL
3276
0
      && (h->root.type == bfd_link_hash_defined
3277
0
    || h->root.type == bfd_link_hash_defweak)
3278
0
      && bfd_is_abs_section (h->root.u.def.section)
3279
0
      && section_offset + 4 <= input_section->size)
3280
0
    {
3281
0
      bfd_byte *ptr;
3282
0
      bfd_vma insn;
3283
3284
      /* Turn the relative branch into an absolute one by setting the
3285
   AA bit.  */
3286
0
      ptr = contents + section_offset;
3287
0
      insn = bfd_get_32 (input_bfd, ptr);
3288
0
      insn |= 2;
3289
0
      bfd_put_32 (input_bfd, insn, ptr);
3290
3291
      /* Make the howto absolute too.  */
3292
0
      howto->pc_relative = false;
3293
0
      howto->complain_on_overflow = complain_overflow_bitfield;
3294
0
    }
3295
0
  else
3296
0
    {
3297
      /* Use a PC-relative howto and subtract the instruction's address
3298
   from the target address we calculated above.  */
3299
0
      howto->pc_relative = true;
3300
0
      *relocation -= (input_section->output_section->vma
3301
0
          + input_section->output_offset
3302
0
          + section_offset);
3303
0
    }
3304
0
  return true;
3305
0
}
3306
3307
bool
3308
xcoff_reloc_type_crel (bfd *input_bfd ATTRIBUTE_UNUSED,
3309
           asection *input_section,
3310
           bfd *output_bfd ATTRIBUTE_UNUSED,
3311
           struct internal_reloc *rel ATTRIBUTE_UNUSED,
3312
           struct internal_syment *sym ATTRIBUTE_UNUSED,
3313
           struct reloc_howto_struct *howto,
3314
           bfd_vma val ATTRIBUTE_UNUSED,
3315
           bfd_vma addend,
3316
           bfd_vma *relocation,
3317
           bfd_byte *contents ATTRIBUTE_UNUSED,
3318
           struct bfd_link_info *info ATTRIBUTE_UNUSED)
3319
0
{
3320
0
  howto->pc_relative = true;
3321
0
  howto->src_mask &= ~3;
3322
0
  howto->dst_mask = howto->src_mask;
3323
3324
  /* A PC relative reloc includes the section address.  */
3325
0
  addend += input_section->vma;
3326
3327
0
  *relocation = val + addend;
3328
0
  *relocation -= (input_section->output_section->vma
3329
0
      + input_section->output_offset);
3330
0
  return true;
3331
0
}
3332
3333
bool
3334
xcoff_reloc_type_tls (bfd *input_bfd ATTRIBUTE_UNUSED,
3335
          asection *input_section ATTRIBUTE_UNUSED,
3336
          bfd *output_bfd ATTRIBUTE_UNUSED,
3337
          struct internal_reloc *rel ATTRIBUTE_UNUSED,
3338
          struct internal_syment *sym ATTRIBUTE_UNUSED,
3339
          struct reloc_howto_struct *howto,
3340
          bfd_vma val,
3341
          bfd_vma addend,
3342
          bfd_vma *relocation,
3343
          bfd_byte *contents ATTRIBUTE_UNUSED,
3344
          struct bfd_link_info *info ATTRIBUTE_UNUSED)
3345
0
{
3346
0
  struct xcoff_link_hash_entry *h;
3347
3348
0
  if (0 > rel->r_symndx)
3349
0
    return false;
3350
3351
0
  h = obj_xcoff_sym_hashes (input_bfd)[rel->r_symndx];
3352
3353
  /* R_TLSML is handled by the loader but must be from a
3354
     TOC entry targeting itslef.  This is already verified in
3355
     xcoff_link_add_symbols.
3356
     The value must be 0.  */
3357
0
  if (howto->type == R_TLSML)
3358
0
    {
3359
0
      *relocation = 0;
3360
0
      return true;
3361
0
    }
3362
3363
  /* The target symbol should always be available even if it's not
3364
     exported.  */
3365
0
  BFD_ASSERT (h != NULL);
3366
3367
  /* TLS relocations must target a TLS symbol.  */
3368
0
  if (h->smclas != XMC_TL && h->smclas != XMC_UL)
3369
0
    {
3370
0
      _bfd_error_handler
3371
0
  (_("%pB: TLS relocation at 0x%" PRIx64 " over non-TLS symbol %s (0x%x)\n"),
3372
0
   input_bfd, (uint64_t) rel->r_vaddr, h->root.root.string, h->smclas);
3373
0
      return false;
3374
0
    }
3375
3376
  /* Local TLS relocations must target a local symbol, ie
3377
     non-imported. */
3378
0
  if ((rel->r_type == R_TLS_LD || rel->r_type == R_TLS_LE)
3379
0
      && (((h->flags & XCOFF_DEF_REGULAR) == 0
3380
0
       && (h->flags & XCOFF_DEF_DYNAMIC) != 0)
3381
0
    || (h->flags & XCOFF_IMPORT) != 0))
3382
0
    {
3383
0
      _bfd_error_handler
3384
0
  (_("%pB: TLS local relocation at 0x%" PRIx64 " over imported symbol %s\n"),
3385
0
   input_bfd, (uint64_t) rel->r_vaddr, h->root.root.string);
3386
0
      return false;
3387
0
    }
3388
3389
  /* R_TLSM are relocations used by the loader.
3390
     The value must be 0.  */
3391
0
  if (howto->type == R_TLSM)
3392
0
    {
3393
0
      *relocation = 0;
3394
0
      return true;
3395
0
    }
3396
3397
  /* Other TLS relocations aims to put offsets from TLS pointers
3398
     starting at -0x7c00 (or -0x7800 in XCOFF64).  It becomes a
3399
     simple R_POS relocation as long as .tdata and .tbss addresses
3400
     start at the same value. This is done in aix ld scripts.
3401
     TODO: implement optimization when tls size is < 62K.  */
3402
0
  *relocation = val + addend;
3403
3404
0
  return true;
3405
0
}
3406
3407
static bool
3408
xcoff_complain_overflow_dont_func (bfd *input_bfd ATTRIBUTE_UNUSED,
3409
           bfd_vma val ATTRIBUTE_UNUSED,
3410
           bfd_vma relocation ATTRIBUTE_UNUSED,
3411
           struct reloc_howto_struct *
3412
              howto ATTRIBUTE_UNUSED)
3413
0
{
3414
0
  return false;
3415
0
}
3416
3417
static bool
3418
xcoff_complain_overflow_bitfield_func (bfd *input_bfd,
3419
               bfd_vma val,
3420
               bfd_vma relocation,
3421
               struct reloc_howto_struct *howto)
3422
0
{
3423
0
  bfd_vma fieldmask, signmask, ss;
3424
0
  bfd_vma a, b, sum;
3425
3426
  /* Get the values to be added together.  For signed and unsigned
3427
     relocations, we assume that all values should be truncated to
3428
     the size of an address.  For bitfields, all the bits matter.
3429
     See also bfd_check_overflow.  */
3430
0
  fieldmask = N_ONES (howto->bitsize);
3431
0
  a = relocation;
3432
0
  b = val & howto->src_mask;
3433
3434
  /* Much like unsigned, except no trimming with addrmask.  In
3435
     addition, the sum overflows if there is a carry out of
3436
     the bfd_vma, i.e., the sum is less than either input
3437
     operand.  */
3438
0
  a >>= howto->rightshift;
3439
0
  b >>= howto->bitpos;
3440
3441
  /* Bitfields are sometimes used for signed numbers; for
3442
     example, a 13-bit field sometimes represents values in
3443
     0..8191 and sometimes represents values in -4096..4095.
3444
     If the field is signed and a is -4095 (0x1001) and b is
3445
     -1 (0x1fff), the sum is -4096 (0x1000), but (0x1001 +
3446
     0x1fff is 0x3000).  It's not clear how to handle this
3447
     everywhere, since there is not way to know how many bits
3448
     are significant in the relocation, but the original code
3449
     assumed that it was fully sign extended, and we will keep
3450
     that assumption.  */
3451
0
  signmask = (fieldmask >> 1) + 1;
3452
3453
0
  if ((a & ~ fieldmask) != 0)
3454
0
    {
3455
      /* Some bits out of the field are set.  This might not
3456
   be a problem: if this is a signed bitfield, it is OK
3457
   iff all the high bits are set, including the sign
3458
   bit.  We'll try setting all but the most significant
3459
   bit in the original relocation value: if this is all
3460
   ones, we are OK, assuming a signed bitfield.  */
3461
0
      ss = (signmask << howto->rightshift) - 1;
3462
0
      if ((ss | relocation) != ~ (bfd_vma) 0)
3463
0
  return true;
3464
0
      a &= fieldmask;
3465
0
    }
3466
3467
  /* We just assume (b & ~ fieldmask) == 0.  */
3468
3469
  /* We explicitly permit wrap around if this relocation
3470
     covers the high bit of an address.  The Linux kernel
3471
     relies on it, and it is the only way to write assembler
3472
     code which can run when loaded at a location 0x80000000
3473
     away from the location at which it is linked.  */
3474
0
  if ((unsigned) howto->bitsize + howto->rightshift
3475
0
      == bfd_arch_bits_per_address (input_bfd))
3476
0
    return false;
3477
3478
0
  sum = a + b;
3479
0
  if (sum < a || (sum & ~ fieldmask) != 0)
3480
0
    {
3481
      /* There was a carry out, or the field overflow.  Test
3482
   for signed operands again.  Here is the overflow test
3483
   is as for complain_overflow_signed.  */
3484
0
      if (((~ (a ^ b)) & (a ^ sum)) & signmask)
3485
0
  return true;
3486
0
    }
3487
3488
0
  return false;
3489
0
}
3490
3491
static bool
3492
xcoff_complain_overflow_signed_func (bfd *input_bfd,
3493
             bfd_vma val,
3494
             bfd_vma relocation,
3495
             struct reloc_howto_struct *howto)
3496
0
{
3497
0
  bfd_vma addrmask, fieldmask, signmask, ss;
3498
0
  bfd_vma a, b, sum;
3499
3500
  /* Get the values to be added together.  For signed and unsigned
3501
     relocations, we assume that all values should be truncated to
3502
     the size of an address.  For bitfields, all the bits matter.
3503
     See also bfd_check_overflow.  */
3504
0
  fieldmask = N_ONES (howto->bitsize);
3505
0
  addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
3506
0
  a = relocation;
3507
0
  b = val & howto->src_mask;
3508
3509
0
  a = (a & addrmask) >> howto->rightshift;
3510
3511
  /* If any sign bits are set, all sign bits must be set.
3512
     That is, A must be a valid negative address after
3513
     shifting.  */
3514
0
  signmask = ~ (fieldmask >> 1);
3515
0
  ss = a & signmask;
3516
0
  if (ss != 0 && ss != ((addrmask >> howto->rightshift) & signmask))
3517
0
    return true;
3518
3519
  /* We only need this next bit of code if the sign bit of B
3520
     is below the sign bit of A.  This would only happen if
3521
     SRC_MASK had fewer bits than BITSIZE.  Note that if
3522
     SRC_MASK has more bits than BITSIZE, we can get into
3523
     trouble; we would need to verify that B is in range, as
3524
     we do for A above.  */
3525
0
  signmask = ((~ howto->src_mask) >> 1) & howto->src_mask;
3526
0
  if ((b & signmask) != 0)
3527
0
    {
3528
      /* Set all the bits above the sign bit.  */
3529
0
      b -= signmask <<= 1;
3530
0
    }
3531
3532
0
  b = (b & addrmask) >> howto->bitpos;
3533
3534
  /* Now we can do the addition.  */
3535
0
  sum = a + b;
3536
3537
  /* See if the result has the correct sign.  Bits above the
3538
     sign bit are junk now; ignore them.  If the sum is
3539
     positive, make sure we did not have all negative inputs;
3540
     if the sum is negative, make sure we did not have all
3541
     positive inputs.  The test below looks only at the sign
3542
     bits, and it really just
3543
     SIGN (A) == SIGN (B) && SIGN (A) != SIGN (SUM)
3544
  */
3545
0
  signmask = (fieldmask >> 1) + 1;
3546
0
  if (((~ (a ^ b)) & (a ^ sum)) & signmask)
3547
0
    return true;
3548
3549
0
  return false;
3550
0
}
3551
3552
static bool
3553
xcoff_complain_overflow_unsigned_func (bfd *input_bfd,
3554
               bfd_vma val,
3555
               bfd_vma relocation,
3556
               struct reloc_howto_struct *howto)
3557
0
{
3558
0
  bfd_vma addrmask, fieldmask;
3559
0
  bfd_vma a, b, sum;
3560
3561
  /* Get the values to be added together.  For signed and unsigned
3562
     relocations, we assume that all values should be truncated to
3563
     the size of an address.  For bitfields, all the bits matter.
3564
     See also bfd_check_overflow.  */
3565
0
  fieldmask = N_ONES (howto->bitsize);
3566
0
  addrmask = N_ONES (bfd_arch_bits_per_address (input_bfd)) | fieldmask;
3567
0
  a = relocation;
3568
0
  b = val & howto->src_mask;
3569
3570
  /* Checking for an unsigned overflow is relatively easy:
3571
     trim the addresses and add, and trim the result as well.
3572
     Overflow is normally indicated when the result does not
3573
     fit in the field.  However, we also need to consider the
3574
     case when, e.g., fieldmask is 0x7fffffff or smaller, an
3575
     input is 0x80000000, and bfd_vma is only 32 bits; then we
3576
     will get sum == 0, but there is an overflow, since the
3577
     inputs did not fit in the field.  Instead of doing a
3578
     separate test, we can check for this by or-ing in the
3579
     operands when testing for the sum overflowing its final
3580
     field.  */
3581
0
  a = (a & addrmask) >> howto->rightshift;
3582
0
  b = (b & addrmask) >> howto->bitpos;
3583
0
  sum = (a + b) & addrmask;
3584
0
  if ((a | b | sum) & ~ fieldmask)
3585
0
    return true;
3586
3587
0
  return false;
3588
0
}
3589
3590
/* This is the relocation function for the RS/6000/POWER/PowerPC.
3591
   This is currently the only processor which uses XCOFF; I hope that
3592
   will never change.
3593
3594
   The original version was based on two documents:
3595
   the PowerPC AIX Version 4 Application Binary Interface, First
3596
   Edition (April 1992), and the PowerOpen ABI, Big-Endian
3597
   32-Bit Hardware Implementation (June 30, 1994).  Differences
3598
   between the documents are noted below.
3599
   Now, IBM has released an official documentation about XCOFF
3600
   format:
3601
   https://www.ibm.com/support/knowledgecenter/ssw_aix_72/filesreference/XCOFF.html
3602
3603
   Unsupported r_type's
3604
3605
   R_RTB:
3606
   R_RRTBI:
3607
   R_RRTBA:
3608
3609
   These relocs are defined by the PowerPC ABI to be
3610
   relative branches which use half of the difference
3611
   between the symbol and the program counter.  I can't
3612
   quite figure out when this is useful.  These relocs are
3613
   not defined by the PowerOpen ABI.
3614
3615
   Supported r_type's
3616
3617
   R_POS:
3618
   Simple positive relocation.
3619
3620
   R_NEG:
3621
   Simple negative relocation.
3622
3623
   R_REL:
3624
   Simple PC relative relocation.
3625
3626
   R_TOC:
3627
   TOC relative relocation.  The value in the instruction in
3628
   the input file is the offset from the input file TOC to
3629
   the desired location.  We want the offset from the final
3630
   TOC to the desired location.  We have:
3631
   isym = iTOC + in
3632
   iinsn = in + o
3633
   osym = oTOC + on
3634
   oinsn = on + o
3635
   so we must change insn by on - in.
3636
   This relocation allows the linker to perform optimizations
3637
   by transforming a load instruction into a add-immediate
3638
   when possible. The relocation is, then, changed to R_TRLA
3639
   in the output file.
3640
   TODO: Currently, the optimisation isn't implemented.
3641
3642
   R_TRL:
3643
   TOC relative relocation.  Same as R_TOC, except that
3644
   the optimization isn't allowed
3645
3646
   R_TRLA:
3647
   TOC relative relocation.  This is a TOC relative load
3648
   address instruction which have been changed to an add-
3649
   immediate instruction.
3650
3651
   R_GL:
3652
   GL linkage relocation.  The value of this relocation
3653
   is the address of the external symbol in the TOC
3654
   section.
3655
3656
   R_TCL:
3657
   Local object TOC address.  I can't figure out the
3658
   difference between this and case R_GL.
3659
3660
   R_RL:
3661
   The PowerPC AIX ABI describes this as a load which may be
3662
   changed to a load address.  The PowerOpen ABI says this
3663
   is the same as case R_POS.
3664
3665
   R_RLA:
3666
   The PowerPC AIX ABI describes this as a load address
3667
   which may be changed to a load.  The PowerOpen ABI says
3668
   this is the same as R_POS.
3669
3670
   R_REF:
3671
   Not a relocation but a way to prevent the garbage
3672
   collector of AIX linker to remove symbols.
3673
   This is not needed in our case.
3674
3675
   R_BA:
3676
   The PowerOpen ABI says this is the same as R_RBA.
3677
3678
   R_RBA:
3679
   Absolute branch which may be modified to become a
3680
   relative branch.
3681
3682
   R_BR:
3683
   The PowerOpen ABI says this is the same as R_RBR.
3684
3685
   R_RBR:
3686
   A relative branch which may be modified to become an
3687
   absolute branch.
3688
3689
   R_CAI:
3690
   The PowerPC ABI defines this as an absolute call which
3691
   may be modified to become a relative call.  The PowerOpen
3692
   ABI does not define this relocation type.
3693
3694
   R_CREL:
3695
   The PowerPC ABI defines this as a relative call which may
3696
   be modified to become an absolute call.  The PowerOpen
3697
   ABI does not define this relocation type.
3698
3699
   R_RBAC:
3700
   The PowerPC ABI defines this as an absolute branch to a
3701
   fixed address which may be modified to an absolute branch
3702
   to a symbol.  The PowerOpen ABI does not define this
3703
   relocation type.
3704
3705
   R_RBRC:
3706
   The PowerPC ABI defines this as an absolute branch to a
3707
   fixed address which may be modified to a relative branch.
3708
   The PowerOpen ABI does not define this relocation type.
3709
3710
   R_TLS:
3711
   Thread-local storage relocation using general-dynamic
3712
   model.
3713
3714
   R_TLS_IE:
3715
   Thread-local storage relocation using initial-exec model.
3716
3717
   R_TLS_LD:
3718
   Thread-local storage relocation using local-dynamic model.
3719
3720
   R_TLS_LE:
3721
   Thread-local storage relocation using local-exec model.
3722
3723
   R_TLSM:
3724
   Tread-local storage relocation used by the loader.
3725
3726
   R_TLSML:
3727
   Tread-local storage relocation used by the loader.
3728
3729
   R_TOCU:
3730
   Upper TOC relative relocation. The value is the
3731
   high-order 16 bit of a TOC relative relocation.
3732
3733
   R_TOCL:
3734
   Lower TOC relative relocation. The value is the
3735
   low-order 16 bit of a TOC relative relocation.
3736
*/
3737
3738
bool
3739
xcoff_ppc_relocate_section (bfd *output_bfd,
3740
          struct bfd_link_info *info,
3741
          bfd *input_bfd,
3742
          asection *input_section,
3743
          bfd_byte *contents,
3744
          struct internal_reloc *relocs,
3745
          struct internal_syment *syms,
3746
          asection **sections)
3747
0
{
3748
0
  struct internal_reloc *rel;
3749
0
  struct internal_reloc *relend;
3750
3751
0
  rel = relocs;
3752
0
  relend = rel + input_section->reloc_count;
3753
0
  for (; rel < relend; rel++)
3754
0
    {
3755
0
      long symndx;
3756
0
      struct xcoff_link_hash_entry *h;
3757
0
      struct internal_syment *sym;
3758
0
      bfd_vma addend;
3759
0
      bfd_vma val;
3760
0
      struct reloc_howto_struct howto;
3761
0
      bfd_vma relocation;
3762
0
      bfd_vma value_to_relocate;
3763
0
      bfd_vma address;
3764
0
      bfd_byte *location;
3765
3766
      /* Relocation type R_REF is a special relocation type which is
3767
   merely used to prevent garbage collection from occurring for
3768
   the csect including the symbol which it references.  */
3769
0
      if (rel->r_type == R_REF)
3770
0
  continue;
3771
3772
      /* Retrieve default value in HOWTO table and fix up according
3773
   to r_size field, if it can be different.
3774
   This should be made during relocation reading but the algorithms
3775
   are expecting constant howtos.  */
3776
0
      memcpy (&howto, &xcoff_howto_table[rel->r_type], sizeof (howto));
3777
0
      if (howto.bitsize != (rel->r_size & 0x1f) + 1)
3778
0
  {
3779
0
    switch (rel->r_type)
3780
0
      {
3781
0
      case R_POS:
3782
0
      case R_NEG:
3783
0
        howto.bitsize = (rel->r_size & 0x1f) + 1;
3784
0
        howto.size = HOWTO_RSIZE (howto.bitsize > 16 ? 4 : 2);
3785
0
        howto.src_mask = howto.dst_mask = N_ONES (howto.bitsize);
3786
0
        break;
3787
3788
0
      default:
3789
0
        _bfd_error_handler
3790
0
    (_("%pB: relocation (%d) at 0x%" PRIx64 " has wrong r_rsize (0x%x)\n"),
3791
0
     input_bfd, rel->r_type, (uint64_t) rel->r_vaddr, rel->r_size);
3792
0
        return false;
3793
0
      }
3794
0
  }
3795
3796
0
      howto.complain_on_overflow = (rel->r_size & 0x80
3797
0
            ? complain_overflow_signed
3798
0
            : complain_overflow_bitfield);
3799
3800
      /* symbol */
3801
0
      val = 0;
3802
0
      addend = 0;
3803
0
      h = NULL;
3804
0
      sym = NULL;
3805
0
      symndx = rel->r_symndx;
3806
3807
0
      if (-1 != symndx)
3808
0
  {
3809
0
    asection *sec;
3810
3811
0
    h = obj_xcoff_sym_hashes (input_bfd)[symndx];
3812
0
    sym = syms + symndx;
3813
0
    addend = - sym->n_value;
3814
3815
0
    if (NULL == h)
3816
0
      {
3817
0
        sec = sections[symndx];
3818
        /* Hack to make sure we use the right TOC anchor value
3819
     if this reloc is against the TOC anchor.  */
3820
0
        if (sec->name[3] == '0'
3821
0
      && strcmp (sec->name, ".tc0") == 0)
3822
0
    val = xcoff_data (output_bfd)->toc;
3823
0
        else
3824
0
    val = (sec->output_section->vma
3825
0
           + sec->output_offset
3826
0
           + sym->n_value
3827
0
           - sec->vma);
3828
0
      }
3829
0
    else
3830
0
      {
3831
0
        if (info->unresolved_syms_in_objects != RM_IGNORE
3832
0
      && (h->flags & XCOFF_WAS_UNDEFINED) != 0)
3833
0
    (*info->callbacks->undefined_symbol)
3834
0
      (info, h->root.root.string,
3835
0
       input_bfd, input_section,
3836
0
       rel->r_vaddr - input_section->vma,
3837
0
       info->unresolved_syms_in_objects == RM_DIAGNOSE &&
3838
0
           !info->warn_unresolved_syms);
3839
3840
0
        if (h->root.type == bfd_link_hash_defined
3841
0
      || h->root.type == bfd_link_hash_defweak)
3842
0
    {
3843
0
      sec = h->root.u.def.section;
3844
0
      val = (h->root.u.def.value
3845
0
       + sec->output_section->vma
3846
0
       + sec->output_offset);
3847
0
    }
3848
0
        else if (h->root.type == bfd_link_hash_common)
3849
0
    {
3850
0
      sec = h->root.u.c.p->section;
3851
0
      val = (sec->output_section->vma
3852
0
       + sec->output_offset);
3853
3854
0
    }
3855
0
        else
3856
0
    {
3857
0
      BFD_ASSERT (bfd_link_relocatable (info)
3858
0
            || (info->static_link
3859
0
          && (h->flags & XCOFF_WAS_UNDEFINED) != 0)
3860
0
            || (h->flags & XCOFF_DEF_DYNAMIC) != 0
3861
0
            || (h->flags & XCOFF_IMPORT) != 0);
3862
0
    }
3863
0
      }
3864
0
  }
3865
3866
0
      if (rel->r_type >= XCOFF_MAX_CALCULATE_RELOCATION
3867
0
    || !((*xcoff_calculate_relocation[rel->r_type])
3868
0
         (input_bfd, input_section, output_bfd, rel, sym, &howto, val,
3869
0
    addend, &relocation, contents, info)))
3870
0
  return false;
3871
3872
      /* address */
3873
0
      address = rel->r_vaddr - input_section->vma;
3874
0
      location = contents + address;
3875
3876
0
      if (address > input_section->size)
3877
0
  abort ();
3878
3879
      /* Get the value we are going to relocate.  */
3880
0
      if (2 == bfd_get_reloc_size (&howto))
3881
0
  value_to_relocate = bfd_get_16 (input_bfd, location);
3882
0
      else
3883
0
  value_to_relocate = bfd_get_32 (input_bfd, location);
3884
3885
      /* overflow.
3886
3887
   FIXME: We may drop bits during the addition
3888
   which we don't check for.  We must either check at every single
3889
   operation, which would be tedious, or we must do the computations
3890
   in a type larger than bfd_vma, which would be inefficient.  */
3891
3892
0
      if (((*xcoff_complain_overflow[howto.complain_on_overflow])
3893
0
     (input_bfd, value_to_relocate, relocation, &howto)))
3894
0
  {
3895
0
    const char *name;
3896
0
    char buf[SYMNMLEN + 1];
3897
0
    char reloc_type_name[10];
3898
3899
0
    if (symndx == -1)
3900
0
      {
3901
0
        name = "*ABS*";
3902
0
      }
3903
0
    else if (h != NULL)
3904
0
      {
3905
0
        name = NULL;
3906
0
      }
3907
0
    else
3908
0
      {
3909
0
        name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
3910
0
        if (name == NULL)
3911
0
    name = "UNKNOWN";
3912
0
      }
3913
0
    sprintf (reloc_type_name, "0x%02x", rel->r_type);
3914
3915
0
    (*info->callbacks->reloc_overflow)
3916
0
      (info, (h ? &h->root : NULL), name, reloc_type_name,
3917
0
       (bfd_vma) 0, input_bfd, input_section,
3918
0
       rel->r_vaddr - input_section->vma);
3919
0
  }
3920
3921
      /* Add RELOCATION to the right bits of VALUE_TO_RELOCATE.  */
3922
0
      value_to_relocate = ((value_to_relocate & ~howto.dst_mask)
3923
0
         | (((value_to_relocate & howto.src_mask)
3924
0
             + relocation) & howto.dst_mask));
3925
3926
      /* Put the value back in the object file.  */
3927
0
      if (2 == bfd_get_reloc_size (&howto))
3928
0
  bfd_put_16 (input_bfd, value_to_relocate, location);
3929
0
      else
3930
0
  bfd_put_32 (input_bfd, value_to_relocate, location);
3931
0
    }
3932
3933
0
  return true;
3934
0
}
3935
3936
/* gcc-8 warns (*) on all the strncpy calls in this function about
3937
   possible string truncation.  The "truncation" is not a bug.  We
3938
   have an external representation of structs with fields that are not
3939
   necessarily NULL terminated and corresponding internal
3940
   representation fields that are one larger so that they can always
3941
   be NULL terminated.
3942
   gcc versions between 4.2 and 4.6 do not allow pragma control of
3943
   diagnostics inside functions, giving a hard error if you try to use
3944
   the finer control available with later versions.
3945
   gcc prior to 4.2 warns about diagnostic push and pop.
3946
   gcc-5, gcc-6 and gcc-7 warn that -Wstringop-truncation is unknown,
3947
   unless you also add #pragma GCC diagnostic ignored "-Wpragma".
3948
   (*) Depending on your system header files!  */
3949
#if GCC_VERSION >= 8000
3950
# pragma GCC diagnostic push
3951
# pragma GCC diagnostic ignored "-Wstringop-truncation"
3952
#endif
3953
static bool
3954
_bfd_xcoff_put_ldsymbol_name (bfd *abfd ATTRIBUTE_UNUSED,
3955
            struct xcoff_loader_info *ldinfo,
3956
            struct internal_ldsym *ldsym,
3957
            const char *name)
3958
0
{
3959
0
  size_t len;
3960
0
  len = strlen (name);
3961
3962
0
  if (len <= SYMNMLEN)
3963
0
    strncpy (ldsym->_l._l_name, name, SYMNMLEN);
3964
0
  else
3965
0
    {
3966
0
      if (ldinfo->string_size + len + 3 > ldinfo->string_alc)
3967
0
  {
3968
0
    bfd_size_type newalc;
3969
0
    char *newstrings;
3970
3971
0
    newalc = ldinfo->string_alc * 2;
3972
0
    if (newalc == 0)
3973
0
      newalc = 32;
3974
0
    while (ldinfo->string_size + len + 3 > newalc)
3975
0
      newalc *= 2;
3976
3977
0
    newstrings = bfd_realloc (ldinfo->strings, newalc);
3978
0
    if (newstrings == NULL)
3979
0
      {
3980
0
        ldinfo->failed = true;
3981
0
        return false;
3982
0
      }
3983
0
    ldinfo->string_alc = newalc;
3984
0
    ldinfo->strings = newstrings;
3985
0
  }
3986
3987
0
      ldinfo->strings[ldinfo->string_size] = ((len + 1) >> 8) & 0xff;
3988
0
      ldinfo->strings[ldinfo->string_size + 1] = ((len + 1)) & 0xff;
3989
0
      strcpy (ldinfo->strings + ldinfo->string_size + 2, name);
3990
0
      ldsym->_l._l_l._l_zeroes = 0;
3991
0
      ldsym->_l._l_l._l_offset = ldinfo->string_size + 2;
3992
0
      ldinfo->string_size += len + 3;
3993
0
    }
3994
3995
0
  return true;
3996
0
}
3997
3998
static bool
3999
_bfd_xcoff_put_symbol_name (struct bfd_link_info *info,
4000
          struct bfd_strtab_hash *strtab,
4001
          struct internal_syment *sym,
4002
          const char *name)
4003
0
{
4004
0
  if (strlen (name) <= SYMNMLEN)
4005
0
    {
4006
0
      strncpy (sym->_n._n_name, name, SYMNMLEN);
4007
0
    }
4008
0
  else
4009
0
    {
4010
0
      bool hash;
4011
0
      bfd_size_type indx;
4012
4013
0
      hash = !info->traditional_format;
4014
0
      indx = _bfd_stringtab_add (strtab, name, hash, false);
4015
0
      if (indx == (bfd_size_type) -1)
4016
0
  return false;
4017
0
      sym->_n._n_n._n_zeroes = 0;
4018
0
      sym->_n._n_n._n_offset = STRING_SIZE_SIZE + indx;
4019
0
    }
4020
0
  return true;
4021
0
}
4022
#if GCC_VERSION >= 8000
4023
# pragma GCC diagnostic pop
4024
#endif
4025
4026
static asection *
4027
xcoff_create_csect_from_smclas (bfd *abfd,
4028
        union internal_auxent *aux,
4029
        const char *symbol_name)
4030
0
{
4031
0
  asection *return_value = NULL;
4032
4033
  /* .sv64 = x_smclas == 17
4034
     This is an invalid csect for 32 bit apps.  */
4035
0
  static const char * const names[] =
4036
0
    {
4037
0
      ".pr", ".ro", ".db", ".tc", ".ua", ".rw", ".gl", ".xo", /* 0 - 7 */
4038
0
      ".sv", ".bs", ".ds", ".uc", ".ti", ".tb", NULL, ".tc0", /* 8 - 15 */
4039
0
      ".td", NULL, ".sv3264", NULL, ".tl", ".ul", ".te"
4040
0
    };
4041
4042
0
  if ((aux->x_csect.x_smclas < ARRAY_SIZE (names))
4043
0
      && (NULL != names[aux->x_csect.x_smclas]))
4044
0
    {
4045
0
      return_value = bfd_make_section_anyway
4046
0
  (abfd, names[aux->x_csect.x_smclas]);
4047
0
    }
4048
0
  else
4049
0
    {
4050
0
      _bfd_error_handler
4051
  /* xgettext: c-format */
4052
0
  (_("%pB: symbol `%s' has unrecognized smclas %d"),
4053
0
   abfd, symbol_name, aux->x_csect.x_smclas);
4054
0
      bfd_set_error (bfd_error_bad_value);
4055
0
    }
4056
4057
0
  return return_value;
4058
0
}
4059
4060
static bool
4061
xcoff_is_lineno_count_overflow (bfd *abfd ATTRIBUTE_UNUSED, bfd_vma value)
4062
0
{
4063
0
  if (0xffff <= value)
4064
0
    return true;
4065
4066
0
  return false;
4067
0
}
4068
4069
static bool
4070
xcoff_is_reloc_count_overflow (bfd *abfd ATTRIBUTE_UNUSED, bfd_vma value)
4071
0
{
4072
0
  if (0xffff <= value)
4073
0
    return true;
4074
4075
0
  return false;
4076
0
}
4077
4078
static bfd_vma
4079
xcoff_loader_symbol_offset (bfd *abfd,
4080
          struct internal_ldhdr *ldhdr ATTRIBUTE_UNUSED)
4081
0
{
4082
0
  return bfd_xcoff_ldhdrsz (abfd);
4083
0
}
4084
4085
static bfd_vma
4086
xcoff_loader_reloc_offset (bfd *abfd, struct internal_ldhdr *ldhdr)
4087
0
{
4088
0
  return bfd_xcoff_ldhdrsz (abfd) + ldhdr->l_nsyms * bfd_xcoff_ldsymsz (abfd);
4089
0
}
4090
4091
static bool
4092
xcoff_generate_rtinit  (bfd *abfd, const char *init, const char *fini,
4093
      bool rtld)
4094
0
{
4095
0
  bfd_byte filehdr_ext[FILHSZ];
4096
0
  bfd_byte scnhdr_ext[SCNHSZ];
4097
0
  bfd_byte syment_ext[SYMESZ * 10];
4098
0
  bfd_byte reloc_ext[RELSZ * 3];
4099
0
  bfd_byte *data_buffer;
4100
0
  bfd_size_type data_buffer_size;
4101
0
  bfd_byte *string_table = NULL, *st_tmp = NULL;
4102
0
  bfd_size_type string_table_size;
4103
0
  bfd_vma val;
4104
0
  size_t initsz, finisz;
4105
0
  struct internal_filehdr filehdr;
4106
0
  struct internal_scnhdr scnhdr;
4107
0
  struct internal_syment syment;
4108
0
  union internal_auxent auxent;
4109
0
  struct internal_reloc reloc;
4110
4111
0
  char *data_name = ".data";
4112
0
  char *rtinit_name = "__rtinit";
4113
0
  char *rtld_name = "__rtld";
4114
4115
0
  if (! bfd_xcoff_rtinit_size (abfd))
4116
0
    return false;
4117
4118
0
  initsz = (init == NULL ? 0 : 1 + strlen (init));
4119
0
  finisz = (fini == NULL ? 0 : 1 + strlen (fini));
4120
4121
  /* file header */
4122
0
  memset (filehdr_ext, 0, FILHSZ);
4123
0
  memset (&filehdr, 0, sizeof (struct internal_filehdr));
4124
0
  filehdr.f_magic = bfd_xcoff_magic_number (abfd);
4125
0
  filehdr.f_nscns = 1;
4126
0
  filehdr.f_timdat = 0;
4127
0
  filehdr.f_nsyms = 0;  /* at least 6, no more than 10 */
4128
0
  filehdr.f_symptr = 0; /* set below */
4129
0
  filehdr.f_opthdr = 0;
4130
0
  filehdr.f_flags = 0;
4131
4132
  /* section header */
4133
0
  memset (scnhdr_ext, 0, SCNHSZ);
4134
0
  memset (&scnhdr, 0, sizeof (struct internal_scnhdr));
4135
0
  memcpy (scnhdr.s_name, data_name, strlen (data_name));
4136
0
  scnhdr.s_paddr = 0;
4137
0
  scnhdr.s_vaddr = 0;
4138
0
  scnhdr.s_size = 0;    /* set below */
4139
0
  scnhdr.s_scnptr = FILHSZ + SCNHSZ;
4140
0
  scnhdr.s_relptr = 0;  /* set below */
4141
0
  scnhdr.s_lnnoptr = 0;
4142
0
  scnhdr.s_nreloc = 0;  /* either 1 or 2 */
4143
0
  scnhdr.s_nlnno = 0;
4144
0
  scnhdr.s_flags = STYP_DATA;
4145
4146
  /* .data
4147
     0x0000       0x00000000 : rtl
4148
     0x0004       0x00000010 : offset to init, or 0
4149
     0x0008       0x00000028 : offset to fini, or 0
4150
     0x000C       0x0000000C : size of descriptor
4151
     0x0010       0x00000000 : init, needs a reloc
4152
     0x0014       0x00000040 : offset to init name
4153
     0x0018       0x00000000 : flags, padded to a word
4154
     0x001C       0x00000000 : empty init
4155
     0x0020       0x00000000 :
4156
     0x0024       0x00000000 :
4157
     0x0028       0x00000000 : fini, needs a reloc
4158
     0x002C       0x00000??? : offset to fini name
4159
     0x0030       0x00000000 : flags, padded to a word
4160
     0x0034       0x00000000 : empty fini
4161
     0x0038       0x00000000 :
4162
     0x003C       0x00000000 :
4163
     0x0040       init name
4164
     0x0040 + initsz  fini name */
4165
4166
0
  data_buffer_size = 0x0040 + initsz + finisz;
4167
0
  data_buffer_size = (data_buffer_size + 7) &~ (bfd_size_type) 7;
4168
0
  data_buffer = NULL;
4169
0
  data_buffer = (bfd_byte *) bfd_zmalloc (data_buffer_size);
4170
0
  if (data_buffer == NULL)
4171
0
    return false;
4172
4173
0
  if (initsz)
4174
0
    {
4175
0
      val = 0x10;
4176
0
      bfd_h_put_32 (abfd, val, &data_buffer[0x04]);
4177
0
      val = 0x40;
4178
0
      bfd_h_put_32 (abfd, val, &data_buffer[0x14]);
4179
0
      memcpy (&data_buffer[val], init, initsz);
4180
0
    }
4181
4182
0
  if (finisz)
4183
0
    {
4184
0
      val = 0x28;
4185
0
      bfd_h_put_32 (abfd, val, &data_buffer[0x08]);
4186
0
      val = 0x40 + initsz;
4187
0
      bfd_h_put_32 (abfd, val, &data_buffer[0x2C]);
4188
0
      memcpy (&data_buffer[val], fini, finisz);
4189
0
    }
4190
4191
0
  val = 0x0C;
4192
0
  bfd_h_put_32 (abfd, val, &data_buffer[0x0C]);
4193
4194
0
  scnhdr.s_size = data_buffer_size;
4195
4196
  /* string table */
4197
0
  string_table_size = 0;
4198
0
  if (initsz > 9)
4199
0
    string_table_size += initsz;
4200
0
  if (finisz > 9)
4201
0
    string_table_size += finisz;
4202
0
  if (string_table_size)
4203
0
    {
4204
0
      string_table_size += 4;
4205
0
      string_table = (bfd_byte *) bfd_zmalloc (string_table_size);
4206
0
      if (string_table == NULL)
4207
0
  {
4208
0
    free (data_buffer);
4209
0
    return false;
4210
0
  }
4211
4212
0
      val = string_table_size;
4213
0
      bfd_h_put_32 (abfd, val, &string_table[0]);
4214
0
      st_tmp = string_table + 4;
4215
0
    }
4216
4217
  /* symbols
4218
     0. .data csect
4219
     2. __rtinit
4220
     4. init function
4221
     6. fini function
4222
     8. __rtld  */
4223
0
  memset (syment_ext, 0, 10 * SYMESZ);
4224
0
  memset (reloc_ext, 0, 3 * RELSZ);
4225
4226
  /* .data csect */
4227
0
  memset (&syment, 0, sizeof (struct internal_syment));
4228
0
  memset (&auxent, 0, sizeof (union internal_auxent));
4229
0
  memcpy (syment._n._n_name, data_name, strlen (data_name));
4230
0
  syment.n_scnum = 1;
4231
0
  syment.n_sclass = C_HIDEXT;
4232
0
  syment.n_numaux = 1;
4233
0
  auxent.x_csect.x_scnlen.u64 = data_buffer_size;
4234
0
  auxent.x_csect.x_smtyp = 3 << 3 | XTY_SD;
4235
0
  auxent.x_csect.x_smclas = XMC_RW;
4236
0
  bfd_coff_swap_sym_out (abfd, &syment,
4237
0
       &syment_ext[filehdr.f_nsyms * SYMESZ]);
4238
0
  bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
4239
0
       syment.n_numaux,
4240
0
       &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
4241
0
  filehdr.f_nsyms += 2;
4242
4243
  /* __rtinit */
4244
0
  memset (&syment, 0, sizeof (struct internal_syment));
4245
0
  memset (&auxent, 0, sizeof (union internal_auxent));
4246
0
  memcpy (syment._n._n_name, rtinit_name, strlen (rtinit_name));
4247
0
  syment.n_scnum = 1;
4248
0
  syment.n_sclass = C_EXT;
4249
0
  syment.n_numaux = 1;
4250
0
  auxent.x_csect.x_smtyp = XTY_LD;
4251
0
  auxent.x_csect.x_smclas = XMC_RW;
4252
0
  bfd_coff_swap_sym_out (abfd, &syment,
4253
0
       &syment_ext[filehdr.f_nsyms * SYMESZ]);
4254
0
  bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
4255
0
       syment.n_numaux,
4256
0
       &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
4257
0
  filehdr.f_nsyms += 2;
4258
4259
  /* init */
4260
0
  if (initsz)
4261
0
    {
4262
0
      memset (&syment, 0, sizeof (struct internal_syment));
4263
0
      memset (&auxent, 0, sizeof (union internal_auxent));
4264
4265
0
      if (initsz > 9)
4266
0
  {
4267
0
    syment._n._n_n._n_offset = st_tmp - string_table;
4268
0
    memcpy (st_tmp, init, initsz);
4269
0
    st_tmp += initsz;
4270
0
  }
4271
0
      else
4272
0
  memcpy (syment._n._n_name, init, initsz - 1);
4273
4274
0
      syment.n_sclass = C_EXT;
4275
0
      syment.n_numaux = 1;
4276
0
      bfd_coff_swap_sym_out (abfd, &syment,
4277
0
           &syment_ext[filehdr.f_nsyms * SYMESZ]);
4278
0
      bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
4279
0
           syment.n_numaux,
4280
0
           &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
4281
4282
      /* reloc */
4283
0
      memset (&reloc, 0, sizeof (struct internal_reloc));
4284
0
      reloc.r_vaddr = 0x0010;
4285
0
      reloc.r_symndx = filehdr.f_nsyms;
4286
0
      reloc.r_type = R_POS;
4287
0
      reloc.r_size = 31;
4288
0
      bfd_coff_swap_reloc_out (abfd, &reloc, &reloc_ext[0]);
4289
4290
0
      filehdr.f_nsyms += 2;
4291
0
      scnhdr.s_nreloc += 1;
4292
0
    }
4293
4294
  /* fini */
4295
0
  if (finisz)
4296
0
    {
4297
0
      memset (&syment, 0, sizeof (struct internal_syment));
4298
0
      memset (&auxent, 0, sizeof (union internal_auxent));
4299
4300
0
      if (finisz > 9)
4301
0
  {
4302
0
    syment._n._n_n._n_offset = st_tmp - string_table;
4303
0
    memcpy (st_tmp, fini, finisz);
4304
0
    st_tmp += finisz;
4305
0
  }
4306
0
      else
4307
0
  memcpy (syment._n._n_name, fini, finisz - 1);
4308
4309
0
      syment.n_sclass = C_EXT;
4310
0
      syment.n_numaux = 1;
4311
0
      bfd_coff_swap_sym_out (abfd, &syment,
4312
0
           &syment_ext[filehdr.f_nsyms * SYMESZ]);
4313
0
      bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
4314
0
           syment.n_numaux,
4315
0
           &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
4316
4317
      /* reloc */
4318
0
      memset (&reloc, 0, sizeof (struct internal_reloc));
4319
0
      reloc.r_vaddr = 0x0028;
4320
0
      reloc.r_symndx = filehdr.f_nsyms;
4321
0
      reloc.r_type = R_POS;
4322
0
      reloc.r_size = 31;
4323
0
      bfd_coff_swap_reloc_out (abfd, &reloc,
4324
0
             &reloc_ext[scnhdr.s_nreloc * RELSZ]);
4325
4326
0
      filehdr.f_nsyms += 2;
4327
0
      scnhdr.s_nreloc += 1;
4328
0
    }
4329
4330
0
  if (rtld)
4331
0
    {
4332
0
      memset (&syment, 0, sizeof (struct internal_syment));
4333
0
      memset (&auxent, 0, sizeof (union internal_auxent));
4334
0
      memcpy (syment._n._n_name, rtld_name, strlen (rtld_name));
4335
0
      syment.n_sclass = C_EXT;
4336
0
      syment.n_numaux = 1;
4337
0
      bfd_coff_swap_sym_out (abfd, &syment,
4338
0
           &syment_ext[filehdr.f_nsyms * SYMESZ]);
4339
0
      bfd_coff_swap_aux_out (abfd, &auxent, syment.n_type, syment.n_sclass, 0,
4340
0
           syment.n_numaux,
4341
0
           &syment_ext[(filehdr.f_nsyms + 1) * SYMESZ]);
4342
4343
      /* reloc */
4344
0
      memset (&reloc, 0, sizeof (struct internal_reloc));
4345
0
      reloc.r_vaddr = 0x0000;
4346
0
      reloc.r_symndx = filehdr.f_nsyms;
4347
0
      reloc.r_type = R_POS;
4348
0
      reloc.r_size = 31;
4349
0
      bfd_coff_swap_reloc_out (abfd, &reloc,
4350
0
             &reloc_ext[scnhdr.s_nreloc * RELSZ]);
4351
4352
0
      filehdr.f_nsyms += 2;
4353
0
      scnhdr.s_nreloc += 1;
4354
0
    }
4355
4356
0
  scnhdr.s_relptr = scnhdr.s_scnptr + data_buffer_size;
4357
0
  filehdr.f_symptr = scnhdr.s_relptr + scnhdr.s_nreloc * RELSZ;
4358
4359
0
  bfd_coff_swap_filehdr_out (abfd, &filehdr, filehdr_ext);
4360
0
  bfd_coff_swap_scnhdr_out (abfd, &scnhdr, scnhdr_ext, NULL);
4361
0
  bool ret = true;
4362
0
  if (bfd_write (filehdr_ext, FILHSZ, abfd) != FILHSZ
4363
0
      || bfd_write (scnhdr_ext, SCNHSZ, abfd) != SCNHSZ
4364
0
      || bfd_write (data_buffer, data_buffer_size, abfd) != data_buffer_size
4365
0
      || (bfd_write (reloc_ext, scnhdr.s_nreloc * RELSZ, abfd)
4366
0
    != scnhdr.s_nreloc * RELSZ)
4367
0
      || (bfd_write (syment_ext, filehdr.f_nsyms * SYMESZ, abfd)
4368
0
    != (bfd_size_type) filehdr.f_nsyms * SYMESZ)
4369
0
      || bfd_write (string_table, string_table_size, abfd) != string_table_size)
4370
0
    ret = false;
4371
4372
0
  free (string_table);
4373
0
  free (data_buffer);
4374
0
  return ret;
4375
0
}
4376
4377
4378
static reloc_howto_type xcoff_dynamic_reloc =
4379
HOWTO (0,     /* type */
4380
       0,     /* rightshift */
4381
       4,     /* size */
4382
       32,      /* bitsize */
4383
       false,     /* pc_relative */
4384
       0,     /* bitpos */
4385
       complain_overflow_bitfield, /* complain_on_overflow */
4386
       0,     /* special_function */
4387
       "R_POS",     /* name */
4388
       true,      /* partial_inplace */
4389
       0xffffffff,    /* src_mask */
4390
       0xffffffff,    /* dst_mask */
4391
       false);      /* pcrel_offset */
4392
4393
/* Indirect call stub
4394
   The first word of the code must be modified by filling in
4395
   the correct TOC offset.  */
4396
4397
static const unsigned long xcoff_stub_indirect_call_code[4] =
4398
  {
4399
    0x81820000, /* lwz r12,0(r2) */
4400
    0x800c0000, /* lwz r0,0(r12) */
4401
    0x7c0903a6, /* mtctr r0 */
4402
    0x4e800420, /* bctr */
4403
  };
4404
4405
/*  Shared call stub
4406
    The first word of the code must be modified by filling in
4407
    the correct TOC offset.
4408
    This is exactly as the glink code but without the traceback,
4409
    as it won't be an independent function.  */
4410
4411
static const unsigned long xcoff_stub_shared_call_code[6] =
4412
  {
4413
    0x81820000, /* lwz r12,0(r2) */
4414
    0x90410014, /* stw r2,20(r1) */
4415
    0x800c0000, /* lwz r0,0(r12) */
4416
    0x804c0004, /* lwz r2,4(r12) */
4417
    0x7c0903a6, /* mtctr r0 */
4418
    0x4e800420, /* bctr */
4419
  };
4420
4421
/*  glink
4422
4423
   The first word of global linkage code must be modified by filling in
4424
   the correct TOC offset.  */
4425
4426
static const unsigned long xcoff_glink_code[9] =
4427
  {
4428
    0x81820000, /* lwz r12,0(r2) */
4429
    0x90410014, /* stw r2,20(r1) */
4430
    0x800c0000, /* lwz r0,0(r12) */
4431
    0x804c0004, /* lwz r2,4(r12) */
4432
    0x7c0903a6, /* mtctr r0 */
4433
    0x4e800420, /* bctr */
4434
    0x00000000, /* start of traceback table */
4435
    0x000c8000, /* traceback table */
4436
    0x00000000, /* traceback table */
4437
  };
4438
4439
/* Table to convert DWARF flags to section names.
4440
   Remember to update binutils/dwarf.c:debug_displays
4441
   if new DWARF sections are supported by XCOFF.  */
4442
4443
const struct xcoff_dwsect_name xcoff_dwsect_names[] = {
4444
  { SSUBTYP_DWINFO,  ".dwinfo",  ".debug_info",     true },
4445
  { SSUBTYP_DWLINE,  ".dwline",  ".debug_line",     true },
4446
  { SSUBTYP_DWPBNMS, ".dwpbnms", ".debug_pubnames", true },
4447
  { SSUBTYP_DWPBTYP, ".dwpbtyp", ".debug_pubtypes", true },
4448
  { SSUBTYP_DWARNGE, ".dwarnge", ".debug_aranges",  true },
4449
  { SSUBTYP_DWABREV, ".dwabrev", ".debug_abbrev",   false },
4450
  { SSUBTYP_DWSTR,   ".dwstr",   ".debug_str",      true },
4451
  { SSUBTYP_DWRNGES, ".dwrnges", ".debug_ranges",   true },
4452
  { SSUBTYP_DWLOC,   ".dwloc",   ".debug_loc",      true },
4453
  { SSUBTYP_DWFRAME, ".dwframe", ".debug_frame",    true },
4454
  { SSUBTYP_DWMAC,   ".dwmac",   ".debug_macro",    true }
4455
};
4456
4457
/* For generic entry points.  */
4458
#define _bfd_xcoff_close_and_cleanup coff_close_and_cleanup
4459
#define _bfd_xcoff_bfd_free_cached_info coff_bfd_free_cached_info
4460
#define _bfd_xcoff_new_section_hook coff_new_section_hook
4461
#define _bfd_xcoff_get_section_contents _bfd_generic_get_section_contents
4462
4463
/* For copy private data entry points.  */
4464
#define _bfd_xcoff_bfd_copy_private_bfd_data \
4465
  _bfd_xcoff_copy_private_bfd_data
4466
#define _bfd_xcoff_bfd_merge_private_bfd_data \
4467
  _bfd_generic_bfd_merge_private_bfd_data
4468
#define _bfd_xcoff_bfd_copy_private_section_data \
4469
  _bfd_generic_bfd_copy_private_section_data
4470
#define _bfd_xcoff_bfd_copy_private_symbol_data \
4471
   _bfd_generic_bfd_copy_private_symbol_data
4472
#define _bfd_xcoff_bfd_copy_private_header_data \
4473
   _bfd_generic_bfd_copy_private_header_data
4474
#define _bfd_xcoff_bfd_set_private_flags \
4475
   _bfd_generic_bfd_set_private_flags
4476
#define _bfd_xcoff_bfd_print_private_bfd_data \
4477
   _bfd_generic_bfd_print_private_bfd_data
4478
4479
/* For archive entry points.  */
4480
#define _bfd_xcoff_slurp_extended_name_table \
4481
   _bfd_noarchive_slurp_extended_name_table
4482
#define _bfd_xcoff_construct_extended_name_table \
4483
   _bfd_noarchive_construct_extended_name_table
4484
#define _bfd_xcoff_truncate_arname bfd_dont_truncate_arname
4485
#define _bfd_xcoff_write_ar_hdr _bfd_generic_write_ar_hdr
4486
#define _bfd_xcoff_get_elt_at_index _bfd_generic_get_elt_at_index
4487
#define _bfd_xcoff_generic_stat_arch_elt _bfd_xcoff_stat_arch_elt
4488
#define _bfd_xcoff_update_armap_timestamp _bfd_bool_bfd_true
4489
4490
/* For symbols entry points.  */
4491
#define _bfd_xcoff_get_symtab_upper_bound coff_get_symtab_upper_bound
4492
#define _bfd_xcoff_canonicalize_symtab coff_canonicalize_symtab
4493
#define _bfd_xcoff_make_empty_symbol coff_make_empty_symbol
4494
#define _bfd_xcoff_print_symbol coff_print_symbol
4495
#define _bfd_xcoff_get_symbol_info coff_get_symbol_info
4496
#define _bfd_xcoff_get_symbol_version_string \
4497
  _bfd_nosymbols_get_symbol_version_string
4498
#define _bfd_xcoff_bfd_is_local_label_name _bfd_xcoff_is_local_label_name
4499
#define _bfd_xcoff_bfd_is_target_special_symbol \
4500
  coff_bfd_is_target_special_symbol
4501
#define _bfd_xcoff_get_lineno coff_get_lineno
4502
#define _bfd_xcoff_find_nearest_line coff_find_nearest_line
4503
#define _bfd_xcoff_find_nearest_line_with_alt \
4504
coff_find_nearest_line_with_alt
4505
#define _bfd_xcoff_find_line coff_find_line
4506
#define _bfd_xcoff_find_inliner_info coff_find_inliner_info
4507
#define _bfd_xcoff_bfd_make_debug_symbol coff_bfd_make_debug_symbol
4508
#define _bfd_xcoff_read_minisymbols _bfd_generic_read_minisymbols
4509
#define _bfd_xcoff_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
4510
4511
/* For reloc entry points.  */
4512
#define _bfd_xcoff_get_reloc_upper_bound coff_get_reloc_upper_bound
4513
#define _bfd_xcoff_canonicalize_reloc coff_canonicalize_reloc
4514
#define _bfd_xcoff_finalize_section_relocs _bfd_generic_finalize_section_relocs
4515
#define _bfd_xcoff_bfd_reloc_type_lookup _bfd_xcoff_reloc_type_lookup
4516
#define _bfd_xcoff_bfd_reloc_name_lookup _bfd_xcoff_reloc_name_lookup
4517
4518
/* For link entry points.  */
4519
#define _bfd_xcoff_bfd_get_relocated_section_contents \
4520
  bfd_generic_get_relocated_section_contents
4521
#define _bfd_xcoff_bfd_relax_section bfd_generic_relax_section
4522
#define _bfd_xcoff_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
4523
#define _bfd_xcoff_bfd_link_just_syms _bfd_generic_link_just_syms
4524
#define _bfd_xcoff_bfd_copy_link_hash_symbol_type \
4525
  _bfd_generic_copy_link_hash_symbol_type
4526
#define _bfd_xcoff_bfd_link_split_section _bfd_generic_link_split_section
4527
#define _bfd_xcoff_bfd_gc_sections bfd_generic_gc_sections
4528
#define _bfd_xcoff_bfd_lookup_section_flags bfd_generic_lookup_section_flags
4529
#define _bfd_xcoff_bfd_is_group_section bfd_generic_is_group_section
4530
#define _bfd_xcoff_bfd_group_name bfd_generic_group_name
4531
#define _bfd_xcoff_bfd_discard_group bfd_generic_discard_group
4532
#define _bfd_xcoff_section_already_linked _bfd_generic_section_already_linked
4533
#define _bfd_xcoff_bfd_define_common_symbol _bfd_xcoff_define_common_symbol
4534
#define _bfd_xcoff_bfd_link_hide_symbol _bfd_generic_link_hide_symbol
4535
#define _bfd_xcoff_bfd_define_start_stop    bfd_generic_define_start_stop
4536
#define _bfd_xcoff_bfd_link_check_relocs    _bfd_generic_link_check_relocs
4537
4538
/* For dynamic symbols and relocs entry points.  */
4539
#define _bfd_xcoff_get_synthetic_symtab _bfd_nodynamic_get_synthetic_symtab
4540
4541
static const struct xcoff_backend_data_rec bfd_xcoff_backend_data =
4542
  {
4543
    { /* COFF backend, defined in libcoff.h.  */
4544
      _bfd_xcoff_swap_aux_in,
4545
      _bfd_xcoff_swap_sym_in,
4546
      coff_swap_lineno_in,
4547
      _bfd_xcoff_swap_aux_out,
4548
      _bfd_xcoff_swap_sym_out,
4549
      coff_swap_lineno_out,
4550
      xcoff_swap_reloc_out,
4551
      coff_swap_filehdr_out,
4552
      coff_swap_aouthdr_out,
4553
      coff_swap_scnhdr_out,
4554
      FILHSZ,
4555
      AOUTSZ,
4556
      SCNHSZ,
4557
      SYMESZ,
4558
      AUXESZ,
4559
      RELSZ,
4560
      LINESZ,
4561
      FILNMLEN,
4562
      true,     /* _bfd_coff_long_filenames */
4563
      XCOFF_NO_LONG_SECTION_NAMES,  /* _bfd_coff_long_section_names */
4564
      3,      /* _bfd_coff_default_section_alignment_power */
4565
      false,      /* _bfd_coff_force_symnames_in_strings */
4566
      2,      /* _bfd_coff_debug_string_prefix_length */
4567
      32768,      /* _bfd_coff_max_nscns */
4568
      coff_swap_filehdr_in,
4569
      coff_swap_aouthdr_in,
4570
      coff_swap_scnhdr_in,
4571
      xcoff_swap_reloc_in,
4572
      coff_bad_format_hook,
4573
      coff_set_arch_mach_hook,
4574
      coff_mkobject_hook,
4575
      styp_to_sec_flags,
4576
      coff_set_alignment_hook,
4577
      coff_slurp_symbol_table,
4578
      symname_in_debug_hook,
4579
      coff_pointerize_aux_hook,
4580
      coff_print_aux,
4581
      dummy_reloc16_extra_cases,
4582
      dummy_reloc16_estimate,
4583
      NULL,     /* bfd_coff_sym_is_global */
4584
      coff_compute_section_file_positions,
4585
      NULL,     /* _bfd_coff_start_final_link */
4586
      xcoff_ppc_relocate_section,
4587
      coff_rtype_to_howto,
4588
      NULL,     /* _bfd_coff_adjust_symndx */
4589
      coff_link_output_has_begun,
4590
      coff_final_link_postscript,
4591
      NULL      /* print_pdata.  */
4592
    },
4593
4594
    0x01DF,     /* magic number */
4595
    bfd_arch_rs6000,
4596
    bfd_mach_rs6k,
4597
4598
    /* Function pointers to xcoff specific swap routines.  */
4599
    xcoff_swap_ldhdr_in,
4600
    xcoff_swap_ldhdr_out,
4601
    xcoff_swap_ldsym_in,
4602
    xcoff_swap_ldsym_out,
4603
    xcoff_swap_ldrel_in,
4604
    xcoff_swap_ldrel_out,
4605
4606
    /* Sizes.  */
4607
    LDHDRSZ,
4608
    LDSYMSZ,
4609
    LDRELSZ,
4610
    12,       /* _xcoff_function_descriptor_size */
4611
    SMALL_AOUTSZ,
4612
4613
    /* Versions.  */
4614
    1,        /* _xcoff_ldhdr_version */
4615
4616
    _bfd_xcoff_put_symbol_name,
4617
    _bfd_xcoff_put_ldsymbol_name,
4618
    &xcoff_dynamic_reloc,
4619
    xcoff_create_csect_from_smclas,
4620
4621
    /* Lineno and reloc count overflow.  */
4622
    xcoff_is_lineno_count_overflow,
4623
    xcoff_is_reloc_count_overflow,
4624
4625
    xcoff_loader_symbol_offset,
4626
    xcoff_loader_reloc_offset,
4627
4628
    /* glink.  */
4629
    &xcoff_glink_code[0],
4630
    36,       /* _xcoff_glink_size */
4631
4632
    /* rtinit */
4633
    64,       /* _xcoff_rtinit_size */
4634
    xcoff_generate_rtinit,
4635
4636
    /* Stub indirect call.  */
4637
    &xcoff_stub_indirect_call_code[0],
4638
    16,       /* _xcoff_stub_indirect_call_size */
4639
4640
    /* Stub shared call.  */
4641
    &xcoff_stub_shared_call_code[0],
4642
    24,       /* _xcoff_stub_shared_call_size */
4643
  };
4644
4645
/* The transfer vector that leads the outside world to all of the above.  */
4646
const bfd_target rs6000_xcoff_vec =
4647
  {
4648
    "aixcoff-rs6000",
4649
    bfd_target_xcoff_flavour,
4650
    BFD_ENDIAN_BIG,   /* data byte order is big */
4651
    BFD_ENDIAN_BIG,   /* header byte order is big */
4652
4653
    (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | DYNAMIC
4654
     | HAS_SYMS | HAS_LOCALS | WP_TEXT),
4655
4656
    SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA,
4657
    0,        /* leading char */
4658
    '/',      /* ar_pad_char */
4659
    15,       /* ar_max_namelen */
4660
    0,        /* match priority.  */
4661
    TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
4662
    TARGET_MERGE_SECTIONS,
4663
4664
    /* data */
4665
    bfd_getb64,
4666
    bfd_getb_signed_64,
4667
    bfd_putb64,
4668
    bfd_getb32,
4669
    bfd_getb_signed_32,
4670
    bfd_putb32,
4671
    bfd_getb16,
4672
    bfd_getb_signed_16,
4673
    bfd_putb16,
4674
4675
    /* hdrs */
4676
    bfd_getb64,
4677
    bfd_getb_signed_64,
4678
    bfd_putb64,
4679
    bfd_getb32,
4680
    bfd_getb_signed_32,
4681
    bfd_putb32,
4682
    bfd_getb16,
4683
    bfd_getb_signed_16,
4684
    bfd_putb16,
4685
4686
    { /* bfd_check_format */
4687
      _bfd_dummy_target,
4688
      coff_object_p,
4689
      _bfd_xcoff_archive_p,
4690
      CORE_FILE_P
4691
    },
4692
4693
    { /* bfd_set_format */
4694
      _bfd_bool_bfd_false_error,
4695
      coff_mkobject,
4696
      _bfd_generic_mkarchive,
4697
      _bfd_bool_bfd_false_error
4698
    },
4699
4700
    {/* bfd_write_contents */
4701
      _bfd_bool_bfd_false_error,
4702
      coff_write_object_contents,
4703
      _bfd_xcoff_write_archive_contents,
4704
      _bfd_bool_bfd_false_error
4705
    },
4706
4707
    BFD_JUMP_TABLE_GENERIC (_bfd_xcoff),
4708
    BFD_JUMP_TABLE_COPY (_bfd_xcoff),
4709
    BFD_JUMP_TABLE_CORE (coff),
4710
    BFD_JUMP_TABLE_ARCHIVE (_bfd_xcoff),
4711
    BFD_JUMP_TABLE_SYMBOLS (_bfd_xcoff),
4712
    BFD_JUMP_TABLE_RELOCS (_bfd_xcoff),
4713
    BFD_JUMP_TABLE_WRITE (coff),
4714
    BFD_JUMP_TABLE_LINK (_bfd_xcoff),
4715
    BFD_JUMP_TABLE_DYNAMIC (_bfd_xcoff),
4716
4717
    /* Opposite endian version, none exists */
4718
    NULL,
4719
4720
    & bfd_xcoff_backend_data,
4721
  };
4722
4723
/* xcoff-powermac target
4724
   Old target.
4725
   Only difference between this target and the rs6000 target is the
4726
   the default architecture and machine type used in coffcode.h
4727
4728
   PowerPC Macs use the same magic numbers as RS/6000
4729
   (because that's how they were bootstrapped originally),
4730
   but they are always PowerPC architecture.  */
4731
static const struct xcoff_backend_data_rec bfd_pmac_xcoff_backend_data =
4732
  {
4733
    { /* COFF backend, defined in libcoff.h.  */
4734
      _bfd_xcoff_swap_aux_in,
4735
      _bfd_xcoff_swap_sym_in,
4736
      coff_swap_lineno_in,
4737
      _bfd_xcoff_swap_aux_out,
4738
      _bfd_xcoff_swap_sym_out,
4739
      coff_swap_lineno_out,
4740
      xcoff_swap_reloc_out,
4741
      coff_swap_filehdr_out,
4742
      coff_swap_aouthdr_out,
4743
      coff_swap_scnhdr_out,
4744
      FILHSZ,
4745
      AOUTSZ,
4746
      SCNHSZ,
4747
      SYMESZ,
4748
      AUXESZ,
4749
      RELSZ,
4750
      LINESZ,
4751
      FILNMLEN,
4752
      true,     /* _bfd_coff_long_filenames */
4753
      XCOFF_NO_LONG_SECTION_NAMES,  /* _bfd_coff_long_section_names */
4754
      3,      /* _bfd_coff_default_section_alignment_power */
4755
      false,      /* _bfd_coff_force_symnames_in_strings */
4756
      2,      /* _bfd_coff_debug_string_prefix_length */
4757
      32768,      /* _bfd_coff_max_nscns */
4758
      coff_swap_filehdr_in,
4759
      coff_swap_aouthdr_in,
4760
      coff_swap_scnhdr_in,
4761
      xcoff_swap_reloc_in,
4762
      coff_bad_format_hook,
4763
      coff_set_arch_mach_hook,
4764
      coff_mkobject_hook,
4765
      styp_to_sec_flags,
4766
      coff_set_alignment_hook,
4767
      coff_slurp_symbol_table,
4768
      symname_in_debug_hook,
4769
      coff_pointerize_aux_hook,
4770
      coff_print_aux,
4771
      dummy_reloc16_extra_cases,
4772
      dummy_reloc16_estimate,
4773
      NULL,     /* bfd_coff_sym_is_global */
4774
      coff_compute_section_file_positions,
4775
      NULL,     /* _bfd_coff_start_final_link */
4776
      xcoff_ppc_relocate_section,
4777
      coff_rtype_to_howto,
4778
      NULL,     /* _bfd_coff_adjust_symndx */
4779
      coff_link_output_has_begun,
4780
      coff_final_link_postscript,
4781
      NULL      /* print_pdata.  */
4782
    },
4783
4784
    0x01DF,     /* magic number */
4785
    bfd_arch_powerpc,
4786
    bfd_mach_ppc,
4787
4788
    /* Function pointers to xcoff specific swap routines.  */
4789
    xcoff_swap_ldhdr_in,
4790
    xcoff_swap_ldhdr_out,
4791
    xcoff_swap_ldsym_in,
4792
    xcoff_swap_ldsym_out,
4793
    xcoff_swap_ldrel_in,
4794
    xcoff_swap_ldrel_out,
4795
4796
    /* Sizes.  */
4797
    LDHDRSZ,
4798
    LDSYMSZ,
4799
    LDRELSZ,
4800
    12,       /* _xcoff_function_descriptor_size */
4801
    SMALL_AOUTSZ,
4802
4803
    /* Versions.  */
4804
    1,        /* _xcoff_ldhdr_version */
4805
4806
    _bfd_xcoff_put_symbol_name,
4807
    _bfd_xcoff_put_ldsymbol_name,
4808
    &xcoff_dynamic_reloc,
4809
    xcoff_create_csect_from_smclas,
4810
4811
    /* Lineno and reloc count overflow.  */
4812
    xcoff_is_lineno_count_overflow,
4813
    xcoff_is_reloc_count_overflow,
4814
4815
    xcoff_loader_symbol_offset,
4816
    xcoff_loader_reloc_offset,
4817
4818
    /* glink.  */
4819
    &xcoff_glink_code[0],
4820
    36,       /* _xcoff_glink_size */
4821
4822
    /* rtinit */
4823
    0,        /* _xcoff_rtinit_size */
4824
    xcoff_generate_rtinit,
4825
4826
    /* Stub indirect call.  */
4827
    &xcoff_stub_indirect_call_code[0],
4828
    16,       /* _xcoff_stub_indirect_call_size */
4829
4830
    /* Stub shared call.  */
4831
    &xcoff_stub_shared_call_code[0],
4832
    24,       /* _xcoff_stub_shared_call_size */
4833
  };
4834
4835
/* The transfer vector that leads the outside world to all of the above.  */
4836
const bfd_target powerpc_xcoff_vec =
4837
  {
4838
    "xcoff-powermac",
4839
    bfd_target_xcoff_flavour,
4840
    BFD_ENDIAN_BIG,   /* data byte order is big */
4841
    BFD_ENDIAN_BIG,   /* header byte order is big */
4842
4843
    (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | DYNAMIC
4844
     | HAS_SYMS | HAS_LOCALS | WP_TEXT),
4845
4846
    SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA,
4847
    0,        /* leading char */
4848
    '/',      /* ar_pad_char */
4849
    15,       /* ar_max_namelen */
4850
    0,        /* match priority.  */
4851
    TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
4852
    TARGET_MERGE_SECTIONS,
4853
4854
    /* data */
4855
    bfd_getb64,
4856
    bfd_getb_signed_64,
4857
    bfd_putb64,
4858
    bfd_getb32,
4859
    bfd_getb_signed_32,
4860
    bfd_putb32,
4861
    bfd_getb16,
4862
    bfd_getb_signed_16,
4863
    bfd_putb16,
4864
4865
    /* hdrs */
4866
    bfd_getb64,
4867
    bfd_getb_signed_64,
4868
    bfd_putb64,
4869
    bfd_getb32,
4870
    bfd_getb_signed_32,
4871
    bfd_putb32,
4872
    bfd_getb16,
4873
    bfd_getb_signed_16,
4874
    bfd_putb16,
4875
4876
    { /* bfd_check_format */
4877
      _bfd_dummy_target,
4878
      coff_object_p,
4879
      _bfd_xcoff_archive_p,
4880
      CORE_FILE_P
4881
    },
4882
4883
    { /* bfd_set_format */
4884
      _bfd_bool_bfd_false_error,
4885
      coff_mkobject,
4886
      _bfd_generic_mkarchive,
4887
      _bfd_bool_bfd_false_error
4888
    },
4889
4890
    {/* bfd_write_contents */
4891
      _bfd_bool_bfd_false_error,
4892
      coff_write_object_contents,
4893
      _bfd_xcoff_write_archive_contents,
4894
      _bfd_bool_bfd_false_error
4895
    },
4896
4897
    BFD_JUMP_TABLE_GENERIC (_bfd_xcoff),
4898
    BFD_JUMP_TABLE_COPY (_bfd_xcoff),
4899
    BFD_JUMP_TABLE_CORE (coff),
4900
    BFD_JUMP_TABLE_ARCHIVE (_bfd_xcoff),
4901
    BFD_JUMP_TABLE_SYMBOLS (_bfd_xcoff),
4902
    BFD_JUMP_TABLE_RELOCS (_bfd_xcoff),
4903
    BFD_JUMP_TABLE_WRITE (coff),
4904
    BFD_JUMP_TABLE_LINK (_bfd_xcoff),
4905
    BFD_JUMP_TABLE_DYNAMIC (_bfd_xcoff),
4906
4907
    /* Opposite endian version, none exists */
4908
    NULL,
4909
4910
    & bfd_pmac_xcoff_backend_data,
4911
  };