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