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