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