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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gdb-7.2/] [bfd/] [coff64-rs6000.c] - Blame information for rev 835

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

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

powered by: WebSVN 2.1.0

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