1 /* BFD back-end for Intel 960 b.out binaries. 2 Copyright (C) 1990-2016 Free Software Foundation, Inc. 3 Written by Cygnus Support. 4 5 This file is part of BFD, the Binary File Descriptor library. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 20 MA 02110-1301, USA. */ 21 22 #include "sysdep.h" 23 #include "bfd.h" 24 #include "libbfd.h" 25 #include "bfdlink.h" 26 #include "genlink.h" 27 #include "bout.h" 28 #include "libiberty.h" 29 30 #include "aout/stab_gnu.h" 31 #include "libaout.h" /* BFD a.out internal data structures. */ 32 33 #define ABS32CODE 0 34 #define ABS32CODE_SHRUNK 1 35 #define PCREL24 2 36 #define CALLJ 3 37 #define ABS32 4 38 #define PCREL13 5 39 #define ABS32_MAYBE_RELAXABLE 1 40 #define ABS32_WAS_RELAXABLE 2 41 42 #define ALIGNER 10 43 #define ALIGNDONE 11 44 45 static reloc_howto_type howto_reloc_callj = 46 HOWTO (CALLJ, 0, 2, 24, TRUE, 0, complain_overflow_signed, 0,"callj", TRUE, 0x00ffffff, 0x00ffffff,FALSE); 47 static reloc_howto_type howto_reloc_abs32 = 48 HOWTO (ABS32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,0,"abs32", TRUE, 0xffffffff,0xffffffff,FALSE); 49 static reloc_howto_type howto_reloc_pcrel24 = 50 HOWTO (PCREL24, 0, 2, 24, TRUE, 0, complain_overflow_signed,0,"pcrel24", TRUE, 0x00ffffff,0x00ffffff,FALSE); 51 static reloc_howto_type howto_reloc_pcrel13 = 52 HOWTO (PCREL13, 0, 2, 13, TRUE, 0, complain_overflow_signed,0,"pcrel13", TRUE, 0x00001fff,0x00001fff,FALSE); 53 static reloc_howto_type howto_reloc_abs32codeshrunk = 54 HOWTO (ABS32CODE_SHRUNK, 0, 2, 24, TRUE, 0, complain_overflow_signed, 0,"callx->callj", TRUE, 0x00ffffff, 0x00ffffff,FALSE); 55 static reloc_howto_type howto_reloc_abs32code = 56 HOWTO (ABS32CODE, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,0,"callx", TRUE, 0xffffffff,0xffffffff,FALSE); 57 58 static reloc_howto_type howto_align_table[] = 59 { 60 HOWTO (ALIGNER, 0, 0x1, 0, FALSE, 0, complain_overflow_dont, 0, "align16", FALSE, 0, 0, FALSE), 61 HOWTO (ALIGNER, 0, 0x3, 0, FALSE, 0, complain_overflow_dont, 0, "align32", FALSE, 0, 0, FALSE), 62 HOWTO (ALIGNER, 0, 0x7, 0, FALSE, 0, complain_overflow_dont, 0, "align64", FALSE, 0, 0, FALSE), 63 HOWTO (ALIGNER, 0, 0xf, 0, FALSE, 0, complain_overflow_dont, 0, "align128", FALSE, 0, 0, FALSE), 64 }; 65 66 static reloc_howto_type howto_done_align_table[] = 67 { 68 HOWTO (ALIGNDONE, 0x1, 0x1, 0, FALSE, 0, complain_overflow_dont, 0, "donealign16", FALSE, 0, 0, FALSE), 69 HOWTO (ALIGNDONE, 0x3, 0x3, 0, FALSE, 0, complain_overflow_dont, 0, "donealign32", FALSE, 0, 0, FALSE), 70 HOWTO (ALIGNDONE, 0x7, 0x7, 0, FALSE, 0, complain_overflow_dont, 0, "donealign64", FALSE, 0, 0, FALSE), 71 HOWTO (ALIGNDONE, 0xf, 0xf, 0, FALSE, 0, complain_overflow_dont, 0, "donealign128", FALSE, 0, 0, FALSE), 72 }; 73 74 /* Swaps the information in an executable header taken from a raw byte 75 stream memory image, into the internal exec_header structure. */ 76 77 static void 78 bout_swap_exec_header_in (bfd *abfd, 79 struct external_exec *bytes, 80 struct internal_exec *execp) 81 { 82 /* Now fill in fields in the execp, from the bytes in the raw data. */ 83 execp->a_info = H_GET_32 (abfd, bytes->e_info); 84 execp->a_text = GET_WORD (abfd, bytes->e_text); 85 execp->a_data = GET_WORD (abfd, bytes->e_data); 86 execp->a_bss = GET_WORD (abfd, bytes->e_bss); 87 execp->a_syms = GET_WORD (abfd, bytes->e_syms); 88 execp->a_entry = GET_WORD (abfd, bytes->e_entry); 89 execp->a_trsize = GET_WORD (abfd, bytes->e_trsize); 90 execp->a_drsize = GET_WORD (abfd, bytes->e_drsize); 91 execp->a_tload = GET_WORD (abfd, bytes->e_tload); 92 execp->a_dload = GET_WORD (abfd, bytes->e_dload); 93 execp->a_talign = bytes->e_talign[0]; 94 execp->a_dalign = bytes->e_dalign[0]; 95 execp->a_balign = bytes->e_balign[0]; 96 execp->a_relaxable = bytes->e_relaxable[0]; 97 } 98 99 /* Swaps the information in an internal exec header structure into the 100 supplied buffer ready for writing to disk. */ 101 102 static void 103 bout_swap_exec_header_out (bfd *abfd, 104 struct internal_exec *execp, 105 struct external_exec *bytes) 106 { 107 /* Now fill in fields in the raw data, from the fields in the exec struct. */ 108 H_PUT_32 (abfd, execp->a_info , bytes->e_info); 109 PUT_WORD (abfd, execp->a_text , bytes->e_text); 110 PUT_WORD (abfd, execp->a_data , bytes->e_data); 111 PUT_WORD (abfd, execp->a_bss , bytes->e_bss); 112 PUT_WORD (abfd, execp->a_syms , bytes->e_syms); 113 PUT_WORD (abfd, execp->a_entry , bytes->e_entry); 114 PUT_WORD (abfd, execp->a_trsize, bytes->e_trsize); 115 PUT_WORD (abfd, execp->a_drsize, bytes->e_drsize); 116 PUT_WORD (abfd, execp->a_tload , bytes->e_tload); 117 PUT_WORD (abfd, execp->a_dload , bytes->e_dload); 118 bytes->e_talign[0] = execp->a_talign; 119 bytes->e_dalign[0] = execp->a_dalign; 120 bytes->e_balign[0] = execp->a_balign; 121 bytes->e_relaxable[0] = execp->a_relaxable; 122 } 123 124 /* Finish up the opening of a b.out file for reading. Fill in all the 125 fields that are not handled by common code. */ 126 127 static const bfd_target * 128 b_out_callback (bfd *abfd) 129 { 130 struct internal_exec *execp = exec_hdr (abfd); 131 unsigned long bss_start; 132 133 /* Architecture and machine type. */ 134 bfd_set_arch_mach (abfd, 135 bfd_arch_i960, /* B.out only used on i960. */ 136 bfd_mach_i960_core /* Default. */ 137 ); 138 139 /* The positions of the string table and symbol table. */ 140 obj_str_filepos (abfd) = N_STROFF (execp); 141 obj_sym_filepos (abfd) = N_SYMOFF (execp); 142 143 /* The alignments of the sections. */ 144 obj_textsec (abfd)->alignment_power = execp->a_talign; 145 obj_datasec (abfd)->alignment_power = execp->a_dalign; 146 obj_bsssec (abfd)->alignment_power = execp->a_balign; 147 148 /* The starting addresses of the sections. */ 149 obj_textsec (abfd)->vma = execp->a_tload; 150 obj_datasec (abfd)->vma = execp->a_dload; 151 152 obj_textsec (abfd)->lma = obj_textsec (abfd)->vma; 153 obj_datasec (abfd)->lma = obj_datasec (abfd)->vma; 154 155 /* And reload the sizes, since the aout module zaps them. */ 156 obj_textsec (abfd)->size = execp->a_text; 157 158 bss_start = execp->a_dload + execp->a_data; /* BSS = end of data section. */ 159 obj_bsssec (abfd)->vma = align_power (bss_start, execp->a_balign); 160 161 obj_bsssec (abfd)->lma = obj_bsssec (abfd)->vma; 162 163 /* The file positions of the sections. */ 164 obj_textsec (abfd)->filepos = N_TXTOFF (execp); 165 obj_datasec (abfd)->filepos = N_DATOFF (execp); 166 167 /* The file positions of the relocation info. */ 168 obj_textsec (abfd)->rel_filepos = N_TROFF (execp); 169 obj_datasec (abfd)->rel_filepos = N_DROFF (execp); 170 171 adata (abfd).page_size = 1; /* Not applicable. */ 172 adata (abfd).segment_size = 1; /* Not applicable. */ 173 adata (abfd).exec_bytes_size = EXEC_BYTES_SIZE; 174 175 if (execp->a_relaxable) 176 abfd->flags |= BFD_IS_RELAXABLE; 177 return abfd->xvec; 178 } 179 180 static const bfd_target * 181 b_out_object_p (bfd *abfd) 182 { 183 struct internal_exec anexec; 184 struct external_exec exec_bytes; 185 bfd_size_type amt = EXEC_BYTES_SIZE; 186 187 if (bfd_bread ((void *) &exec_bytes, amt, abfd) != amt) 188 { 189 if (bfd_get_error () != bfd_error_system_call) 190 bfd_set_error (bfd_error_wrong_format); 191 return 0; 192 } 193 194 anexec.a_info = H_GET_32 (abfd, exec_bytes.e_info); 195 196 if (N_BADMAG (&anexec)) 197 { 198 bfd_set_error (bfd_error_wrong_format); 199 return 0; 200 } 201 202 bout_swap_exec_header_in (abfd, &exec_bytes, &anexec); 203 return aout_32_some_aout_object_p (abfd, &anexec, b_out_callback); 204 } 205 206 struct bout_data_struct 207 { 208 struct aoutdata a; 209 struct internal_exec e; 210 }; 211 212 static bfd_boolean 213 b_out_mkobject (bfd *abfd) 214 { 215 struct bout_data_struct *rawptr; 216 bfd_size_type amt = sizeof (struct bout_data_struct); 217 218 rawptr = bfd_zalloc (abfd, amt); 219 if (rawptr == NULL) 220 return FALSE; 221 222 abfd->tdata.bout_data = rawptr; 223 exec_hdr (abfd) = &rawptr->e; 224 225 obj_textsec (abfd) = NULL; 226 obj_datasec (abfd) = NULL; 227 obj_bsssec (abfd) = NULL; 228 229 return TRUE; 230 } 231 232 static int 233 b_out_symbol_cmp (const void * a_ptr, const void * b_ptr) 234 { 235 struct aout_symbol ** a = (struct aout_symbol **) a_ptr; 236 struct aout_symbol ** b = (struct aout_symbol **) b_ptr; 237 asection *sec; 238 bfd_vma av, bv; 239 240 /* Primary key is address. */ 241 sec = bfd_get_section (&(*a)->symbol); 242 av = sec->output_section->vma + sec->output_offset + (*a)->symbol.value; 243 sec = bfd_get_section (&(*b)->symbol); 244 bv = sec->output_section->vma + sec->output_offset + (*b)->symbol.value; 245 246 if (av < bv) 247 return -1; 248 if (av > bv) 249 return 1; 250 251 /* Secondary key puts CALLNAME syms last and BALNAME syms first, 252 so that they have the best chance of being contiguous. */ 253 if (IS_BALNAME ((*a)->other) || IS_CALLNAME ((*b)->other)) 254 return -1; 255 if (IS_CALLNAME ((*a)->other) || IS_BALNAME ((*b)->other)) 256 return 1; 257 258 return 0; 259 } 260 261 static bfd_boolean 262 b_out_squirt_out_relocs (bfd *abfd, asection *section) 263 { 264 arelent **generic; 265 int r_extern = 0; 266 int r_idx; 267 int incode_mask; 268 int len_1; 269 unsigned int count = section->reloc_count; 270 struct relocation_info *native, *natptr; 271 bfd_size_type natsize; 272 int extern_mask, pcrel_mask, len_2, callj_mask; 273 274 if (count == 0) 275 return TRUE; 276 277 generic = section->orelocation; 278 natsize = (bfd_size_type) count * sizeof (struct relocation_info); 279 native = bfd_malloc (natsize); 280 if (!native && natsize != 0) 281 return FALSE; 282 283 if (bfd_header_big_endian (abfd)) 284 { 285 /* Big-endian bit field allocation order. */ 286 pcrel_mask = 0x80; 287 extern_mask = 0x10; 288 len_2 = 0x40; 289 len_1 = 0x20; 290 callj_mask = 0x02; 291 incode_mask = 0x08; 292 } 293 else 294 { 295 /* Little-endian bit field allocation order. */ 296 pcrel_mask = 0x01; 297 extern_mask = 0x08; 298 len_2 = 0x04; 299 len_1 = 0x02; 300 callj_mask = 0x40; 301 incode_mask = 0x10; 302 } 303 304 for (natptr = native; count > 0; --count, ++natptr, ++generic) 305 { 306 arelent *g = *generic; 307 unsigned char *raw = (unsigned char *) natptr; 308 asymbol *sym = *(g->sym_ptr_ptr); 309 asection *output_section = sym->section->output_section; 310 311 H_PUT_32 (abfd, g->address, raw); 312 /* Find a type in the output format which matches the input howto - 313 at the moment we assume input format == output format FIXME!! */ 314 r_idx = 0; 315 /* FIXME: Need callj stuff here, and to check the howto entries to 316 be sure they are real for this architecture. */ 317 if (g->howto== &howto_reloc_callj) 318 raw[7] = callj_mask + pcrel_mask + len_2; 319 else if (g->howto == &howto_reloc_pcrel24) 320 raw[7] = pcrel_mask + len_2; 321 else if (g->howto == &howto_reloc_pcrel13) 322 raw[7] = pcrel_mask + len_1; 323 else if (g->howto == &howto_reloc_abs32code) 324 raw[7] = len_2 + incode_mask; 325 else if (g->howto >= howto_align_table 326 && g->howto <= (howto_align_table + ARRAY_SIZE (howto_align_table) - 1)) 327 { 328 /* symnum == -2; extern_mask not set, pcrel_mask set. */ 329 r_idx = -2; 330 r_extern = 0; 331 raw[7] = (pcrel_mask 332 | ((g->howto - howto_align_table) << 1)); 333 } 334 else 335 raw[7] = len_2; 336 337 if (r_idx != 0) 338 /* Already mucked with r_extern, r_idx. */; 339 else if (bfd_is_com_section (output_section) 340 || bfd_is_abs_section (output_section) 341 || bfd_is_und_section (output_section)) 342 { 343 if (bfd_abs_section_ptr->symbol == sym) 344 { 345 /* Whoops, looked like an abs symbol, but is really an offset 346 from the abs section. */ 347 r_idx = 0; 348 r_extern = 0; 349 } 350 else 351 { 352 /* Fill in symbol. */ 353 r_extern = 1; 354 r_idx = (*g->sym_ptr_ptr)->udata.i; 355 } 356 } 357 else 358 { 359 /* Just an ordinary section. */ 360 r_extern = 0; 361 r_idx = output_section->target_index; 362 } 363 364 if (bfd_header_big_endian (abfd)) 365 { 366 raw[4] = (unsigned char) (r_idx >> 16); 367 raw[5] = (unsigned char) (r_idx >> 8); 368 raw[6] = (unsigned char) (r_idx ); 369 } 370 else 371 { 372 raw[6] = (unsigned char) (r_idx >> 16); 373 raw[5] = (unsigned char) (r_idx>> 8); 374 raw[4] = (unsigned char) (r_idx ); 375 } 376 377 if (r_extern) 378 raw[7] |= extern_mask; 379 } 380 381 if (bfd_bwrite ((void *) native, natsize, abfd) != natsize) 382 { 383 free (native); 384 return FALSE; 385 } 386 387 free (native); 388 389 return TRUE; 390 } 391 392 static bfd_boolean 393 b_out_write_object_contents (bfd *abfd) 394 { 395 struct external_exec swapped_hdr; 396 bfd_size_type amt; 397 398 if (! aout_32_make_sections (abfd)) 399 return FALSE; 400 401 exec_hdr (abfd)->a_info = BMAGIC; 402 403 exec_hdr (abfd)->a_text = obj_textsec (abfd)->size; 404 exec_hdr (abfd)->a_data = obj_datasec (abfd)->size; 405 exec_hdr (abfd)->a_bss = obj_bsssec (abfd)->size; 406 exec_hdr (abfd)->a_syms = bfd_get_symcount (abfd) * 12; 407 exec_hdr (abfd)->a_entry = bfd_get_start_address (abfd); 408 exec_hdr (abfd)->a_trsize = (obj_textsec (abfd)->reloc_count) * 8; 409 exec_hdr (abfd)->a_drsize = (obj_datasec (abfd)->reloc_count) * 8; 410 411 exec_hdr (abfd)->a_talign = obj_textsec (abfd)->alignment_power; 412 exec_hdr (abfd)->a_dalign = obj_datasec (abfd)->alignment_power; 413 exec_hdr (abfd)->a_balign = obj_bsssec (abfd)->alignment_power; 414 415 exec_hdr (abfd)->a_tload = obj_textsec (abfd)->vma; 416 exec_hdr (abfd)->a_dload = obj_datasec (abfd)->vma; 417 418 bout_swap_exec_header_out (abfd, exec_hdr (abfd), &swapped_hdr); 419 420 amt = EXEC_BYTES_SIZE; 421 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0 422 || bfd_bwrite ((void *) &swapped_hdr, amt, abfd) != amt) 423 return FALSE; 424 425 /* Now write out reloc info, followed by syms and strings */ 426 if (bfd_get_symcount (abfd) != 0) 427 { 428 /* Make sure {CALL,BAL}NAME symbols remain adjacent on output 429 by sorting. This is complicated by the fact that stabs are 430 also ordered. Solve this by shifting all stabs to the end 431 in order, then sorting the rest. */ 432 433 asymbol **outsyms, **p, **q; 434 435 outsyms = bfd_get_outsymbols (abfd); 436 p = outsyms + bfd_get_symcount (abfd); 437 438 for (q = p--; p >= outsyms; p--) 439 { 440 if ((*p)->flags & BSF_DEBUGGING) 441 { 442 asymbol *t = *--q; 443 *q = *p; 444 *p = t; 445 } 446 } 447 448 if (q > outsyms) 449 qsort (outsyms, (size_t) (q - outsyms), sizeof (asymbol*), 450 b_out_symbol_cmp); 451 452 /* Back to your regularly scheduled program. */ 453 if (bfd_seek (abfd, (file_ptr) (N_SYMOFF (exec_hdr (abfd))), SEEK_SET) 454 != 0) 455 return FALSE; 456 457 if (! aout_32_write_syms (abfd)) 458 return FALSE; 459 460 if (bfd_seek (abfd, (file_ptr) (N_TROFF (exec_hdr (abfd))), SEEK_SET) 461 != 0) 462 return FALSE; 463 464 if (!b_out_squirt_out_relocs (abfd, obj_textsec (abfd))) 465 return FALSE; 466 if (bfd_seek (abfd, (file_ptr) (N_DROFF (exec_hdr (abfd))), SEEK_SET) 467 != 0) 468 return FALSE; 469 470 if (!b_out_squirt_out_relocs (abfd, obj_datasec (abfd))) 471 return FALSE; 472 } 473 return TRUE; 474 } 475 476 /* Some reloc hackery. */ 478 479 #define CALLS 0x66003800 /* Template for 'calls' instruction */ 480 #define BAL 0x0b000000 /* Template for 'bal' instruction */ 481 #define BAL_MASK 0x00ffffff 482 #define BALX 0x85f00000 /* Template for 'balx' instruction */ 483 #define BALX_MASK 0x0007ffff 484 #define CALL 0x09000000 485 #define PCREL13_MASK 0x1fff 486 487 #define output_addr(sec) ((sec)->output_offset+(sec)->output_section->vma) 488 489 static bfd_vma 490 get_value (arelent *reloc, 491 struct bfd_link_info *link_info, 492 asection *input_section) 493 { 494 bfd_vma value; 495 asymbol *symbol = *(reloc->sym_ptr_ptr); 496 497 /* A symbol holds a pointer to a section, and an offset from the 498 base of the section. To relocate, we find where the section will 499 live in the output and add that in. */ 500 if (bfd_is_und_section (symbol->section)) 501 { 502 struct bfd_link_hash_entry *h; 503 504 /* The symbol is undefined in this BFD. Look it up in the 505 global linker hash table. FIXME: This should be changed when 506 we convert b.out to use a specific final_link function and 507 change the interface to bfd_relax_section to not require the 508 generic symbols. */ 509 h = bfd_wrapped_link_hash_lookup (input_section->owner, link_info, 510 bfd_asymbol_name (symbol), 511 FALSE, FALSE, TRUE); 512 if (h != (struct bfd_link_hash_entry *) NULL 513 && (h->type == bfd_link_hash_defined 514 || h->type == bfd_link_hash_defweak)) 515 value = h->u.def.value + output_addr (h->u.def.section); 516 else if (h != (struct bfd_link_hash_entry *) NULL 517 && h->type == bfd_link_hash_common) 518 value = h->u.c.size; 519 else 520 { 521 (*link_info->callbacks->undefined_symbol) 522 (link_info, bfd_asymbol_name (symbol), 523 input_section->owner, input_section, reloc->address, TRUE); 524 value = 0; 525 } 526 } 527 else 528 value = symbol->value + output_addr (symbol->section); 529 530 /* Add the value contained in the relocation. */ 531 value += reloc->addend; 532 533 return value; 534 } 535 536 /* Magic to turn callx into calljx. */ 537 538 static bfd_reloc_status_type 539 calljx_callback (bfd *abfd, 540 struct bfd_link_info *link_info, 541 arelent *reloc_entry, 542 void * src, 543 void * dst, 544 asection *input_section) 545 { 546 int word = bfd_get_32 (abfd, src); 547 asymbol *symbol_in = *(reloc_entry->sym_ptr_ptr); 548 aout_symbol_type *symbol = aout_symbol (symbol_in); 549 bfd_vma value; 550 551 value = get_value (reloc_entry, link_info, input_section); 552 553 if (IS_CALLNAME (symbol->other)) 554 { 555 aout_symbol_type *balsym = symbol+1; 556 int inst = bfd_get_32 (abfd, (bfd_byte *) src-4); 557 558 /* The next symbol should be an N_BALNAME. */ 559 BFD_ASSERT (IS_BALNAME (balsym->other)); 560 inst &= BALX_MASK; 561 inst |= BALX; 562 bfd_put_32 (abfd, (bfd_vma) inst, (bfd_byte *) dst-4); 563 symbol = balsym; 564 value = (symbol->symbol.value 565 + output_addr (symbol->symbol.section)); 566 } 567 568 word += value + reloc_entry->addend; 569 570 bfd_put_32 (abfd, (bfd_vma) word, dst); 571 return bfd_reloc_ok; 572 } 573 574 /* Magic to turn call into callj. */ 575 576 static bfd_reloc_status_type 577 callj_callback (bfd *abfd, 578 struct bfd_link_info *link_info, 579 arelent *reloc_entry, 580 void * data, 581 unsigned int srcidx, 582 unsigned int dstidx, 583 asection *input_section, 584 bfd_boolean shrinking) 585 { 586 int word = bfd_get_32 (abfd, (bfd_byte *) data + srcidx); 587 asymbol *symbol_in = *(reloc_entry->sym_ptr_ptr); 588 aout_symbol_type *symbol = aout_symbol (symbol_in); 589 bfd_vma value; 590 591 value = get_value (reloc_entry, link_info, input_section); 592 593 if (IS_OTHER (symbol->other)) 594 /* Call to a system procedure - replace code with system 595 procedure number. */ 596 word = CALLS | (symbol->other - 1); 597 598 else if (IS_CALLNAME (symbol->other)) 599 { 600 aout_symbol_type *balsym = symbol+1; 601 602 /* The next symbol should be an N_BALNAME. */ 603 BFD_ASSERT (IS_BALNAME (balsym->other)); 604 605 /* We are calling a leaf, so replace the call instruction with a 606 bal. */ 607 word = BAL | ((word 608 + output_addr (balsym->symbol.section) 609 + balsym->symbol.value + reloc_entry->addend 610 - dstidx 611 - output_addr (input_section)) 612 & BAL_MASK); 613 } 614 else if ((symbol->symbol.flags & BSF_SECTION_SYM) != 0) 615 { 616 /* A callj against a symbol in the same section is a fully 617 resolved relative call. We don't need to do anything here. 618 If the symbol is not in the same section, I'm not sure what 619 to do; fortunately, this case will probably never arise. */ 620 BFD_ASSERT (! shrinking); 621 BFD_ASSERT (symbol->symbol.section == input_section); 622 } 623 else 624 word = CALL | (((word & BAL_MASK) 625 + value 626 + reloc_entry->addend 627 - (shrinking ? dstidx : 0) 628 - output_addr (input_section)) 629 & BAL_MASK); 630 631 bfd_put_32 (abfd, (bfd_vma) word, (bfd_byte *) data + dstidx); 632 return bfd_reloc_ok; 633 } 634 635 static reloc_howto_type * 636 b_out_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, 637 bfd_reloc_code_real_type code) 638 { 639 switch (code) 640 { 641 default: 642 return 0; 643 case BFD_RELOC_I960_CALLJ: 644 return &howto_reloc_callj; 645 case BFD_RELOC_32: 646 case BFD_RELOC_CTOR: 647 return &howto_reloc_abs32; 648 case BFD_RELOC_24_PCREL: 649 return &howto_reloc_pcrel24; 650 } 651 } 652 653 static reloc_howto_type * 654 b_out_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, 655 const char *r_name) 656 { 657 if (strcasecmp (howto_reloc_callj.name, r_name) == 0) 658 return &howto_reloc_callj; 659 if (strcasecmp (howto_reloc_abs32.name, r_name) == 0) 660 return &howto_reloc_abs32; 661 if (strcasecmp (howto_reloc_pcrel24.name, r_name) == 0) 662 return &howto_reloc_pcrel24; 663 664 return NULL; 665 } 666 667 /* Allocate enough room for all the reloc entries, plus pointers to them all. */ 668 669 static bfd_boolean 670 b_out_slurp_reloc_table (bfd *abfd, sec_ptr asect, asymbol **symbols) 671 { 672 struct relocation_info *rptr; 673 unsigned int counter; 674 arelent *cache_ptr; 675 int extern_mask, pcrel_mask, callj_mask, length_shift; 676 int incode_mask; 677 int size_mask; 678 bfd_vma prev_addr = 0; 679 unsigned int count; 680 bfd_size_type reloc_size, amt; 681 struct relocation_info *relocs; 682 arelent *reloc_cache; 683 684 if (asect->relocation) 685 return TRUE; 686 687 if (!aout_32_slurp_symbol_table (abfd)) 688 return FALSE; 689 690 if (asect == obj_datasec (abfd)) 691 reloc_size = exec_hdr (abfd)->a_drsize; 692 else if (asect == obj_textsec (abfd)) 693 reloc_size = exec_hdr (abfd)->a_trsize; 694 else if (asect == obj_bsssec (abfd)) 695 reloc_size = 0; 696 else 697 { 698 bfd_set_error (bfd_error_invalid_operation); 699 return FALSE; 700 } 701 702 if (bfd_seek (abfd, asect->rel_filepos, SEEK_SET) != 0) 703 return FALSE; 704 count = reloc_size / sizeof (struct relocation_info); 705 706 relocs = bfd_malloc (reloc_size); 707 if (!relocs && reloc_size != 0) 708 return FALSE; 709 710 amt = ((bfd_size_type) count + 1) * sizeof (arelent); 711 reloc_cache = bfd_malloc (amt); 712 if (!reloc_cache) 713 { 714 if (relocs != NULL) 715 free (relocs); 716 return FALSE; 717 } 718 719 if (bfd_bread ((void *) relocs, reloc_size, abfd) != reloc_size) 720 { 721 free (reloc_cache); 722 if (relocs != NULL) 723 free (relocs); 724 return FALSE; 725 } 726 727 if (bfd_header_big_endian (abfd)) 728 { 729 /* Big-endian bit field allocation order. */ 730 pcrel_mask = 0x80; 731 extern_mask = 0x10; 732 incode_mask = 0x08; 733 callj_mask = 0x02; 734 size_mask = 0x20; 735 length_shift = 5; 736 } 737 else 738 { 739 /* Little-endian bit field allocation order. */ 740 pcrel_mask = 0x01; 741 extern_mask = 0x08; 742 incode_mask = 0x10; 743 callj_mask = 0x40; 744 size_mask = 0x02; 745 length_shift = 1; 746 } 747 748 for (rptr = relocs, cache_ptr = reloc_cache, counter = 0; 749 counter < count; 750 counter++, rptr++, cache_ptr++) 751 { 752 unsigned char *raw = (unsigned char *)rptr; 753 unsigned int symnum; 754 755 cache_ptr->address = H_GET_32 (abfd, raw + 0); 756 cache_ptr->howto = 0; 757 758 if (bfd_header_big_endian (abfd)) 759 symnum = (raw[4] << 16) | (raw[5] << 8) | raw[6]; 760 else 761 symnum = (raw[6] << 16) | (raw[5] << 8) | raw[4]; 762 763 if (raw[7] & extern_mask) 764 { 765 /* If this is set then the r_index is an index into the symbol table; 766 if the bit is not set then r_index contains a section map. 767 We either fill in the sym entry with a pointer to the symbol, 768 or point to the correct section. */ 769 cache_ptr->sym_ptr_ptr = symbols + symnum; 770 cache_ptr->addend = 0; 771 } 772 else 773 { 774 /* In a.out symbols are relative to the beginning of the 775 file rather than sections ? 776 (look in translate_from_native_sym_flags) 777 The reloc entry addend has added to it the offset into the 778 file of the data, so subtract the base to make the reloc 779 section relative. */ 780 int s; 781 782 /* Sign-extend symnum from 24 bits to whatever host uses. */ 783 s = symnum; 784 if (s & (1 << 23)) 785 s |= (~0U) << 24; 786 787 cache_ptr->sym_ptr_ptr = (asymbol **)NULL; 788 switch (s) 789 { 790 case N_TEXT: 791 case N_TEXT | N_EXT: 792 cache_ptr->sym_ptr_ptr = obj_textsec (abfd)->symbol_ptr_ptr; 793 cache_ptr->addend = - obj_textsec (abfd)->vma; 794 break; 795 case N_DATA: 796 case N_DATA | N_EXT: 797 cache_ptr->sym_ptr_ptr = obj_datasec (abfd)->symbol_ptr_ptr; 798 cache_ptr->addend = - obj_datasec (abfd)->vma; 799 break; 800 case N_BSS: 801 case N_BSS | N_EXT: 802 cache_ptr->sym_ptr_ptr = obj_bsssec (abfd)->symbol_ptr_ptr; 803 cache_ptr->addend = - obj_bsssec (abfd)->vma; 804 break; 805 case N_ABS: 806 case N_ABS | N_EXT: 807 cache_ptr->sym_ptr_ptr = obj_bsssec (abfd)->symbol_ptr_ptr; 808 cache_ptr->addend = 0; 809 break; 810 case -2: /* .align */ 811 if (raw[7] & pcrel_mask) 812 { 813 cache_ptr->howto = &howto_align_table[(raw[7] >> length_shift) & 3]; 814 cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; 815 } 816 else 817 { 818 /* .org? */ 819 abort (); 820 } 821 cache_ptr->addend = 0; 822 break; 823 default: 824 BFD_ASSERT (FALSE); 825 break; 826 } 827 } 828 829 /* The i960 only has a few relocation types: 830 abs 32-bit and pcrel 24bit. except for callj's! */ 831 if (cache_ptr->howto != 0) 832 ; 833 else if (raw[7] & callj_mask) 834 { 835 cache_ptr->howto = &howto_reloc_callj; 836 } 837 else if ( raw[7] & pcrel_mask) 838 { 839 if (raw[7] & size_mask) 840 cache_ptr->howto = &howto_reloc_pcrel13; 841 else 842 cache_ptr->howto = &howto_reloc_pcrel24; 843 } 844 else 845 { 846 if (raw[7] & incode_mask) 847 cache_ptr->howto = &howto_reloc_abs32code; 848 else 849 cache_ptr->howto = &howto_reloc_abs32; 850 } 851 852 if (cache_ptr->address < prev_addr) 853 { 854 /* Ouch! this reloc is out of order, insert into the right place. */ 855 arelent tmp; 856 arelent *cursor = cache_ptr-1; 857 bfd_vma stop = cache_ptr->address; 858 859 tmp = *cache_ptr; 860 while (cursor->address > stop && cursor >= reloc_cache) 861 { 862 cursor[1] = cursor[0]; 863 cursor--; 864 } 865 866 cursor[1] = tmp; 867 } 868 else 869 prev_addr = cache_ptr->address; 870 } 871 872 if (relocs != NULL) 873 free (relocs); 874 asect->relocation = reloc_cache; 875 asect->reloc_count = count; 876 877 return TRUE; 878 } 879 880 /* This is stupid. This function should be a boolean predicate. */ 881 882 static long 883 b_out_canonicalize_reloc (bfd *abfd, 884 sec_ptr section, 885 arelent **relptr, 886 asymbol **symbols) 887 { 888 arelent *tblptr; 889 unsigned int count; 890 891 if ((section->flags & SEC_CONSTRUCTOR) != 0) 892 { 893 arelent_chain *chain = section->constructor_chain; 894 895 for (count = 0; count < section->reloc_count; count++) 896 { 897 *relptr++ = &chain->relent; 898 chain = chain->next; 899 } 900 } 901 else 902 { 903 if (section->relocation == NULL 904 && ! b_out_slurp_reloc_table (abfd, section, symbols)) 905 return -1; 906 907 tblptr = section->relocation; 908 for (count = 0; count++ < section->reloc_count;) 909 *relptr++ = tblptr++; 910 } 911 912 *relptr = NULL; 913 914 return section->reloc_count; 915 } 916 917 static long 918 b_out_get_reloc_upper_bound (bfd *abfd, sec_ptr asect) 919 { 920 if (bfd_get_format (abfd) != bfd_object) 921 { 922 bfd_set_error (bfd_error_invalid_operation); 923 return -1; 924 } 925 926 if (asect->flags & SEC_CONSTRUCTOR) 927 return sizeof (arelent *) * (asect->reloc_count + 1); 928 929 if (asect == obj_datasec (abfd)) 930 return (sizeof (arelent *) * 931 ((exec_hdr (abfd)->a_drsize / sizeof (struct relocation_info)) 932 + 1)); 933 934 if (asect == obj_textsec (abfd)) 935 return (sizeof (arelent *) * 936 ((exec_hdr (abfd)->a_trsize / sizeof (struct relocation_info)) 937 + 1)); 938 939 if (asect == obj_bsssec (abfd)) 940 return 0; 941 942 bfd_set_error (bfd_error_invalid_operation); 943 return -1; 944 } 945 946 947 static bfd_boolean 949 b_out_set_section_contents (bfd *abfd, 950 asection *section, 951 const void * location, 952 file_ptr offset, 953 bfd_size_type count) 954 { 955 if (! abfd->output_has_begun) 956 { 957 /* Set by bfd.c handler. */ 958 if (! aout_32_make_sections (abfd)) 959 return FALSE; 960 961 obj_textsec (abfd)->filepos = sizeof (struct external_exec); 962 obj_datasec (abfd)->filepos = obj_textsec (abfd)->filepos 963 + obj_textsec (abfd)->size; 964 } 965 966 /* Regardless, once we know what we're doing, we might as well get going. */ 967 if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0) 968 return FALSE; 969 970 if (count == 0) 971 return TRUE; 972 973 return bfd_bwrite ((void *) location, count, abfd) == count; 974 } 975 976 static bfd_boolean 977 b_out_set_arch_mach (bfd *abfd, 978 enum bfd_architecture arch, 979 unsigned long machine) 980 { 981 bfd_default_set_arch_mach (abfd, arch, machine); 982 983 if (arch == bfd_arch_unknown) /* Unknown machine arch is OK. */ 984 return TRUE; 985 986 if (arch == bfd_arch_i960) /* i960 default is OK. */ 987 switch (machine) 988 { 989 case bfd_mach_i960_core: 990 case bfd_mach_i960_kb_sb: 991 case bfd_mach_i960_mc: 992 case bfd_mach_i960_xa: 993 case bfd_mach_i960_ca: 994 case bfd_mach_i960_ka_sa: 995 case bfd_mach_i960_jx: 996 case bfd_mach_i960_hx: 997 case 0: 998 return TRUE; 999 default: 1000 return FALSE; 1001 } 1002 1003 return FALSE; 1004 } 1005 1006 static int 1007 b_out_sizeof_headers (bfd *ignore_abfd ATTRIBUTE_UNUSED, 1008 struct bfd_link_info *info ATTRIBUTE_UNUSED) 1009 { 1010 return sizeof (struct external_exec); 1011 } 1012 1013 static void 1015 perform_slip (bfd *abfd, 1016 unsigned int slip, 1017 asection *input_section, 1018 bfd_vma value) 1019 { 1020 asymbol **s; 1021 1022 s = _bfd_generic_link_get_symbols (abfd); 1023 BFD_ASSERT (s != (asymbol **) NULL); 1024 1025 /* Find all symbols past this point, and make them know 1026 what's happened. */ 1027 while (*s) 1028 { 1029 asymbol *p = *s; 1030 1031 if (p->section == input_section) 1032 { 1033 /* This was pointing into this section, so mangle it. */ 1034 if (p->value > value) 1035 { 1036 p->value -=slip; 1037 1038 if (p->udata.p != NULL) 1039 { 1040 struct generic_link_hash_entry *h; 1041 1042 h = (struct generic_link_hash_entry *) p->udata.p; 1043 BFD_ASSERT (h->root.type == bfd_link_hash_defined); 1044 h->root.u.def.value -= slip; 1045 BFD_ASSERT (h->root.u.def.value == p->value); 1046 } 1047 } 1048 } 1049 s++; 1050 } 1051 } 1052 1053 /* This routine works out if the thing we want to get to can be 1054 reached with a 24bit offset instead of a 32 bit one. 1055 If it can, then it changes the amode. */ 1056 1057 static int 1058 abs32code (bfd *abfd, 1059 asection *input_section, 1060 arelent *r, 1061 unsigned int shrink, 1062 struct bfd_link_info *link_info) 1063 { 1064 bfd_vma value = get_value (r, link_info, input_section); 1065 bfd_vma dot = output_addr (input_section) + r->address; 1066 bfd_vma gap; 1067 1068 /* See if the address we're looking at within 2^23 bytes of where 1069 we are, if so then we can use a small branch rather than the 1070 jump we were going to. */ 1071 gap = value - (dot - shrink); 1072 1073 if ((long)(-1UL << 23) < (long)gap && (long)gap < 1L << 23) 1074 { 1075 /* Change the reloc type from 32bitcode possible 24, to 24bit 1076 possible 32. */ 1077 r->howto = &howto_reloc_abs32codeshrunk; 1078 /* The place to relc moves back by four bytes. */ 1079 r->address -=4; 1080 1081 /* This will be four bytes smaller in the long run. */ 1082 shrink += 4 ; 1083 perform_slip (abfd, 4, input_section, r->address-shrink + 4); 1084 } 1085 1086 return shrink; 1087 } 1088 1089 static int 1090 aligncode (bfd *abfd, 1091 asection *input_section, 1092 arelent *r, 1093 unsigned int shrink) 1094 { 1095 bfd_vma dot = output_addr (input_section) + r->address; 1096 bfd_vma old_end; 1097 bfd_vma new_end; 1098 unsigned int shrink_delta; 1099 int size = r->howto->size; 1100 1101 /* Reduce the size of the alignment so that it's still aligned but 1102 smaller - the current size is already the same size as or bigger 1103 than the alignment required. */ 1104 1105 /* Calculate the first byte following the padding before we optimize. */ 1106 old_end = ((dot + size ) & ~size) + size+1; 1107 /* Work out where the new end will be - remember that we're smaller 1108 than we used to be. */ 1109 new_end = ((dot - shrink + size) & ~size); 1110 1111 shrink_delta = (old_end - new_end) - shrink; 1112 1113 if (shrink_delta) 1114 { 1115 /* Change the reloc so that it knows how far to align to. */ 1116 r->howto = howto_done_align_table + (r->howto - howto_align_table); 1117 1118 /* Encode the stuff into the addend - for future use we need to 1119 know how big the reloc used to be. */ 1120 r->addend = old_end - dot + r->address; 1121 1122 /* This will be N bytes smaller in the long run, adjust all the symbols. */ 1123 perform_slip (abfd, shrink_delta, input_section, r->address - shrink); 1124 shrink += shrink_delta; 1125 } 1126 1127 return shrink; 1128 } 1129 1130 static bfd_boolean 1131 b_out_bfd_relax_section (bfd *abfd, 1132 asection *i, 1133 struct bfd_link_info *link_info, 1134 bfd_boolean *again) 1135 { 1136 /* Get enough memory to hold the stuff. */ 1137 bfd *input_bfd = i->owner; 1138 asection *input_section = i; 1139 unsigned int shrink = 0 ; 1140 arelent **reloc_vector = NULL; 1141 long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section); 1142 1143 if (bfd_link_relocatable (link_info)) 1144 (*link_info->callbacks->einfo) 1145 (_("%P%F: --relax and -r may not be used together\n")); 1146 1147 if (reloc_size < 0) 1148 return FALSE; 1149 1150 /* We only run this relaxation once. It might work to run it 1151 multiple times, but it hasn't been tested. */ 1152 *again = FALSE; 1153 1154 if (reloc_size) 1155 { 1156 long reloc_count; 1157 1158 reloc_vector = bfd_malloc ((bfd_size_type) reloc_size); 1159 if (reloc_vector == NULL && reloc_size != 0) 1160 goto error_return; 1161 1162 /* Get the relocs and think about them. */ 1163 reloc_count = 1164 bfd_canonicalize_reloc (input_bfd, input_section, reloc_vector, 1165 _bfd_generic_link_get_symbols (input_bfd)); 1166 if (reloc_count < 0) 1167 goto error_return; 1168 if (reloc_count > 0) 1169 { 1170 arelent **parent; 1171 1172 for (parent = reloc_vector; *parent; parent++) 1173 { 1174 arelent *r = *parent; 1175 1176 switch (r->howto->type) 1177 { 1178 case ALIGNER: 1179 /* An alignment reloc. */ 1180 shrink = aligncode (abfd, input_section, r, shrink); 1181 break; 1182 case ABS32CODE: 1183 /* A 32bit reloc in an addressing mode. */ 1184 shrink = abs32code (input_bfd, input_section, r, shrink, 1185 link_info); 1186 break; 1187 case ABS32CODE_SHRUNK: 1188 shrink += 4; 1189 break; 1190 } 1191 } 1192 } 1193 } 1194 input_section->size -= shrink; 1195 1196 if (reloc_vector != NULL) 1197 free (reloc_vector); 1198 return TRUE; 1199 error_return: 1200 if (reloc_vector != NULL) 1201 free (reloc_vector); 1202 return FALSE; 1203 } 1204 1205 static bfd_byte * 1206 b_out_bfd_get_relocated_section_contents (bfd *output_bfd, 1207 struct bfd_link_info *link_info, 1208 struct bfd_link_order *link_order, 1209 bfd_byte *data, 1210 bfd_boolean relocatable, 1211 asymbol **symbols) 1212 { 1213 /* Get enough memory to hold the stuff. */ 1214 bfd *input_bfd = link_order->u.indirect.section->owner; 1215 asection *input_section = link_order->u.indirect.section; 1216 long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section); 1217 arelent **reloc_vector = NULL; 1218 long reloc_count; 1219 1220 if (reloc_size < 0) 1221 goto error_return; 1222 1223 /* If producing relocatable output, don't bother to relax. */ 1224 if (relocatable) 1225 return bfd_generic_get_relocated_section_contents (output_bfd, link_info, 1226 link_order, 1227 data, relocatable, 1228 symbols); 1229 1230 reloc_vector = bfd_malloc ((bfd_size_type) reloc_size); 1231 if (reloc_vector == NULL && reloc_size != 0) 1232 goto error_return; 1233 1234 /* Read in the section. */ 1235 BFD_ASSERT (bfd_get_section_contents (input_bfd, 1236 input_section, 1237 data, 1238 (bfd_vma) 0, 1239 input_section->size)); 1240 1241 reloc_count = bfd_canonicalize_reloc (input_bfd, 1242 input_section, 1243 reloc_vector, 1244 symbols); 1245 if (reloc_count < 0) 1246 goto error_return; 1247 if (reloc_count > 0) 1248 { 1249 arelent **parent = reloc_vector; 1250 arelent *reloc ; 1251 unsigned int dst_address = 0; 1252 unsigned int src_address = 0; 1253 unsigned int run; 1254 unsigned int idx; 1255 1256 /* Find how long a run we can do. */ 1257 while (dst_address < link_order->size) 1258 { 1259 reloc = *parent; 1260 if (reloc) 1261 { 1262 /* Note that the relaxing didn't tie up the addresses in the 1263 relocation, so we use the original address to work out the 1264 run of non-relocated data. */ 1265 BFD_ASSERT (reloc->address >= src_address); 1266 run = reloc->address - src_address; 1267 parent++; 1268 } 1269 else 1270 run = link_order->size - dst_address; 1271 1272 /* Copy the bytes. */ 1273 for (idx = 0; idx < run; idx++) 1274 data[dst_address++] = data[src_address++]; 1275 1276 /* Now do the relocation. */ 1277 if (reloc) 1278 { 1279 switch (reloc->howto->type) 1280 { 1281 case ABS32CODE: 1282 calljx_callback (input_bfd, link_info, reloc, 1283 src_address + data, dst_address + data, 1284 input_section); 1285 src_address += 4; 1286 dst_address += 4; 1287 break; 1288 case ABS32: 1289 bfd_put_32 (input_bfd, 1290 (bfd_get_32 (input_bfd, data + src_address) 1291 + get_value (reloc, link_info, input_section)), 1292 data + dst_address); 1293 src_address += 4; 1294 dst_address += 4; 1295 break; 1296 case CALLJ: 1297 callj_callback (input_bfd, link_info, reloc, data, 1298 src_address, dst_address, input_section, 1299 FALSE); 1300 src_address += 4; 1301 dst_address += 4; 1302 break; 1303 case ALIGNDONE: 1304 BFD_ASSERT (reloc->addend >= src_address); 1305 BFD_ASSERT ((bfd_vma) reloc->addend 1306 <= input_section->size); 1307 src_address = reloc->addend; 1308 dst_address = ((dst_address + reloc->howto->size) 1309 & ~reloc->howto->size); 1310 break; 1311 case ABS32CODE_SHRUNK: 1312 /* This used to be a callx, but we've found out that a 1313 callj will reach, so do the right thing. */ 1314 callj_callback (input_bfd, link_info, reloc, data, 1315 src_address + 4, dst_address, input_section, 1316 TRUE); 1317 dst_address += 4; 1318 src_address += 8; 1319 break; 1320 case PCREL24: 1321 { 1322 long int word = bfd_get_32 (input_bfd, 1323 data + src_address); 1324 bfd_vma value; 1325 1326 value = get_value (reloc, link_info, input_section); 1327 word = ((word & ~BAL_MASK) 1328 | (((word & BAL_MASK) 1329 + value 1330 - output_addr (input_section) 1331 + reloc->addend) 1332 & BAL_MASK)); 1333 1334 bfd_put_32 (input_bfd, (bfd_vma) word, data + dst_address); 1335 dst_address += 4; 1336 src_address += 4; 1337 1338 } 1339 break; 1340 case PCREL13: 1341 { 1342 long int word = bfd_get_32 (input_bfd, 1343 data + src_address); 1344 bfd_vma value; 1345 1346 value = get_value (reloc, link_info, input_section); 1347 word = ((word & ~PCREL13_MASK) 1348 | (((word & PCREL13_MASK) 1349 + value 1350 + reloc->addend 1351 - output_addr (input_section)) 1352 & PCREL13_MASK)); 1353 1354 bfd_put_32 (input_bfd, (bfd_vma) word, data + dst_address); 1355 dst_address += 4; 1356 src_address += 4; 1357 } 1358 break; 1359 1360 default: 1361 abort (); 1362 } 1363 } 1364 } 1365 } 1366 if (reloc_vector != NULL) 1367 free (reloc_vector); 1368 return data; 1369 error_return: 1370 if (reloc_vector != NULL) 1371 free (reloc_vector); 1372 return NULL; 1373 } 1374 1375 1377 /* Build the transfer vectors for Big and Little-Endian B.OUT files. */ 1378 1379 #define aout_32_find_line _bfd_nosymbols_find_line 1380 #define aout_32_get_symbol_version_string _bfd_nosymbols_get_symbol_version_string 1381 #define aout_32_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol 1382 #define aout_32_close_and_cleanup aout_32_bfd_free_cached_info 1383 #define b_out_bfd_link_hash_table_create _bfd_generic_link_hash_table_create 1384 #define b_out_bfd_link_add_symbols _bfd_generic_link_add_symbols 1385 #define b_out_bfd_link_just_syms _bfd_generic_link_just_syms 1386 #define b_out_bfd_copy_link_hash_symbol_type \ 1387 _bfd_generic_copy_link_hash_symbol_type 1388 #define b_out_bfd_final_link _bfd_generic_final_link 1389 #define b_out_bfd_link_split_section _bfd_generic_link_split_section 1390 #define b_out_bfd_gc_sections bfd_generic_gc_sections 1391 #define b_out_bfd_lookup_section_flags bfd_generic_lookup_section_flags 1392 #define b_out_bfd_merge_sections bfd_generic_merge_sections 1393 #define b_out_bfd_is_group_section bfd_generic_is_group_section 1394 #define b_out_bfd_discard_group bfd_generic_discard_group 1395 #define b_out_section_already_linked _bfd_generic_section_already_linked 1396 #define b_out_bfd_define_common_symbol bfd_generic_define_common_symbol 1397 #define aout_32_get_section_contents_in_window _bfd_generic_get_section_contents_in_window 1398 #define b_out_bfd_link_check_relocs _bfd_generic_link_check_relocs 1399 1400 extern const bfd_target bout_le_vec; 1401 1402 const bfd_target bout_be_vec = 1403 { 1404 "b.out.big", /* Name. */ 1405 bfd_target_aout_flavour, 1406 BFD_ENDIAN_LITTLE, /* Data byte order. */ 1407 BFD_ENDIAN_BIG, /* Header byte order. */ 1408 (HAS_RELOC | EXEC_P | /* Object flags. */ 1409 HAS_LINENO | HAS_DEBUG | 1410 HAS_SYMS | HAS_LOCALS | WP_TEXT | BFD_IS_RELAXABLE ), 1411 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA), 1412 '_', /* Symbol leading char. */ 1413 ' ', /* AR_pad_char. */ 1414 16, /* AR_max_namelen. */ 1415 0, /* match priority. */ 1416 bfd_getl64, bfd_getl_signed_64, bfd_putl64, 1417 bfd_getl32, bfd_getl_signed_32, bfd_putl32, 1418 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Data. */ 1419 bfd_getb64, bfd_getb_signed_64, bfd_putb64, 1420 bfd_getb32, bfd_getb_signed_32, bfd_putb32, 1421 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* Headers. */ 1422 {_bfd_dummy_target, b_out_object_p, /* bfd_check_format. */ 1423 bfd_generic_archive_p, _bfd_dummy_target}, 1424 {bfd_false, b_out_mkobject, /* bfd_set_format. */ 1425 _bfd_generic_mkarchive, bfd_false}, 1426 {bfd_false, b_out_write_object_contents, /* bfd_write_contents. */ 1427 _bfd_write_archive_contents, bfd_false}, 1428 1429 BFD_JUMP_TABLE_GENERIC (aout_32), 1430 BFD_JUMP_TABLE_COPY (_bfd_generic), 1431 BFD_JUMP_TABLE_CORE (_bfd_nocore), 1432 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_bsd), 1433 BFD_JUMP_TABLE_SYMBOLS (aout_32), 1434 BFD_JUMP_TABLE_RELOCS (b_out), 1435 BFD_JUMP_TABLE_WRITE (b_out), 1436 BFD_JUMP_TABLE_LINK (b_out), 1437 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), 1438 1439 & bout_le_vec, 1440 1441 NULL 1442 }; 1443 1444 const bfd_target bout_le_vec = 1445 { 1446 "b.out.little", /* Name. */ 1447 bfd_target_aout_flavour, 1448 BFD_ENDIAN_LITTLE, /* Data byte order. */ 1449 BFD_ENDIAN_LITTLE, /* Header byte order. */ 1450 (HAS_RELOC | EXEC_P | /* Object flags. */ 1451 HAS_LINENO | HAS_DEBUG | 1452 HAS_SYMS | HAS_LOCALS | WP_TEXT | BFD_IS_RELAXABLE ), 1453 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA), 1454 '_', /* Symbol leading char. */ 1455 ' ', /* AR_pad_char. */ 1456 16, /* AR_max_namelen. */ 1457 0, /* match priority. */ 1458 bfd_getl64, bfd_getl_signed_64, bfd_putl64, 1459 bfd_getl32, bfd_getl_signed_32, bfd_putl32, 1460 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Data. */ 1461 bfd_getl64, bfd_getl_signed_64, bfd_putl64, 1462 bfd_getl32, bfd_getl_signed_32, bfd_putl32, 1463 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Headers. */ 1464 1465 {_bfd_dummy_target, b_out_object_p, /* bfd_check_format. */ 1466 bfd_generic_archive_p, _bfd_dummy_target}, 1467 {bfd_false, b_out_mkobject, /* bfd_set_format. */ 1468 _bfd_generic_mkarchive, bfd_false}, 1469 {bfd_false, b_out_write_object_contents, /* bfd_write_contents. */ 1470 _bfd_write_archive_contents, bfd_false}, 1471 1472 BFD_JUMP_TABLE_GENERIC (aout_32), 1473 BFD_JUMP_TABLE_COPY (_bfd_generic), 1474 BFD_JUMP_TABLE_CORE (_bfd_nocore), 1475 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_bsd), 1476 BFD_JUMP_TABLE_SYMBOLS (aout_32), 1477 BFD_JUMP_TABLE_RELOCS (b_out), 1478 BFD_JUMP_TABLE_WRITE (b_out), 1479 BFD_JUMP_TABLE_LINK (b_out), 1480 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), 1481 1482 & bout_be_vec, 1483 1484 NULL 1485 }; 1486