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