ieee.c revision 60484
1/* BFD back-end for ieee-695 objects. 2 Copyright (C) 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999 3 Free Software Foundation, Inc. 4 5 Written by Steve Chamberlain of Cygnus Support. 6 7This file is part of BFD, the Binary File Descriptor library. 8 9This program is free software; you can redistribute it and/or modify 10it under the terms of the GNU General Public License as published by 11the Free Software Foundation; either version 2 of the License, or 12(at your option) any later version. 13 14This program is distributed in the hope that it will be useful, 15but WITHOUT ANY WARRANTY; without even the implied warranty of 16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17GNU General Public License for more details. 18 19You should have received a copy of the GNU General Public License 20along with this program; if not, write to the Free Software 21Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 22 23#define KEEPMINUSPCININST 0 24 25/* IEEE 695 format is a stream of records, which we parse using a simple one- 26 token (which is one byte in this lexicon) lookahead recursive decent 27 parser. */ 28 29#include "bfd.h" 30#include "sysdep.h" 31#include "libbfd.h" 32#include "ieee.h" 33#include "libieee.h" 34 35#include <ctype.h> 36 37static boolean ieee_write_byte PARAMS ((bfd *, int)); 38static boolean ieee_write_2bytes PARAMS ((bfd *, int)); 39static boolean ieee_write_int PARAMS ((bfd *, bfd_vma)); 40static boolean ieee_write_id PARAMS ((bfd *, const char *)); 41static boolean ieee_write_expression 42 PARAMS ((bfd *, bfd_vma, asymbol *, boolean, unsigned int)); 43static void ieee_write_int5 PARAMS ((bfd_byte *, bfd_vma)); 44static boolean ieee_write_int5_out PARAMS ((bfd *, bfd_vma)); 45static boolean ieee_write_section_part PARAMS ((bfd *)); 46static boolean do_with_relocs PARAMS ((bfd *, asection *)); 47static boolean do_as_repeat PARAMS ((bfd *, asection *)); 48static boolean do_without_relocs PARAMS ((bfd *, asection *)); 49static boolean ieee_write_external_part PARAMS ((bfd *)); 50static boolean ieee_write_data_part PARAMS ((bfd *)); 51static boolean ieee_write_debug_part PARAMS ((bfd *)); 52static boolean ieee_write_me_part PARAMS ((bfd *)); 53static boolean ieee_write_processor PARAMS ((bfd *)); 54 55static boolean ieee_slurp_debug PARAMS ((bfd *)); 56static boolean ieee_slurp_section_data PARAMS ((bfd *)); 57 58/* Functions for writing to ieee files in the strange way that the 59 standard requires. */ 60 61static boolean 62ieee_write_byte (abfd, barg) 63 bfd *abfd; 64 int barg; 65{ 66 bfd_byte byte; 67 68 byte = barg; 69 if (bfd_write ((PTR) &byte, 1, 1, abfd) != 1) 70 return false; 71 return true; 72} 73 74static boolean 75ieee_write_2bytes (abfd, bytes) 76 bfd *abfd; 77 int bytes; 78{ 79 bfd_byte buffer[2]; 80 81 buffer[0] = bytes >> 8; 82 buffer[1] = bytes & 0xff; 83 if (bfd_write ((PTR) buffer, 1, 2, abfd) != 2) 84 return false; 85 return true; 86} 87 88static boolean 89ieee_write_int (abfd, value) 90 bfd *abfd; 91 bfd_vma value; 92{ 93 if (value <= 127) 94 { 95 if (! ieee_write_byte (abfd, (bfd_byte) value)) 96 return false; 97 } 98 else 99 { 100 unsigned int length; 101 102 /* How many significant bytes ? */ 103 /* FIXME FOR LONGER INTS */ 104 if (value & 0xff000000) 105 length = 4; 106 else if (value & 0x00ff0000) 107 length = 3; 108 else if (value & 0x0000ff00) 109 length = 2; 110 else 111 length = 1; 112 113 if (! ieee_write_byte (abfd, 114 (bfd_byte) ((int) ieee_number_repeat_start_enum 115 + length))) 116 return false; 117 switch (length) 118 { 119 case 4: 120 if (! ieee_write_byte (abfd, (bfd_byte) (value >> 24))) 121 return false; 122 /* Fall through. */ 123 case 3: 124 if (! ieee_write_byte (abfd, (bfd_byte) (value >> 16))) 125 return false; 126 /* Fall through. */ 127 case 2: 128 if (! ieee_write_byte (abfd, (bfd_byte) (value >> 8))) 129 return false; 130 /* Fall through. */ 131 case 1: 132 if (! ieee_write_byte (abfd, (bfd_byte) (value))) 133 return false; 134 } 135 } 136 137 return true; 138} 139 140static boolean 141ieee_write_id (abfd, id) 142 bfd *abfd; 143 const char *id; 144{ 145 size_t length = strlen (id); 146 147 if (length <= 127) 148 { 149 if (! ieee_write_byte (abfd, (bfd_byte) length)) 150 return false; 151 } 152 else if (length < 255) 153 { 154 if (! ieee_write_byte (abfd, ieee_extension_length_1_enum) 155 || ! ieee_write_byte (abfd, (bfd_byte) length)) 156 return false; 157 } 158 else if (length < 65535) 159 { 160 if (! ieee_write_byte (abfd, ieee_extension_length_2_enum) 161 || ! ieee_write_2bytes (abfd, (int) length)) 162 return false; 163 } 164 else 165 { 166 (*_bfd_error_handler) 167 (_("%s: string too long (%d chars, max 65535)"), 168 bfd_get_filename (abfd), length); 169 bfd_set_error (bfd_error_invalid_operation); 170 return false; 171 } 172 173 if (bfd_write ((PTR) id, 1, length, abfd) != length) 174 return false; 175 return true; 176} 177 178/*************************************************************************** 179Functions for reading from ieee files in the strange way that the 180standard requires: 181*/ 182 183#define this_byte(ieee) *((ieee)->input_p) 184#define next_byte(ieee) ((ieee)->input_p++) 185#define this_byte_and_next(ieee) (*((ieee)->input_p++)) 186 187static unsigned short 188read_2bytes (ieee) 189 common_header_type *ieee; 190{ 191 unsigned char c1 = this_byte_and_next (ieee); 192 unsigned char c2 = this_byte_and_next (ieee); 193 return (c1 << 8) | c2; 194} 195 196static void 197bfd_get_string (ieee, string, length) 198 common_header_type *ieee; 199 char *string; 200 size_t length; 201{ 202 size_t i; 203 for (i = 0; i < length; i++) 204 { 205 string[i] = this_byte_and_next (ieee); 206 } 207} 208 209static char * 210read_id (ieee) 211 common_header_type *ieee; 212{ 213 size_t length; 214 char *string; 215 length = this_byte_and_next (ieee); 216 if (length <= 0x7f) 217 { 218 /* Simple string of length 0 to 127 */ 219 } 220 else if (length == 0xde) 221 { 222 /* Length is next byte, allowing 0..255 */ 223 length = this_byte_and_next (ieee); 224 } 225 else if (length == 0xdf) 226 { 227 /* Length is next two bytes, allowing 0..65535 */ 228 length = this_byte_and_next (ieee); 229 length = (length * 256) + this_byte_and_next (ieee); 230 } 231 /* Buy memory and read string */ 232 string = bfd_alloc (ieee->abfd, length + 1); 233 if (!string) 234 return NULL; 235 bfd_get_string (ieee, string, length); 236 string[length] = 0; 237 return string; 238} 239 240static boolean 241ieee_write_expression (abfd, value, symbol, pcrel, index) 242 bfd *abfd; 243 bfd_vma value; 244 asymbol *symbol; 245 boolean pcrel; 246 unsigned int index; 247{ 248 unsigned int term_count = 0; 249 250 if (value != 0) 251 { 252 if (! ieee_write_int (abfd, value)) 253 return false; 254 term_count++; 255 } 256 257 if (bfd_is_com_section (symbol->section) 258 || bfd_is_und_section (symbol->section)) 259 { 260 /* Def of a common symbol */ 261 if (! ieee_write_byte (abfd, ieee_variable_X_enum) 262 || ! ieee_write_int (abfd, symbol->value)) 263 return false; 264 term_count++; 265 } 266 else if (! bfd_is_abs_section (symbol->section)) 267 { 268 /* Ref to defined symbol - */ 269 270 if (symbol->flags & BSF_GLOBAL) 271 { 272 if (! ieee_write_byte (abfd, ieee_variable_I_enum) 273 || ! ieee_write_int (abfd, symbol->value)) 274 return false; 275 term_count++; 276 } 277 else if (symbol->flags & (BSF_LOCAL | BSF_SECTION_SYM)) 278 { 279 /* This is a reference to a defined local symbol. We can 280 easily do a local as a section+offset. */ 281 if (! ieee_write_byte (abfd, ieee_variable_R_enum) 282 || ! ieee_write_byte (abfd, 283 (bfd_byte) (symbol->section->index 284 + IEEE_SECTION_NUMBER_BASE))) 285 return false; 286 term_count++; 287 if (symbol->value != 0) 288 { 289 if (! ieee_write_int (abfd, symbol->value)) 290 return false; 291 term_count++; 292 } 293 } 294 else 295 { 296 (*_bfd_error_handler) 297 (_("%s: unrecognized symbol `%s' flags 0x%x"), 298 bfd_get_filename (abfd), bfd_asymbol_name (symbol), 299 symbol->flags); 300 bfd_set_error (bfd_error_invalid_operation); 301 return false; 302 } 303 } 304 305 if (pcrel) 306 { 307 /* subtract the pc from here by asking for PC of this section*/ 308 if (! ieee_write_byte (abfd, ieee_variable_P_enum) 309 || ! ieee_write_byte (abfd, 310 (bfd_byte) (index + IEEE_SECTION_NUMBER_BASE)) 311 || ! ieee_write_byte (abfd, ieee_function_minus_enum)) 312 return false; 313 } 314 315 /* Handle the degenerate case of a 0 address. */ 316 if (term_count == 0) 317 { 318 if (! ieee_write_int (abfd, 0)) 319 return false; 320 } 321 322 while (term_count > 1) 323 { 324 if (! ieee_write_byte (abfd, ieee_function_plus_enum)) 325 return false; 326 term_count--; 327 } 328 329 return true; 330} 331 332/*****************************************************************************/ 333 334/* 335writes any integer into the buffer supplied and always takes 5 bytes 336*/ 337static void 338ieee_write_int5 (buffer, value) 339 bfd_byte *buffer; 340 bfd_vma value; 341{ 342 buffer[0] = (bfd_byte) ieee_number_repeat_4_enum; 343 buffer[1] = (value >> 24) & 0xff; 344 buffer[2] = (value >> 16) & 0xff; 345 buffer[3] = (value >> 8) & 0xff; 346 buffer[4] = (value >> 0) & 0xff; 347} 348 349static boolean 350ieee_write_int5_out (abfd, value) 351 bfd *abfd; 352 bfd_vma value; 353{ 354 bfd_byte b[5]; 355 356 ieee_write_int5 (b, value); 357 if (bfd_write ((PTR) b, 1, 5, abfd) != 5) 358 return false; 359 return true; 360} 361 362static boolean 363parse_int (ieee, value_ptr) 364 common_header_type *ieee; 365 bfd_vma *value_ptr; 366{ 367 int value = this_byte (ieee); 368 int result; 369 if (value >= 0 && value <= 127) 370 { 371 *value_ptr = value; 372 next_byte (ieee); 373 return true; 374 } 375 else if (value >= 0x80 && value <= 0x88) 376 { 377 unsigned int count = value & 0xf; 378 result = 0; 379 next_byte (ieee); 380 while (count) 381 { 382 result = (result << 8) | this_byte_and_next (ieee); 383 count--; 384 } 385 *value_ptr = result; 386 return true; 387 } 388 return false; 389} 390 391static int 392parse_i (ieee, ok) 393 common_header_type *ieee; 394 boolean *ok; 395{ 396 bfd_vma x; 397 *ok = parse_int (ieee, &x); 398 return x; 399} 400 401static bfd_vma 402must_parse_int (ieee) 403 common_header_type *ieee; 404{ 405 bfd_vma result; 406 BFD_ASSERT (parse_int (ieee, &result) == true); 407 return result; 408} 409 410typedef struct 411{ 412 bfd_vma value; 413 asection *section; 414 ieee_symbol_index_type symbol; 415} ieee_value_type; 416 417 418#if KEEPMINUSPCININST 419 420#define SRC_MASK(arg) arg 421#define PCREL_OFFSET false 422 423#else 424 425#define SRC_MASK(arg) 0 426#define PCREL_OFFSET true 427 428#endif 429 430static reloc_howto_type abs32_howto = 431 HOWTO (1, 432 0, 433 2, 434 32, 435 false, 436 0, 437 complain_overflow_bitfield, 438 0, 439 "abs32", 440 true, 441 0xffffffff, 442 0xffffffff, 443 false); 444 445static reloc_howto_type abs16_howto = 446 HOWTO (1, 447 0, 448 1, 449 16, 450 false, 451 0, 452 complain_overflow_bitfield, 453 0, 454 "abs16", 455 true, 456 0x0000ffff, 457 0x0000ffff, 458 false); 459 460static reloc_howto_type abs8_howto = 461 HOWTO (1, 462 0, 463 0, 464 8, 465 false, 466 0, 467 complain_overflow_bitfield, 468 0, 469 "abs8", 470 true, 471 0x000000ff, 472 0x000000ff, 473 false); 474 475static reloc_howto_type rel32_howto = 476 HOWTO (1, 477 0, 478 2, 479 32, 480 true, 481 0, 482 complain_overflow_signed, 483 0, 484 "rel32", 485 true, 486 SRC_MASK (0xffffffff), 487 0xffffffff, 488 PCREL_OFFSET); 489 490static reloc_howto_type rel16_howto = 491 HOWTO (1, 492 0, 493 1, 494 16, 495 true, 496 0, 497 complain_overflow_signed, 498 0, 499 "rel16", 500 true, 501 SRC_MASK (0x0000ffff), 502 0x0000ffff, 503 PCREL_OFFSET); 504 505static reloc_howto_type rel8_howto = 506 HOWTO (1, 507 0, 508 0, 509 8, 510 true, 511 0, 512 complain_overflow_signed, 513 0, 514 "rel8", 515 true, 516 SRC_MASK (0x000000ff), 517 0x000000ff, 518 PCREL_OFFSET); 519 520static ieee_symbol_index_type NOSYMBOL = {0, 0}; 521 522static void 523parse_expression (ieee, value, symbol, pcrel, extra, section) 524 ieee_data_type *ieee; 525 bfd_vma *value; 526 ieee_symbol_index_type *symbol; 527 boolean *pcrel; 528 unsigned int *extra; 529 asection **section; 530 531{ 532#define POS sp[1] 533#define TOS sp[0] 534#define NOS sp[-1] 535#define INC sp++; 536#define DEC sp--; 537 538 boolean loop = true; 539 ieee_value_type stack[10]; 540 541 /* The stack pointer always points to the next unused location */ 542#define PUSH(x,y,z) TOS.symbol=x;TOS.section=y;TOS.value=z;INC; 543#define POP(x,y,z) DEC;x=TOS.symbol;y=TOS.section;z=TOS.value; 544 ieee_value_type *sp = stack; 545 546 while (loop) 547 { 548 switch (this_byte (&(ieee->h))) 549 { 550 case ieee_variable_P_enum: 551 /* P variable, current program counter for section n */ 552 { 553 int section_n; 554 next_byte (&(ieee->h)); 555 *pcrel = true; 556 section_n = must_parse_int (&(ieee->h)); 557 PUSH (NOSYMBOL, bfd_abs_section_ptr, 0); 558 break; 559 } 560 case ieee_variable_L_enum: 561 /* L variable address of section N */ 562 next_byte (&(ieee->h)); 563 PUSH (NOSYMBOL, ieee->section_table[must_parse_int (&(ieee->h))], 0); 564 break; 565 case ieee_variable_R_enum: 566 /* R variable, logical address of section module */ 567 /* FIXME, this should be different to L */ 568 next_byte (&(ieee->h)); 569 PUSH (NOSYMBOL, ieee->section_table[must_parse_int (&(ieee->h))], 0); 570 break; 571 case ieee_variable_S_enum: 572 /* S variable, size in MAUS of section module */ 573 next_byte (&(ieee->h)); 574 PUSH (NOSYMBOL, 575 0, 576 ieee->section_table[must_parse_int (&(ieee->h))]->_raw_size); 577 break; 578 case ieee_variable_I_enum: 579 /* Push the address of variable n */ 580 { 581 ieee_symbol_index_type sy; 582 next_byte (&(ieee->h)); 583 sy.index = (int) must_parse_int (&(ieee->h)); 584 sy.letter = 'I'; 585 586 PUSH (sy, bfd_abs_section_ptr, 0); 587 } 588 break; 589 case ieee_variable_X_enum: 590 /* Push the address of external variable n */ 591 { 592 ieee_symbol_index_type sy; 593 next_byte (&(ieee->h)); 594 sy.index = (int) (must_parse_int (&(ieee->h))); 595 sy.letter = 'X'; 596 597 PUSH (sy, bfd_und_section_ptr, 0); 598 } 599 break; 600 case ieee_function_minus_enum: 601 { 602 bfd_vma value1, value2; 603 asection *section1, *section_dummy; 604 ieee_symbol_index_type sy; 605 next_byte (&(ieee->h)); 606 607 POP (sy, section1, value1); 608 POP (sy, section_dummy, value2); 609 PUSH (sy, section1 ? section1 : section_dummy, value2 - value1); 610 } 611 break; 612 case ieee_function_plus_enum: 613 { 614 bfd_vma value1, value2; 615 asection *section1; 616 asection *section2; 617 ieee_symbol_index_type sy1; 618 ieee_symbol_index_type sy2; 619 next_byte (&(ieee->h)); 620 621 POP (sy1, section1, value1); 622 POP (sy2, section2, value2); 623 PUSH (sy1.letter ? sy1 : sy2, 624 bfd_is_abs_section (section1) ? section2 : section1, 625 value1 + value2); 626 } 627 break; 628 default: 629 { 630 bfd_vma va; 631 BFD_ASSERT (this_byte (&(ieee->h)) < (int) ieee_variable_A_enum 632 || this_byte (&(ieee->h)) > (int) ieee_variable_Z_enum); 633 if (parse_int (&(ieee->h), &va)) 634 { 635 PUSH (NOSYMBOL, bfd_abs_section_ptr, va); 636 } 637 else 638 { 639 /* 640 Thats all that we can understand. As far as I can see 641 there is a bug in the Microtec IEEE output which I'm 642 using to scan, whereby the comma operator is omitted 643 sometimes in an expression, giving expressions with too 644 many terms. We can tell if that's the case by ensuring 645 that sp == stack here. If not, then we've pushed 646 something too far, so we keep adding. */ 647 648 while (sp != stack + 1) 649 { 650 asection *section1; 651 ieee_symbol_index_type sy1; 652 POP (sy1, section1, *extra); 653 } 654 { 655 asection *dummy; 656 657 POP (*symbol, dummy, *value); 658 if (section) 659 *section = dummy; 660 } 661 662 loop = false; 663 } 664 } 665 } 666 } 667} 668 669 670#define ieee_seek(abfd, offset) \ 671 IEEE_DATA(abfd)->h.input_p = IEEE_DATA(abfd)->h.first_byte + offset 672 673#define ieee_pos(abfd) \ 674 (IEEE_DATA(abfd)->h.input_p - IEEE_DATA(abfd)->h.first_byte) 675 676static unsigned int last_index; 677static char last_type; /* is the index for an X or a D */ 678 679static ieee_symbol_type * 680get_symbol (abfd, 681 ieee, 682 last_symbol, 683 symbol_count, 684 pptr, 685 max_index, 686 this_type 687) 688 bfd *abfd ATTRIBUTE_UNUSED; 689 ieee_data_type *ieee; 690 ieee_symbol_type *last_symbol; 691 unsigned int *symbol_count; 692 ieee_symbol_type ***pptr; 693 unsigned int *max_index; 694 char this_type 695 ; 696{ 697 /* Need a new symbol */ 698 unsigned int new_index = must_parse_int (&(ieee->h)); 699 if (new_index != last_index || this_type != last_type) 700 { 701 ieee_symbol_type *new_symbol = (ieee_symbol_type *) bfd_alloc (ieee->h.abfd, 702 sizeof (ieee_symbol_type)); 703 if (!new_symbol) 704 return NULL; 705 706 new_symbol->index = new_index; 707 last_index = new_index; 708 (*symbol_count)++; 709 **pptr = new_symbol; 710 *pptr = &new_symbol->next; 711 if (new_index > *max_index) 712 { 713 *max_index = new_index; 714 } 715 last_type = this_type; 716 new_symbol->symbol.section = bfd_abs_section_ptr; 717 return new_symbol; 718 } 719 return last_symbol; 720} 721 722static boolean 723ieee_slurp_external_symbols (abfd) 724 bfd *abfd; 725{ 726 ieee_data_type *ieee = IEEE_DATA (abfd); 727 file_ptr offset = ieee->w.r.external_part; 728 729 ieee_symbol_type **prev_symbols_ptr = &ieee->external_symbols; 730 ieee_symbol_type **prev_reference_ptr = &ieee->external_reference; 731 ieee_symbol_type *symbol = (ieee_symbol_type *) NULL; 732 unsigned int symbol_count = 0; 733 boolean loop = true; 734 last_index = 0xffffff; 735 ieee->symbol_table_full = true; 736 737 ieee_seek (abfd, offset); 738 739 while (loop) 740 { 741 switch (this_byte (&(ieee->h))) 742 { 743 case ieee_nn_record: 744 next_byte (&(ieee->h)); 745 746 symbol = get_symbol (abfd, ieee, symbol, &symbol_count, 747 &prev_symbols_ptr, 748 &ieee->external_symbol_max_index, 'I'); 749 if (symbol == NULL) 750 return false; 751 752 symbol->symbol.the_bfd = abfd; 753 symbol->symbol.name = read_id (&(ieee->h)); 754 symbol->symbol.udata.p = (PTR) NULL; 755 symbol->symbol.flags = BSF_NO_FLAGS; 756 break; 757 case ieee_external_symbol_enum: 758 next_byte (&(ieee->h)); 759 760 symbol = get_symbol (abfd, ieee, symbol, &symbol_count, 761 &prev_symbols_ptr, 762 &ieee->external_symbol_max_index, 'D'); 763 if (symbol == NULL) 764 return false; 765 766 BFD_ASSERT (symbol->index >= ieee->external_symbol_min_index); 767 768 symbol->symbol.the_bfd = abfd; 769 symbol->symbol.name = read_id (&(ieee->h)); 770 symbol->symbol.udata.p = (PTR) NULL; 771 symbol->symbol.flags = BSF_NO_FLAGS; 772 break; 773 case ieee_attribute_record_enum >> 8: 774 { 775 unsigned int symbol_name_index; 776 unsigned int symbol_type_index; 777 unsigned int symbol_attribute_def; 778 bfd_vma value; 779 switch (read_2bytes (ieee)) 780 { 781 case ieee_attribute_record_enum: 782 symbol_name_index = must_parse_int (&(ieee->h)); 783 symbol_type_index = must_parse_int (&(ieee->h)); 784 symbol_attribute_def = must_parse_int (&(ieee->h)); 785 switch (symbol_attribute_def) 786 { 787 case 8: 788 case 19: 789 parse_int (&ieee->h, &value); 790 break; 791 default: 792 (*_bfd_error_handler) 793 (_("%s: unimplemented ATI record %u for symbol %u"), 794 bfd_get_filename (abfd), symbol_attribute_def, 795 symbol_name_index); 796 bfd_set_error (bfd_error_bad_value); 797 return false; 798 break; 799 } 800 break; 801 case ieee_external_reference_info_record_enum: 802 /* Skip over ATX record. */ 803 parse_int (&(ieee->h), &value); 804 parse_int (&(ieee->h), &value); 805 parse_int (&(ieee->h), &value); 806 parse_int (&(ieee->h), &value); 807 break; 808 case ieee_atn_record_enum: 809 /* We may get call optimization information here, 810 which we just ignore. The format is 811 {$F1}${CE}{index}{$00}{$3F}{$3F}{#_of_ASNs} */ 812 parse_int (&ieee->h, &value); 813 parse_int (&ieee->h, &value); 814 parse_int (&ieee->h, &value); 815 if (value != 0x3f) 816 { 817 (*_bfd_error_handler) 818 (_("%s: unexpected ATN type %d in external part"), 819 bfd_get_filename (abfd), (int) value); 820 bfd_set_error (bfd_error_bad_value); 821 return false; 822 } 823 parse_int (&ieee->h, &value); 824 parse_int (&ieee->h, &value); 825 while (value > 0) 826 { 827 bfd_vma val1; 828 829 --value; 830 831 switch (read_2bytes (ieee)) 832 { 833 case ieee_asn_record_enum: 834 parse_int (&ieee->h, &val1); 835 parse_int (&ieee->h, &val1); 836 break; 837 838 default: 839 (*_bfd_error_handler) 840 (_("%s: unexpected type after ATN"), 841 bfd_get_filename (abfd)); 842 bfd_set_error (bfd_error_bad_value); 843 return false; 844 } 845 } 846 } 847 } 848 break; 849 case ieee_value_record_enum >> 8: 850 { 851 unsigned int symbol_name_index; 852 ieee_symbol_index_type symbol_ignore; 853 boolean pcrel_ignore; 854 unsigned int extra; 855 next_byte (&(ieee->h)); 856 next_byte (&(ieee->h)); 857 858 symbol_name_index = must_parse_int (&(ieee->h)); 859 parse_expression (ieee, 860 &symbol->symbol.value, 861 &symbol_ignore, 862 &pcrel_ignore, 863 &extra, 864 &symbol->symbol.section); 865 866 /* Fully linked IEEE-695 files tend to give every symbol 867 an absolute value. Try to convert that back into a 868 section relative value. FIXME: This won't always to 869 the right thing. */ 870 if (bfd_is_abs_section (symbol->symbol.section) 871 && (abfd->flags & HAS_RELOC) == 0) 872 { 873 bfd_vma val; 874 asection *s; 875 876 val = symbol->symbol.value; 877 for (s = abfd->sections; s != NULL; s = s->next) 878 { 879 if (val >= s->vma && val < s->vma + s->_raw_size) 880 { 881 symbol->symbol.section = s; 882 symbol->symbol.value -= s->vma; 883 break; 884 } 885 } 886 } 887 888 symbol->symbol.flags = BSF_GLOBAL | BSF_EXPORT; 889 890 } 891 break; 892 case ieee_weak_external_reference_enum: 893 { 894 bfd_vma size; 895 bfd_vma value; 896 next_byte (&(ieee->h)); 897 /* Throw away the external reference index */ 898 (void) must_parse_int (&(ieee->h)); 899 /* Fetch the default size if not resolved */ 900 size = must_parse_int (&(ieee->h)); 901 /* Fetch the defautlt value if available */ 902 if (parse_int (&(ieee->h), &value) == false) 903 { 904 value = 0; 905 } 906 /* This turns into a common */ 907 symbol->symbol.section = bfd_com_section_ptr; 908 symbol->symbol.value = size; 909 } 910 break; 911 912 case ieee_external_reference_enum: 913 next_byte (&(ieee->h)); 914 915 symbol = get_symbol (abfd, ieee, symbol, &symbol_count, 916 &prev_reference_ptr, 917 &ieee->external_reference_max_index, 'X'); 918 if (symbol == NULL) 919 return false; 920 921 symbol->symbol.the_bfd = abfd; 922 symbol->symbol.name = read_id (&(ieee->h)); 923 symbol->symbol.udata.p = (PTR) NULL; 924 symbol->symbol.section = bfd_und_section_ptr; 925 symbol->symbol.value = (bfd_vma) 0; 926 symbol->symbol.flags = 0; 927 928 BFD_ASSERT (symbol->index >= ieee->external_reference_min_index); 929 break; 930 931 default: 932 loop = false; 933 } 934 } 935 936 if (ieee->external_symbol_max_index != 0) 937 { 938 ieee->external_symbol_count = 939 ieee->external_symbol_max_index - 940 ieee->external_symbol_min_index + 1; 941 } 942 else 943 { 944 ieee->external_symbol_count = 0; 945 } 946 947 if (ieee->external_reference_max_index != 0) 948 { 949 ieee->external_reference_count = 950 ieee->external_reference_max_index - 951 ieee->external_reference_min_index + 1; 952 } 953 else 954 { 955 ieee->external_reference_count = 0; 956 } 957 958 abfd->symcount = 959 ieee->external_reference_count + ieee->external_symbol_count; 960 961 if (symbol_count != abfd->symcount) 962 { 963 /* There are gaps in the table -- */ 964 ieee->symbol_table_full = false; 965 } 966 967 *prev_symbols_ptr = (ieee_symbol_type *) NULL; 968 *prev_reference_ptr = (ieee_symbol_type *) NULL; 969 970 return true; 971} 972 973static boolean 974ieee_slurp_symbol_table (abfd) 975 bfd *abfd; 976{ 977 if (IEEE_DATA (abfd)->read_symbols == false) 978 { 979 if (! ieee_slurp_external_symbols (abfd)) 980 return false; 981 IEEE_DATA (abfd)->read_symbols = true; 982 } 983 return true; 984} 985 986long 987ieee_get_symtab_upper_bound (abfd) 988 bfd *abfd; 989{ 990 if (! ieee_slurp_symbol_table (abfd)) 991 return -1; 992 993 return (abfd->symcount != 0) ? 994 (abfd->symcount + 1) * (sizeof (ieee_symbol_type *)) : 0; 995} 996 997/* 998Move from our internal lists to the canon table, and insert in 999symbol index order 1000*/ 1001 1002extern const bfd_target ieee_vec; 1003 1004long 1005ieee_get_symtab (abfd, location) 1006 bfd *abfd; 1007 asymbol **location; 1008{ 1009 ieee_symbol_type *symp; 1010 static bfd dummy_bfd; 1011 static asymbol empty_symbol = 1012 { 1013 &dummy_bfd, 1014 " ieee empty", 1015 (symvalue) 0, 1016 BSF_DEBUGGING, 1017 bfd_abs_section_ptr 1018#ifdef __STDC__ 1019 /* K&R compilers can't initialise unions. */ 1020 , { 0 } 1021#endif 1022 }; 1023 1024 if (abfd->symcount) 1025 { 1026 ieee_data_type *ieee = IEEE_DATA (abfd); 1027 dummy_bfd.xvec = &ieee_vec; 1028 if (! ieee_slurp_symbol_table (abfd)) 1029 return -1; 1030 1031 if (ieee->symbol_table_full == false) 1032 { 1033 /* Arrgh - there are gaps in the table, run through and fill them */ 1034 /* up with pointers to a null place */ 1035 unsigned int i; 1036 for (i = 0; i < abfd->symcount; i++) 1037 { 1038 location[i] = &empty_symbol; 1039 } 1040 } 1041 1042 ieee->external_symbol_base_offset = -ieee->external_symbol_min_index; 1043 for (symp = IEEE_DATA (abfd)->external_symbols; 1044 symp != (ieee_symbol_type *) NULL; 1045 symp = symp->next) 1046 { 1047 /* Place into table at correct index locations */ 1048 location[symp->index + ieee->external_symbol_base_offset] = &symp->symbol; 1049 } 1050 1051 /* The external refs are indexed in a bit */ 1052 ieee->external_reference_base_offset = 1053 -ieee->external_reference_min_index + ieee->external_symbol_count; 1054 1055 for (symp = IEEE_DATA (abfd)->external_reference; 1056 symp != (ieee_symbol_type *) NULL; 1057 symp = symp->next) 1058 { 1059 location[symp->index + ieee->external_reference_base_offset] = 1060 &symp->symbol; 1061 1062 } 1063 } 1064 if (abfd->symcount) 1065 { 1066 location[abfd->symcount] = (asymbol *) NULL; 1067 } 1068 return abfd->symcount; 1069} 1070 1071static asection * 1072get_section_entry (abfd, ieee, index) 1073 bfd *abfd; 1074 ieee_data_type *ieee; 1075 unsigned int index; 1076{ 1077 if (index >= ieee->section_table_size) 1078 { 1079 unsigned int c, i; 1080 asection **n; 1081 1082 c = ieee->section_table_size; 1083 if (c == 0) 1084 c = 20; 1085 while (c <= index) 1086 c *= 2; 1087 1088 n = ((asection **) 1089 bfd_realloc (ieee->section_table, c * sizeof (asection *))); 1090 if (n == NULL) 1091 return NULL; 1092 1093 for (i = ieee->section_table_size; i < c; i++) 1094 n[i] = NULL; 1095 1096 ieee->section_table = n; 1097 ieee->section_table_size = c; 1098 } 1099 1100 if (ieee->section_table[index] == (asection *) NULL) 1101 { 1102 char *tmp = bfd_alloc (abfd, 11); 1103 asection *section; 1104 1105 if (!tmp) 1106 return NULL; 1107 sprintf (tmp, " fsec%4d", index); 1108 section = bfd_make_section (abfd, tmp); 1109 ieee->section_table[index] = section; 1110 section->flags = SEC_NO_FLAGS; 1111 section->target_index = index; 1112 ieee->section_table[index] = section; 1113 } 1114 return ieee->section_table[index]; 1115} 1116 1117static void 1118ieee_slurp_sections (abfd) 1119 bfd *abfd; 1120{ 1121 ieee_data_type *ieee = IEEE_DATA (abfd); 1122 file_ptr offset = ieee->w.r.section_part; 1123 asection *section = (asection *) NULL; 1124 char *name; 1125 1126 if (offset != 0) 1127 { 1128 bfd_byte section_type[3]; 1129 ieee_seek (abfd, offset); 1130 while (true) 1131 { 1132 switch (this_byte (&(ieee->h))) 1133 { 1134 case ieee_section_type_enum: 1135 { 1136 unsigned int section_index; 1137 next_byte (&(ieee->h)); 1138 section_index = must_parse_int (&(ieee->h)); 1139 1140 section = get_section_entry (abfd, ieee, section_index); 1141 1142 section_type[0] = this_byte_and_next (&(ieee->h)); 1143 1144 /* Set minimal section attributes. Attributes are 1145 extended later, based on section contents. */ 1146 1147 switch (section_type[0]) 1148 { 1149 case 0xC1: 1150 /* Normal attributes for absolute sections */ 1151 section_type[1] = this_byte (&(ieee->h)); 1152 section->flags = SEC_ALLOC; 1153 switch (section_type[1]) 1154 { 1155 case 0xD3: /* AS Absolute section attributes */ 1156 next_byte (&(ieee->h)); 1157 section_type[2] = this_byte (&(ieee->h)); 1158 switch (section_type[2]) 1159 { 1160 case 0xD0: 1161 /* Normal code */ 1162 next_byte (&(ieee->h)); 1163 section->flags |= SEC_CODE; 1164 break; 1165 case 0xC4: 1166 /* Normal data */ 1167 next_byte (&(ieee->h)); 1168 section->flags |= SEC_DATA; 1169 break; 1170 case 0xD2: 1171 next_byte (&(ieee->h)); 1172 /* Normal rom data */ 1173 section->flags |= SEC_ROM | SEC_DATA; 1174 break; 1175 default: 1176 break; 1177 } 1178 } 1179 break; 1180 case 0xC3: /* Named relocatable sections (type C) */ 1181 section_type[1] = this_byte (&(ieee->h)); 1182 section->flags = SEC_ALLOC; 1183 switch (section_type[1]) 1184 { 1185 case 0xD0: /* Normal code (CP) */ 1186 next_byte (&(ieee->h)); 1187 section->flags |= SEC_CODE; 1188 break; 1189 case 0xC4: /* Normal data (CD) */ 1190 next_byte (&(ieee->h)); 1191 section->flags |= SEC_DATA; 1192 break; 1193 case 0xD2: /* Normal rom data (CR) */ 1194 next_byte (&(ieee->h)); 1195 section->flags |= SEC_ROM | SEC_DATA; 1196 break; 1197 default: 1198 break; 1199 } 1200 } 1201 1202 /* Read section name, use it if non empty. */ 1203 name = read_id (&ieee->h); 1204 if (name[0]) 1205 section->name = name; 1206 1207 /* Skip these fields, which we don't care about */ 1208 { 1209 bfd_vma parent, brother, context; 1210 parse_int (&(ieee->h), &parent); 1211 parse_int (&(ieee->h), &brother); 1212 parse_int (&(ieee->h), &context); 1213 } 1214 } 1215 break; 1216 case ieee_section_alignment_enum: 1217 { 1218 unsigned int section_index; 1219 bfd_vma value; 1220 asection *section; 1221 next_byte (&(ieee->h)); 1222 section_index = must_parse_int (&ieee->h); 1223 section = get_section_entry (abfd, ieee, section_index); 1224 if (section_index > ieee->section_count) 1225 { 1226 ieee->section_count = section_index; 1227 } 1228 section->alignment_power = 1229 bfd_log2 (must_parse_int (&ieee->h)); 1230 (void) parse_int (&(ieee->h), &value); 1231 } 1232 break; 1233 case ieee_e2_first_byte_enum: 1234 { 1235 ieee_record_enum_type t = (ieee_record_enum_type) (read_2bytes (&(ieee->h))); 1236 1237 switch (t) 1238 { 1239 case ieee_section_size_enum: 1240 section = ieee->section_table[must_parse_int (&(ieee->h))]; 1241 section->_raw_size = must_parse_int (&(ieee->h)); 1242 break; 1243 case ieee_physical_region_size_enum: 1244 section = ieee->section_table[must_parse_int (&(ieee->h))]; 1245 section->_raw_size = must_parse_int (&(ieee->h)); 1246 break; 1247 case ieee_region_base_address_enum: 1248 section = ieee->section_table[must_parse_int (&(ieee->h))]; 1249 section->vma = must_parse_int (&(ieee->h)); 1250 section->lma = section->vma; 1251 break; 1252 case ieee_mau_size_enum: 1253 must_parse_int (&(ieee->h)); 1254 must_parse_int (&(ieee->h)); 1255 break; 1256 case ieee_m_value_enum: 1257 must_parse_int (&(ieee->h)); 1258 must_parse_int (&(ieee->h)); 1259 break; 1260 case ieee_section_base_address_enum: 1261 section = ieee->section_table[must_parse_int (&(ieee->h))]; 1262 section->vma = must_parse_int (&(ieee->h)); 1263 section->lma = section->vma; 1264 break; 1265 case ieee_section_offset_enum: 1266 (void) must_parse_int (&(ieee->h)); 1267 (void) must_parse_int (&(ieee->h)); 1268 break; 1269 default: 1270 return; 1271 } 1272 } 1273 break; 1274 default: 1275 return; 1276 } 1277 } 1278 } 1279} 1280 1281/* Make a section for the debugging information, if any. We don't try 1282 to interpret the debugging information; we just point the section 1283 at the area in the file so that program which understand can dig it 1284 out. */ 1285 1286static boolean 1287ieee_slurp_debug (abfd) 1288 bfd *abfd; 1289{ 1290 ieee_data_type *ieee = IEEE_DATA (abfd); 1291 asection *sec; 1292 file_ptr debug_end; 1293 1294 if (ieee->w.r.debug_information_part == 0) 1295 return true; 1296 1297 sec = bfd_make_section (abfd, ".debug"); 1298 if (sec == NULL) 1299 return false; 1300 sec->flags |= SEC_DEBUGGING | SEC_HAS_CONTENTS; 1301 sec->filepos = ieee->w.r.debug_information_part; 1302 1303 debug_end = ieee->w.r.data_part; 1304 if (debug_end == 0) 1305 debug_end = ieee->w.r.trailer_part; 1306 if (debug_end == 0) 1307 debug_end = ieee->w.r.me_record; 1308 sec->_raw_size = debug_end - ieee->w.r.debug_information_part; 1309 1310 return true; 1311} 1312 1313/*********************************************************************** 1314* archive stuff 1315*/ 1316 1317const bfd_target * 1318ieee_archive_p (abfd) 1319 bfd *abfd; 1320{ 1321 char *library; 1322 unsigned int i; 1323 unsigned char buffer[512]; 1324 file_ptr buffer_offset = 0; 1325 ieee_ar_data_type *save = abfd->tdata.ieee_ar_data; 1326 ieee_ar_data_type *ieee; 1327 unsigned int alc_elts; 1328 ieee_ar_obstack_type *elts = NULL; 1329 1330 abfd->tdata.ieee_ar_data = 1331 (ieee_ar_data_type *) bfd_alloc (abfd, sizeof (ieee_ar_data_type)); 1332 if (!abfd->tdata.ieee_ar_data) 1333 goto error_return; 1334 ieee = IEEE_AR_DATA (abfd); 1335 1336 /* FIXME: Check return value. I'm not sure whether it needs to read 1337 the entire buffer or not. */ 1338 bfd_read ((PTR) buffer, 1, sizeof (buffer), abfd); 1339 1340 ieee->h.first_byte = buffer; 1341 ieee->h.input_p = buffer; 1342 1343 ieee->h.abfd = abfd; 1344 1345 if (this_byte (&(ieee->h)) != Module_Beginning) 1346 { 1347 abfd->tdata.ieee_ar_data = save; 1348 goto got_wrong_format_error; 1349 } 1350 1351 next_byte (&(ieee->h)); 1352 library = read_id (&(ieee->h)); 1353 if (strcmp (library, "LIBRARY") != 0) 1354 { 1355 bfd_release (abfd, ieee); 1356 abfd->tdata.ieee_ar_data = save; 1357 goto got_wrong_format_error; 1358 } 1359 /* Throw away the filename */ 1360 read_id (&(ieee->h)); 1361 1362 ieee->element_count = 0; 1363 ieee->element_index = 0; 1364 1365 next_byte (&(ieee->h)); /* Drop the ad part */ 1366 must_parse_int (&(ieee->h)); /* And the two dummy numbers */ 1367 must_parse_int (&(ieee->h)); 1368 1369 alc_elts = 10; 1370 elts = (ieee_ar_obstack_type *) bfd_malloc (alc_elts * sizeof *elts); 1371 if (elts == NULL) 1372 goto error_return; 1373 1374 /* Read the index of the BB table */ 1375 while (1) 1376 { 1377 int rec; 1378 ieee_ar_obstack_type *t; 1379 1380 rec = read_2bytes (&(ieee->h)); 1381 if (rec != (int) ieee_assign_value_to_variable_enum) 1382 break; 1383 1384 if (ieee->element_count >= alc_elts) 1385 { 1386 ieee_ar_obstack_type *n; 1387 1388 alc_elts *= 2; 1389 n = ((ieee_ar_obstack_type *) 1390 bfd_realloc (elts, alc_elts * sizeof *elts)); 1391 if (n == NULL) 1392 goto error_return; 1393 elts = n; 1394 } 1395 1396 t = &elts[ieee->element_count]; 1397 ieee->element_count++; 1398 1399 must_parse_int (&(ieee->h)); 1400 t->file_offset = must_parse_int (&(ieee->h)); 1401 t->abfd = (bfd *) NULL; 1402 1403 /* Make sure that we don't go over the end of the buffer */ 1404 1405 if ((size_t) ieee_pos (abfd) > sizeof (buffer) / 2) 1406 { 1407 /* Past half way, reseek and reprime */ 1408 buffer_offset += ieee_pos (abfd); 1409 if (bfd_seek (abfd, buffer_offset, SEEK_SET) != 0) 1410 goto error_return; 1411 /* FIXME: Check return value. I'm not sure whether it needs 1412 to read the entire buffer or not. */ 1413 bfd_read ((PTR) buffer, 1, sizeof (buffer), abfd); 1414 ieee->h.first_byte = buffer; 1415 ieee->h.input_p = buffer; 1416 } 1417 } 1418 1419 ieee->elements = ((ieee_ar_obstack_type *) 1420 bfd_alloc (abfd, 1421 ieee->element_count * sizeof *ieee->elements)); 1422 if (ieee->elements == NULL) 1423 goto error_return; 1424 memcpy (ieee->elements, elts, 1425 ieee->element_count * sizeof *ieee->elements); 1426 free (elts); 1427 elts = NULL; 1428 1429 /* Now scan the area again, and replace BB offsets with file */ 1430 /* offsets */ 1431 1432 for (i = 2; i < ieee->element_count; i++) 1433 { 1434 if (bfd_seek (abfd, ieee->elements[i].file_offset, SEEK_SET) != 0) 1435 goto error_return; 1436 /* FIXME: Check return value. I'm not sure whether it needs to 1437 read the entire buffer or not. */ 1438 bfd_read ((PTR) buffer, 1, sizeof (buffer), abfd); 1439 ieee->h.first_byte = buffer; 1440 ieee->h.input_p = buffer; 1441 1442 next_byte (&(ieee->h)); /* Drop F8 */ 1443 next_byte (&(ieee->h)); /* Drop 14 */ 1444 must_parse_int (&(ieee->h)); /* Drop size of block */ 1445 if (must_parse_int (&(ieee->h)) != 0) 1446 { 1447 /* This object has been deleted */ 1448 ieee->elements[i].file_offset = 0; 1449 } 1450 else 1451 { 1452 ieee->elements[i].file_offset = must_parse_int (&(ieee->h)); 1453 } 1454 } 1455 1456 /* abfd->has_armap = ;*/ 1457 1458 return abfd->xvec; 1459 1460 got_wrong_format_error: 1461 bfd_set_error (bfd_error_wrong_format); 1462 error_return: 1463 if (elts != NULL) 1464 free (elts); 1465 return NULL; 1466} 1467 1468static boolean 1469ieee_mkobject (abfd) 1470 bfd *abfd; 1471{ 1472 abfd->tdata.ieee_data = (ieee_data_type *) bfd_zalloc (abfd, sizeof (ieee_data_type)); 1473 return abfd->tdata.ieee_data ? true : false; 1474} 1475 1476const bfd_target * 1477ieee_object_p (abfd) 1478 bfd *abfd; 1479{ 1480 char *processor; 1481 unsigned int part; 1482 ieee_data_type *ieee; 1483 unsigned char buffer[300]; 1484 ieee_data_type *save = IEEE_DATA (abfd); 1485 1486 abfd->tdata.ieee_data = 0; 1487 ieee_mkobject (abfd); 1488 1489 ieee = IEEE_DATA (abfd); 1490 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) 1491 goto fail; 1492 /* Read the first few bytes in to see if it makes sense */ 1493 /* FIXME: Check return value. I'm not sure whether it needs to read 1494 the entire buffer or not. */ 1495 bfd_read ((PTR) buffer, 1, sizeof (buffer), abfd); 1496 1497 ieee->h.input_p = buffer; 1498 if (this_byte_and_next (&(ieee->h)) != Module_Beginning) 1499 goto got_wrong_format; 1500 1501 ieee->read_symbols = false; 1502 ieee->read_data = false; 1503 ieee->section_count = 0; 1504 ieee->external_symbol_max_index = 0; 1505 ieee->external_symbol_min_index = IEEE_PUBLIC_BASE; 1506 ieee->external_reference_min_index = IEEE_REFERENCE_BASE; 1507 ieee->external_reference_max_index = 0; 1508 ieee->h.abfd = abfd; 1509 ieee->section_table = NULL; 1510 ieee->section_table_size = 0; 1511 1512 processor = ieee->mb.processor = read_id (&(ieee->h)); 1513 if (strcmp (processor, "LIBRARY") == 0) 1514 goto got_wrong_format; 1515 ieee->mb.module_name = read_id (&(ieee->h)); 1516 if (abfd->filename == (CONST char *) NULL) 1517 { 1518 abfd->filename = ieee->mb.module_name; 1519 } 1520 /* Determine the architecture and machine type of the object file. 1521 */ 1522 { 1523 const bfd_arch_info_type *arch; 1524 char family[10]; 1525 1526 /* IEEE does not specify the format of the processor identificaton 1527 string, so the compiler is free to put in it whatever it wants. 1528 We try here to recognize different processors belonging to the 1529 m68k family. Code for other processors can be added here. */ 1530 if ((processor[0] == '6') && (processor[1] == '8')) 1531 { 1532 if (processor[2] == '3') /* 683xx integrated processors */ 1533 { 1534 switch (processor[3]) 1535 { 1536 case '0': /* 68302, 68306, 68307 */ 1537 case '2': /* 68322, 68328 */ 1538 case '5': /* 68356 */ 1539 strcpy (family, "68000"); /* MC68000-based controllers */ 1540 break; 1541 1542 case '3': /* 68330, 68331, 68332, 68333, 1543 68334, 68335, 68336, 68338 */ 1544 case '6': /* 68360 */ 1545 case '7': /* 68376 */ 1546 strcpy (family, "68332"); /* CPU32 and CPU32+ */ 1547 break; 1548 1549 case '4': 1550 if (processor[4] == '9') /* 68349 */ 1551 strcpy (family, "68030"); /* CPU030 */ 1552 else /* 68340, 68341 */ 1553 strcpy (family, "68332"); /* CPU32 and CPU32+ */ 1554 break; 1555 1556 default: /* Does not exist yet */ 1557 strcpy (family, "68332"); /* Guess it will be CPU32 */ 1558 } 1559 } 1560 else if (toupper (processor[3]) == 'F') /* 68F333 */ 1561 strcpy (family, "68332"); /* CPU32 */ 1562 else if ((toupper (processor[3]) == 'C') /* Embedded controllers */ 1563 && ((toupper (processor[2]) == 'E') 1564 || (toupper (processor[2]) == 'H') 1565 || (toupper (processor[2]) == 'L'))) 1566 { 1567 strcpy (family, "68"); 1568 strncat (family, processor + 4, 7); 1569 family[9] = '\0'; 1570 } 1571 else /* "Regular" processors */ 1572 { 1573 strncpy (family, processor, 9); 1574 family[9] = '\0'; 1575 } 1576 } 1577 else if ((strncmp (processor, "cpu32", 5) == 0) /* CPU32 and CPU32+ */ 1578 || (strncmp (processor, "CPU32", 5) == 0)) 1579 strcpy (family, "68332"); 1580 else 1581 { 1582 strncpy (family, processor, 9); 1583 family[9] = '\0'; 1584 } 1585 1586 arch = bfd_scan_arch (family); 1587 if (arch == 0) 1588 goto got_wrong_format; 1589 abfd->arch_info = arch; 1590 } 1591 1592 if (this_byte (&(ieee->h)) != (int) ieee_address_descriptor_enum) 1593 { 1594 goto fail; 1595 } 1596 next_byte (&(ieee->h)); 1597 1598 if (parse_int (&(ieee->h), &ieee->ad.number_of_bits_mau) == false) 1599 { 1600 goto fail; 1601 } 1602 if (parse_int (&(ieee->h), &ieee->ad.number_of_maus_in_address) == false) 1603 { 1604 goto fail; 1605 } 1606 1607 /* If there is a byte order info, take it */ 1608 if (this_byte (&(ieee->h)) == (int) ieee_variable_L_enum || 1609 this_byte (&(ieee->h)) == (int) ieee_variable_M_enum) 1610 next_byte (&(ieee->h)); 1611 1612 for (part = 0; part < N_W_VARIABLES; part++) 1613 { 1614 boolean ok; 1615 if (read_2bytes (&(ieee->h)) != (int) ieee_assign_value_to_variable_enum) 1616 { 1617 goto fail; 1618 } 1619 if (this_byte_and_next (&(ieee->h)) != part) 1620 { 1621 goto fail; 1622 } 1623 1624 ieee->w.offset[part] = parse_i (&(ieee->h), &ok); 1625 if (ok == false) 1626 { 1627 goto fail; 1628 } 1629 1630 } 1631 1632 if (ieee->w.r.external_part != 0) 1633 abfd->flags = HAS_SYMS; 1634 1635 /* By now we know that this is a real IEEE file, we're going to read 1636 the whole thing into memory so that we can run up and down it 1637 quickly. We can work out how big the file is from the trailer 1638 record */ 1639 1640 IEEE_DATA (abfd)->h.first_byte = 1641 (unsigned char *) bfd_alloc (ieee->h.abfd, ieee->w.r.me_record + 1); 1642 if (!IEEE_DATA (abfd)->h.first_byte) 1643 goto fail; 1644 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) 1645 goto fail; 1646 /* FIXME: Check return value. I'm not sure whether it needs to read 1647 the entire buffer or not. */ 1648 bfd_read ((PTR) (IEEE_DATA (abfd)->h.first_byte), 1, 1649 ieee->w.r.me_record + 1, abfd); 1650 1651 ieee_slurp_sections (abfd); 1652 1653 if (! ieee_slurp_debug (abfd)) 1654 goto fail; 1655 1656 /* Parse section data to activate file and section flags implied by 1657 section contents. */ 1658 1659 if (! ieee_slurp_section_data (abfd)) 1660 goto fail; 1661 1662 return abfd->xvec; 1663got_wrong_format: 1664 bfd_set_error (bfd_error_wrong_format); 1665fail: 1666 (void) bfd_release (abfd, ieee); 1667 abfd->tdata.ieee_data = save; 1668 return (const bfd_target *) NULL; 1669} 1670 1671void 1672ieee_get_symbol_info (ignore_abfd, symbol, ret) 1673 bfd *ignore_abfd ATTRIBUTE_UNUSED; 1674 asymbol *symbol; 1675 symbol_info *ret; 1676{ 1677 bfd_symbol_info (symbol, ret); 1678 if (symbol->name[0] == ' ') 1679 ret->name = "* empty table entry "; 1680 if (!symbol->section) 1681 ret->type = (symbol->flags & BSF_LOCAL) ? 'a' : 'A'; 1682} 1683 1684void 1685ieee_print_symbol (ignore_abfd, afile, symbol, how) 1686 bfd *ignore_abfd ATTRIBUTE_UNUSED; 1687 PTR afile; 1688 asymbol *symbol; 1689 bfd_print_symbol_type how; 1690{ 1691 FILE *file = (FILE *) afile; 1692 1693 switch (how) 1694 { 1695 case bfd_print_symbol_name: 1696 fprintf (file, "%s", symbol->name); 1697 break; 1698 case bfd_print_symbol_more: 1699#if 0 1700 fprintf (file, "%4x %2x", aout_symbol (symbol)->desc & 0xffff, 1701 aout_symbol (symbol)->other & 0xff); 1702#endif 1703 BFD_FAIL (); 1704 break; 1705 case bfd_print_symbol_all: 1706 { 1707 const char *section_name = 1708 (symbol->section == (asection *) NULL 1709 ? "*abs" 1710 : symbol->section->name); 1711 if (symbol->name[0] == ' ') 1712 { 1713 fprintf (file, "* empty table entry "); 1714 } 1715 else 1716 { 1717 bfd_print_symbol_vandf ((PTR) file, symbol); 1718 1719 fprintf (file, " %-5s %04x %02x %s", 1720 section_name, 1721 (unsigned) ieee_symbol (symbol)->index, 1722 (unsigned) 0, 1723 symbol->name); 1724 } 1725 } 1726 break; 1727 } 1728} 1729 1730static boolean 1731do_one (ieee, current_map, location_ptr, s, iterations) 1732 ieee_data_type *ieee; 1733 ieee_per_section_type *current_map; 1734 unsigned char *location_ptr; 1735 asection *s; 1736 int iterations; 1737{ 1738 switch (this_byte (&(ieee->h))) 1739 { 1740 case ieee_load_constant_bytes_enum: 1741 { 1742 unsigned int number_of_maus; 1743 unsigned int i; 1744 next_byte (&(ieee->h)); 1745 number_of_maus = must_parse_int (&(ieee->h)); 1746 1747 for (i = 0; i < number_of_maus; i++) 1748 { 1749 location_ptr[current_map->pc++] = this_byte (&(ieee->h)); 1750 next_byte (&(ieee->h)); 1751 } 1752 } 1753 break; 1754 1755 case ieee_load_with_relocation_enum: 1756 { 1757 boolean loop = true; 1758 next_byte (&(ieee->h)); 1759 while (loop) 1760 { 1761 switch (this_byte (&(ieee->h))) 1762 { 1763 case ieee_variable_R_enum: 1764 1765 case ieee_function_signed_open_b_enum: 1766 case ieee_function_unsigned_open_b_enum: 1767 case ieee_function_either_open_b_enum: 1768 { 1769 unsigned int extra = 4; 1770 boolean pcrel = false; 1771 asection *section; 1772 ieee_reloc_type *r = 1773 (ieee_reloc_type *) bfd_alloc (ieee->h.abfd, 1774 sizeof (ieee_reloc_type)); 1775 if (!r) 1776 return false; 1777 1778 *(current_map->reloc_tail_ptr) = r; 1779 current_map->reloc_tail_ptr = &r->next; 1780 r->next = (ieee_reloc_type *) NULL; 1781 next_byte (&(ieee->h)); 1782/* abort();*/ 1783 r->relent.sym_ptr_ptr = 0; 1784 parse_expression (ieee, 1785 &r->relent.addend, 1786 &r->symbol, 1787 &pcrel, &extra, §ion); 1788 r->relent.address = current_map->pc; 1789 s->flags |= SEC_RELOC; 1790 s->owner->flags |= HAS_RELOC; 1791 s->reloc_count++; 1792 if (r->relent.sym_ptr_ptr == NULL && section != NULL) 1793 r->relent.sym_ptr_ptr = section->symbol_ptr_ptr; 1794 1795 if (this_byte (&(ieee->h)) == (int) ieee_comma) 1796 { 1797 next_byte (&(ieee->h)); 1798 /* Fetch number of bytes to pad */ 1799 extra = must_parse_int (&(ieee->h)); 1800 }; 1801 1802 switch (this_byte (&(ieee->h))) 1803 { 1804 case ieee_function_signed_close_b_enum: 1805 next_byte (&(ieee->h)); 1806 break; 1807 case ieee_function_unsigned_close_b_enum: 1808 next_byte (&(ieee->h)); 1809 break; 1810 case ieee_function_either_close_b_enum: 1811 next_byte (&(ieee->h)); 1812 break; 1813 default: 1814 break; 1815 } 1816 /* Build a relocation entry for this type */ 1817 /* If pc rel then stick -ve pc into instruction 1818 and take out of reloc .. 1819 1820 I've changed this. It's all too complicated. I 1821 keep 0 in the instruction now. */ 1822 1823 switch (extra) 1824 { 1825 case 0: 1826 case 4: 1827 1828 if (pcrel == true) 1829 { 1830#if KEEPMINUSPCININST 1831 bfd_put_32 (ieee->h.abfd, -current_map->pc, location_ptr + 1832 current_map->pc); 1833 r->relent.howto = &rel32_howto; 1834 r->relent.addend -= 1835 current_map->pc; 1836#else 1837 bfd_put_32 (ieee->h.abfd, 0, location_ptr + 1838 current_map->pc); 1839 r->relent.howto = &rel32_howto; 1840#endif 1841 } 1842 else 1843 { 1844 bfd_put_32 (ieee->h.abfd, 0, location_ptr + 1845 current_map->pc); 1846 r->relent.howto = &abs32_howto; 1847 } 1848 current_map->pc += 4; 1849 break; 1850 case 2: 1851 if (pcrel == true) 1852 { 1853#if KEEPMINUSPCININST 1854 bfd_put_16 (ieee->h.abfd, (int) (-current_map->pc), location_ptr + current_map->pc); 1855 r->relent.addend -= current_map->pc; 1856 r->relent.howto = &rel16_howto; 1857#else 1858 1859 bfd_put_16 (ieee->h.abfd, 0, location_ptr + current_map->pc); 1860 r->relent.howto = &rel16_howto; 1861#endif 1862 } 1863 1864 else 1865 { 1866 bfd_put_16 (ieee->h.abfd, 0, location_ptr + current_map->pc); 1867 r->relent.howto = &abs16_howto; 1868 } 1869 current_map->pc += 2; 1870 break; 1871 case 1: 1872 if (pcrel == true) 1873 { 1874#if KEEPMINUSPCININST 1875 bfd_put_8 (ieee->h.abfd, (int) (-current_map->pc), location_ptr + current_map->pc); 1876 r->relent.addend -= current_map->pc; 1877 r->relent.howto = &rel8_howto; 1878#else 1879 bfd_put_8 (ieee->h.abfd, 0, location_ptr + current_map->pc); 1880 r->relent.howto = &rel8_howto; 1881#endif 1882 } 1883 else 1884 { 1885 bfd_put_8 (ieee->h.abfd, 0, location_ptr + current_map->pc); 1886 r->relent.howto = &abs8_howto; 1887 } 1888 current_map->pc += 1; 1889 break; 1890 1891 default: 1892 BFD_FAIL (); 1893 return false; 1894 } 1895 } 1896 break; 1897 default: 1898 { 1899 bfd_vma this_size; 1900 if (parse_int (&(ieee->h), &this_size) == true) 1901 { 1902 unsigned int i; 1903 for (i = 0; i < this_size; i++) 1904 { 1905 location_ptr[current_map->pc++] = this_byte (&(ieee->h)); 1906 next_byte (&(ieee->h)); 1907 } 1908 } 1909 else 1910 { 1911 loop = false; 1912 } 1913 } 1914 } 1915 1916 /* Prevent more than the first load-item of an LR record 1917 from being repeated (MRI convention). */ 1918 if (iterations != 1) 1919 loop = false; 1920 } 1921 } 1922 } 1923 return true; 1924} 1925 1926/* Read in all the section data and relocation stuff too */ 1927static boolean 1928ieee_slurp_section_data (abfd) 1929 bfd *abfd; 1930{ 1931 bfd_byte *location_ptr = (bfd_byte *) NULL; 1932 ieee_data_type *ieee = IEEE_DATA (abfd); 1933 unsigned int section_number; 1934 1935 ieee_per_section_type *current_map = (ieee_per_section_type *) NULL; 1936 asection *s; 1937 /* Seek to the start of the data area */ 1938 if (ieee->read_data == true) 1939 return true; 1940 ieee->read_data = true; 1941 ieee_seek (abfd, ieee->w.r.data_part); 1942 1943 /* Allocate enough space for all the section contents */ 1944 1945 for (s = abfd->sections; s != (asection *) NULL; s = s->next) 1946 { 1947 ieee_per_section_type *per = (ieee_per_section_type *) s->used_by_bfd; 1948 if ((s->flags & SEC_DEBUGGING) != 0) 1949 continue; 1950 per->data = (bfd_byte *) bfd_alloc (ieee->h.abfd, s->_raw_size); 1951 if (!per->data) 1952 return false; 1953 /*SUPPRESS 68*/ 1954 per->reloc_tail_ptr = 1955 (ieee_reloc_type **) & (s->relocation); 1956 } 1957 1958 while (true) 1959 { 1960 switch (this_byte (&(ieee->h))) 1961 { 1962 /* IF we see anything strange then quit */ 1963 default: 1964 return true; 1965 1966 case ieee_set_current_section_enum: 1967 next_byte (&(ieee->h)); 1968 section_number = must_parse_int (&(ieee->h)); 1969 s = ieee->section_table[section_number]; 1970 s->flags |= SEC_LOAD | SEC_HAS_CONTENTS; 1971 current_map = (ieee_per_section_type *) s->used_by_bfd; 1972 location_ptr = current_map->data - s->vma; 1973 /* The document I have says that Microtec's compilers reset */ 1974 /* this after a sec section, even though the standard says not */ 1975 /* to. SO .. */ 1976 current_map->pc = s->vma; 1977 break; 1978 1979 case ieee_e2_first_byte_enum: 1980 next_byte (&(ieee->h)); 1981 switch (this_byte (&(ieee->h))) 1982 { 1983 case ieee_set_current_pc_enum & 0xff: 1984 { 1985 bfd_vma value; 1986 ieee_symbol_index_type symbol; 1987 unsigned int extra; 1988 boolean pcrel; 1989 next_byte (&(ieee->h)); 1990 must_parse_int (&(ieee->h)); /* Thow away section #*/ 1991 parse_expression (ieee, &value, 1992 &symbol, 1993 &pcrel, &extra, 1994 0); 1995 current_map->pc = value; 1996 BFD_ASSERT ((unsigned) (value - s->vma) <= s->_raw_size); 1997 } 1998 break; 1999 2000 case ieee_value_starting_address_enum & 0xff: 2001 next_byte (&(ieee->h)); 2002 if (this_byte (&(ieee->h)) == ieee_function_either_open_b_enum) 2003 next_byte (&(ieee->h)); 2004 abfd->start_address = must_parse_int (&(ieee->h)); 2005 /* We've got to the end of the data now - */ 2006 return true; 2007 default: 2008 BFD_FAIL (); 2009 return false; 2010 } 2011 break; 2012 case ieee_repeat_data_enum: 2013 { 2014 /* Repeat the following LD or LR n times - we do this by 2015 remembering the stream pointer before running it and 2016 resetting it and running it n times. We special case 2017 the repetition of a repeat_data/load_constant 2018 */ 2019 2020 unsigned int iterations; 2021 unsigned char *start; 2022 next_byte (&(ieee->h)); 2023 iterations = must_parse_int (&(ieee->h)); 2024 start = ieee->h.input_p; 2025 if (start[0] == (int) ieee_load_constant_bytes_enum && 2026 start[1] == 1) 2027 { 2028 while (iterations != 0) 2029 { 2030 location_ptr[current_map->pc++] = start[2]; 2031 iterations--; 2032 } 2033 next_byte (&(ieee->h)); 2034 next_byte (&(ieee->h)); 2035 next_byte (&(ieee->h)); 2036 } 2037 else 2038 { 2039 while (iterations != 0) 2040 { 2041 ieee->h.input_p = start; 2042 if (!do_one (ieee, current_map, location_ptr, s, 2043 iterations)) 2044 return false; 2045 iterations--; 2046 } 2047 } 2048 } 2049 break; 2050 case ieee_load_constant_bytes_enum: 2051 case ieee_load_with_relocation_enum: 2052 { 2053 if (!do_one (ieee, current_map, location_ptr, s, 1)) 2054 return false; 2055 } 2056 } 2057 } 2058} 2059 2060boolean 2061ieee_new_section_hook (abfd, newsect) 2062 bfd *abfd; 2063 asection *newsect; 2064{ 2065 newsect->used_by_bfd = (PTR) 2066 bfd_alloc (abfd, sizeof (ieee_per_section_type)); 2067 if (!newsect->used_by_bfd) 2068 return false; 2069 ieee_per_section (newsect)->data = (bfd_byte *) NULL; 2070 ieee_per_section (newsect)->section = newsect; 2071 return true; 2072} 2073 2074long 2075ieee_get_reloc_upper_bound (abfd, asect) 2076 bfd *abfd; 2077 sec_ptr asect; 2078{ 2079 if ((asect->flags & SEC_DEBUGGING) != 0) 2080 return 0; 2081 if (! ieee_slurp_section_data (abfd)) 2082 return -1; 2083 return (asect->reloc_count + 1) * sizeof (arelent *); 2084} 2085 2086static boolean 2087ieee_get_section_contents (abfd, section, location, offset, count) 2088 bfd *abfd; 2089 sec_ptr section; 2090 PTR location; 2091 file_ptr offset; 2092 bfd_size_type count; 2093{ 2094 ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd; 2095 if ((section->flags & SEC_DEBUGGING) != 0) 2096 return _bfd_generic_get_section_contents (abfd, section, location, 2097 offset, count); 2098 ieee_slurp_section_data (abfd); 2099 (void) memcpy ((PTR) location, (PTR) (p->data + offset), (unsigned) count); 2100 return true; 2101} 2102 2103long 2104ieee_canonicalize_reloc (abfd, section, relptr, symbols) 2105 bfd *abfd; 2106 sec_ptr section; 2107 arelent **relptr; 2108 asymbol **symbols; 2109{ 2110/* ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd;*/ 2111 ieee_reloc_type *src = (ieee_reloc_type *) (section->relocation); 2112 ieee_data_type *ieee = IEEE_DATA (abfd); 2113 2114 if ((section->flags & SEC_DEBUGGING) != 0) 2115 return 0; 2116 2117 while (src != (ieee_reloc_type *) NULL) 2118 { 2119 /* Work out which symbol to attach it this reloc to */ 2120 switch (src->symbol.letter) 2121 { 2122 case 'I': 2123 src->relent.sym_ptr_ptr = 2124 symbols + src->symbol.index + ieee->external_symbol_base_offset; 2125 break; 2126 case 'X': 2127 src->relent.sym_ptr_ptr = 2128 symbols + src->symbol.index + ieee->external_reference_base_offset; 2129 break; 2130 case 0: 2131 if (src->relent.sym_ptr_ptr != NULL) 2132 src->relent.sym_ptr_ptr = 2133 src->relent.sym_ptr_ptr[0]->section->symbol_ptr_ptr; 2134 break; 2135 default: 2136 2137 BFD_FAIL (); 2138 } 2139 *relptr++ = &src->relent; 2140 src = src->next; 2141 } 2142 *relptr = (arelent *) NULL; 2143 return section->reloc_count; 2144} 2145 2146static int 2147comp (ap, bp) 2148 CONST PTR ap; 2149 CONST PTR bp; 2150{ 2151 arelent *a = *((arelent **) ap); 2152 arelent *b = *((arelent **) bp); 2153 return a->address - b->address; 2154} 2155 2156/* Write the section headers. */ 2157 2158static boolean 2159ieee_write_section_part (abfd) 2160 bfd *abfd; 2161{ 2162 ieee_data_type *ieee = IEEE_DATA (abfd); 2163 asection *s; 2164 ieee->w.r.section_part = bfd_tell (abfd); 2165 for (s = abfd->sections; s != (asection *) NULL; s = s->next) 2166 { 2167 if (! bfd_is_abs_section (s) 2168 && (s->flags & SEC_DEBUGGING) == 0) 2169 { 2170 if (! ieee_write_byte (abfd, ieee_section_type_enum) 2171 || ! ieee_write_byte (abfd, 2172 (bfd_byte) (s->index 2173 + IEEE_SECTION_NUMBER_BASE))) 2174 return false; 2175 2176 if (abfd->flags & EXEC_P) 2177 { 2178 /* This image is executable, so output absolute sections */ 2179 if (! ieee_write_byte (abfd, ieee_variable_A_enum) 2180 || ! ieee_write_byte (abfd, ieee_variable_S_enum)) 2181 return false; 2182 } 2183 else 2184 { 2185 if (! ieee_write_byte (abfd, ieee_variable_C_enum)) 2186 return false; 2187 } 2188 2189 switch (s->flags & (SEC_CODE | SEC_DATA | SEC_ROM)) 2190 { 2191 case SEC_CODE | SEC_LOAD: 2192 case SEC_CODE: 2193 if (! ieee_write_byte (abfd, ieee_variable_P_enum)) 2194 return false; 2195 break; 2196 case SEC_DATA: 2197 default: 2198 if (! ieee_write_byte (abfd, ieee_variable_D_enum)) 2199 return false; 2200 break; 2201 case SEC_ROM: 2202 case SEC_ROM | SEC_DATA: 2203 case SEC_ROM | SEC_LOAD: 2204 case SEC_ROM | SEC_DATA | SEC_LOAD: 2205 if (! ieee_write_byte (abfd, ieee_variable_R_enum)) 2206 return false; 2207 } 2208 2209 2210 if (! ieee_write_id (abfd, s->name)) 2211 return false; 2212#if 0 2213 ieee_write_int (abfd, 0); /* Parent */ 2214 ieee_write_int (abfd, 0); /* Brother */ 2215 ieee_write_int (abfd, 0); /* Context */ 2216#endif 2217 /* Alignment */ 2218 if (! ieee_write_byte (abfd, ieee_section_alignment_enum) 2219 || ! ieee_write_byte (abfd, 2220 (bfd_byte) (s->index 2221 + IEEE_SECTION_NUMBER_BASE)) 2222 || ! ieee_write_int (abfd, 1 << s->alignment_power)) 2223 return false; 2224 2225 /* Size */ 2226 if (! ieee_write_2bytes (abfd, ieee_section_size_enum) 2227 || ! ieee_write_byte (abfd, 2228 (bfd_byte) (s->index 2229 + IEEE_SECTION_NUMBER_BASE)) 2230 || ! ieee_write_int (abfd, s->_raw_size)) 2231 return false; 2232 if (abfd->flags & EXEC_P) 2233 { 2234 /* Relocateable sections don't have asl records */ 2235 /* Vma */ 2236 if (! ieee_write_2bytes (abfd, ieee_section_base_address_enum) 2237 || ! ieee_write_byte (abfd, 2238 ((bfd_byte) 2239 (s->index 2240 + IEEE_SECTION_NUMBER_BASE))) 2241 || ! ieee_write_int (abfd, s->lma)) 2242 return false; 2243 } 2244 } 2245 } 2246 2247 return true; 2248} 2249 2250 2251static boolean 2252do_with_relocs (abfd, s) 2253 bfd *abfd; 2254 asection *s; 2255{ 2256 unsigned int number_of_maus_in_address = 2257 bfd_arch_bits_per_address (abfd) / bfd_arch_bits_per_byte (abfd); 2258 unsigned int relocs_to_go = s->reloc_count; 2259 bfd_byte *stream = ieee_per_section (s)->data; 2260 arelent **p = s->orelocation; 2261 bfd_size_type current_byte_index = 0; 2262 2263 qsort (s->orelocation, 2264 relocs_to_go, 2265 sizeof (arelent **), 2266 comp); 2267 2268 /* Output the section preheader */ 2269 if (! ieee_write_byte (abfd, ieee_set_current_section_enum) 2270 || ! ieee_write_byte (abfd, 2271 (bfd_byte) (s->index + IEEE_SECTION_NUMBER_BASE)) 2272 || ! ieee_write_2bytes (abfd, ieee_set_current_pc_enum) 2273 || ! ieee_write_byte (abfd, 2274 (bfd_byte) (s->index + IEEE_SECTION_NUMBER_BASE))) 2275 return false; 2276 if ((abfd->flags & EXEC_P) != 0 && relocs_to_go == 0) 2277 { 2278 if (! ieee_write_int (abfd, s->lma)) 2279 return false; 2280 } 2281 else 2282 { 2283 if (! ieee_write_expression (abfd, 0, s->symbol, 0, 0)) 2284 return false; 2285 } 2286 2287 if (relocs_to_go == 0) 2288 { 2289 /* If there aren't any relocations then output the load constant 2290 byte opcode rather than the load with relocation opcode */ 2291 2292 while (current_byte_index < s->_raw_size) 2293 { 2294 bfd_size_type run; 2295 unsigned int MAXRUN = 127; 2296 run = MAXRUN; 2297 if (run > s->_raw_size - current_byte_index) 2298 { 2299 run = s->_raw_size - current_byte_index; 2300 } 2301 2302 if (run != 0) 2303 { 2304 if (! ieee_write_byte (abfd, ieee_load_constant_bytes_enum)) 2305 return false; 2306 /* Output a stream of bytes */ 2307 if (! ieee_write_int (abfd, run)) 2308 return false; 2309 if (bfd_write ((PTR) (stream + current_byte_index), 2310 1, 2311 run, 2312 abfd) 2313 != run) 2314 return false; 2315 current_byte_index += run; 2316 } 2317 } 2318 } 2319 else 2320 { 2321 if (! ieee_write_byte (abfd, ieee_load_with_relocation_enum)) 2322 return false; 2323 2324 /* Output the data stream as the longest sequence of bytes 2325 possible, allowing for the a reasonable packet size and 2326 relocation stuffs. */ 2327 2328 if ((PTR) stream == (PTR) NULL) 2329 { 2330 /* Outputting a section without data, fill it up */ 2331 stream = (unsigned char *) (bfd_alloc (abfd, s->_raw_size)); 2332 if (!stream) 2333 return false; 2334 memset ((PTR) stream, 0, (size_t) s->_raw_size); 2335 } 2336 while (current_byte_index < s->_raw_size) 2337 { 2338 bfd_size_type run; 2339 unsigned int MAXRUN = 127; 2340 if (relocs_to_go) 2341 { 2342 run = (*p)->address - current_byte_index; 2343 if (run > MAXRUN) 2344 run = MAXRUN; 2345 } 2346 else 2347 { 2348 run = MAXRUN; 2349 } 2350 if (run > s->_raw_size - current_byte_index) 2351 { 2352 run = s->_raw_size - current_byte_index; 2353 } 2354 2355 if (run != 0) 2356 { 2357 /* Output a stream of bytes */ 2358 if (! ieee_write_int (abfd, run)) 2359 return false; 2360 if (bfd_write ((PTR) (stream + current_byte_index), 2361 1, 2362 run, 2363 abfd) 2364 != run) 2365 return false; 2366 current_byte_index += run; 2367 } 2368 /* Output any relocations here */ 2369 if (relocs_to_go && (*p) && (*p)->address == current_byte_index) 2370 { 2371 while (relocs_to_go 2372 && (*p) && (*p)->address == current_byte_index) 2373 { 2374 arelent *r = *p; 2375 bfd_signed_vma ov; 2376 2377#if 0 2378 if (r->howto->pc_relative) 2379 { 2380 r->addend += current_byte_index; 2381 } 2382#endif 2383 2384 switch (r->howto->size) 2385 { 2386 case 2: 2387 2388 ov = bfd_get_signed_32 (abfd, 2389 stream + current_byte_index); 2390 current_byte_index += 4; 2391 break; 2392 case 1: 2393 ov = bfd_get_signed_16 (abfd, 2394 stream + current_byte_index); 2395 current_byte_index += 2; 2396 break; 2397 case 0: 2398 ov = bfd_get_signed_8 (abfd, 2399 stream + current_byte_index); 2400 current_byte_index++; 2401 break; 2402 default: 2403 ov = 0; 2404 BFD_FAIL (); 2405 return false; 2406 } 2407 2408 ov &= r->howto->src_mask; 2409 2410 if (r->howto->pc_relative 2411 && ! r->howto->pcrel_offset) 2412 ov += r->address; 2413 2414 if (! ieee_write_byte (abfd, 2415 ieee_function_either_open_b_enum)) 2416 return false; 2417 2418/* abort();*/ 2419 2420 if (r->sym_ptr_ptr != (asymbol **) NULL) 2421 { 2422 if (! ieee_write_expression (abfd, r->addend + ov, 2423 *(r->sym_ptr_ptr), 2424 r->howto->pc_relative, 2425 s->index)) 2426 return false; 2427 } 2428 else 2429 { 2430 if (! ieee_write_expression (abfd, r->addend + ov, 2431 (asymbol *) NULL, 2432 r->howto->pc_relative, 2433 s->index)) 2434 return false; 2435 } 2436 2437 if (number_of_maus_in_address 2438 != bfd_get_reloc_size (r->howto)) 2439 { 2440 if (! ieee_write_int (abfd, 2441 bfd_get_reloc_size (r->howto))) 2442 return false; 2443 } 2444 if (! ieee_write_byte (abfd, 2445 ieee_function_either_close_b_enum)) 2446 return false; 2447 2448 relocs_to_go--; 2449 p++; 2450 } 2451 2452 } 2453 } 2454 } 2455 2456 return true; 2457} 2458 2459/* If there are no relocations in the output section then we can be 2460 clever about how we write. We block items up into a max of 127 2461 bytes. */ 2462 2463static boolean 2464do_as_repeat (abfd, s) 2465 bfd *abfd; 2466 asection *s; 2467{ 2468 if (s->_raw_size) 2469 { 2470 if (! ieee_write_byte (abfd, ieee_set_current_section_enum) 2471 || ! ieee_write_byte (abfd, 2472 (bfd_byte) (s->index 2473 + IEEE_SECTION_NUMBER_BASE)) 2474 || ! ieee_write_byte (abfd, ieee_set_current_pc_enum >> 8) 2475 || ! ieee_write_byte (abfd, ieee_set_current_pc_enum & 0xff) 2476 || ! ieee_write_byte (abfd, 2477 (bfd_byte) (s->index 2478 + IEEE_SECTION_NUMBER_BASE)) 2479 || ! ieee_write_int (abfd, s->lma) 2480 || ! ieee_write_byte (abfd, ieee_repeat_data_enum) 2481 || ! ieee_write_int (abfd, s->_raw_size) 2482 || ! ieee_write_byte (abfd, ieee_load_constant_bytes_enum) 2483 || ! ieee_write_byte (abfd, 1) 2484 || ! ieee_write_byte (abfd, 0)) 2485 return false; 2486 } 2487 2488 return true; 2489} 2490 2491static boolean 2492do_without_relocs (abfd, s) 2493 bfd *abfd; 2494 asection *s; 2495{ 2496 bfd_byte *stream = ieee_per_section (s)->data; 2497 2498 if (stream == 0 || ((s->flags & SEC_LOAD) == 0)) 2499 { 2500 if (! do_as_repeat (abfd, s)) 2501 return false; 2502 } 2503 else 2504 { 2505 unsigned int i; 2506 for (i = 0; i < s->_raw_size; i++) 2507 { 2508 if (stream[i] != 0) 2509 { 2510 if (! do_with_relocs (abfd, s)) 2511 return false; 2512 return true; 2513 } 2514 } 2515 if (! do_as_repeat (abfd, s)) 2516 return false; 2517 } 2518 2519 return true; 2520} 2521 2522 2523static unsigned char *output_ptr_start; 2524static unsigned char *output_ptr; 2525static unsigned char *output_ptr_end; 2526static unsigned char *input_ptr_start; 2527static unsigned char *input_ptr; 2528static unsigned char *input_ptr_end; 2529static bfd *input_bfd; 2530static bfd *output_bfd; 2531static int output_buffer; 2532 2533static void 2534fill () 2535{ 2536 /* FIXME: Check return value. I'm not sure whether it needs to read 2537 the entire buffer or not. */ 2538 bfd_read ((PTR) input_ptr_start, 1, input_ptr_end - input_ptr_start, input_bfd); 2539 input_ptr = input_ptr_start; 2540} 2541static void 2542flush () 2543{ 2544 if (bfd_write ((PTR) (output_ptr_start), 1, output_ptr - output_ptr_start, 2545 output_bfd) 2546 != (bfd_size_type) (output_ptr - output_ptr_start)) 2547 abort (); 2548 output_ptr = output_ptr_start; 2549 output_buffer++; 2550} 2551 2552#define THIS() ( *input_ptr ) 2553#define NEXT() { input_ptr++; if (input_ptr == input_ptr_end) fill(); } 2554#define OUT(x) { *output_ptr++ = (x); if(output_ptr == output_ptr_end) flush(); } 2555 2556static void 2557write_int (value) 2558 int value; 2559{ 2560 if (value >= 0 && value <= 127) 2561 { 2562 OUT (value); 2563 } 2564 else 2565 { 2566 unsigned int length; 2567 /* How many significant bytes ? */ 2568 /* FIXME FOR LONGER INTS */ 2569 if (value & 0xff000000) 2570 { 2571 length = 4; 2572 } 2573 else if (value & 0x00ff0000) 2574 { 2575 length = 3; 2576 } 2577 else if (value & 0x0000ff00) 2578 { 2579 length = 2; 2580 } 2581 else 2582 length = 1; 2583 2584 OUT ((int) ieee_number_repeat_start_enum + length); 2585 switch (length) 2586 { 2587 case 4: 2588 OUT (value >> 24); 2589 case 3: 2590 OUT (value >> 16); 2591 case 2: 2592 OUT (value >> 8); 2593 case 1: 2594 OUT (value); 2595 } 2596 2597 } 2598} 2599 2600static void 2601copy_id () 2602{ 2603 int length = THIS (); 2604 char ch; 2605 OUT (length); 2606 NEXT (); 2607 while (length--) 2608 { 2609 ch = THIS (); 2610 OUT (ch); 2611 NEXT (); 2612 } 2613} 2614 2615#define VAR(x) ((x | 0x80)) 2616static void 2617copy_expression () 2618{ 2619 int stack[10]; 2620 int *tos = stack; 2621 int value = 0; 2622 while (1) 2623 { 2624 switch (THIS ()) 2625 { 2626 case 0x84: 2627 NEXT (); 2628 value = THIS (); 2629 NEXT (); 2630 value = (value << 8) | THIS (); 2631 NEXT (); 2632 value = (value << 8) | THIS (); 2633 NEXT (); 2634 value = (value << 8) | THIS (); 2635 NEXT (); 2636 *tos++ = value; 2637 break; 2638 case 0x83: 2639 NEXT (); 2640 value = THIS (); 2641 NEXT (); 2642 value = (value << 8) | THIS (); 2643 NEXT (); 2644 value = (value << 8) | THIS (); 2645 NEXT (); 2646 *tos++ = value; 2647 break; 2648 case 0x82: 2649 NEXT (); 2650 value = THIS (); 2651 NEXT (); 2652 value = (value << 8) | THIS (); 2653 NEXT (); 2654 *tos++ = value; 2655 break; 2656 case 0x81: 2657 NEXT (); 2658 value = THIS (); 2659 NEXT (); 2660 *tos++ = value; 2661 break; 2662 case 0x80: 2663 NEXT (); 2664 *tos++ = 0; 2665 break; 2666 default: 2667 if (THIS () > 0x84) 2668 { 2669 /* Not a number, just bug out with the answer */ 2670 write_int (*(--tos)); 2671 return; 2672 } 2673 *tos++ = THIS (); 2674 NEXT (); 2675 value = 0; 2676 break; 2677 case 0xa5: 2678 /* PLUS anything */ 2679 { 2680 int value = *(--tos); 2681 value += *(--tos); 2682 *tos++ = value; 2683 NEXT (); 2684 } 2685 break; 2686 case VAR ('R'): 2687 { 2688 int section_number; 2689 ieee_data_type *ieee; 2690 asection *s; 2691 NEXT (); 2692 section_number = THIS (); 2693 2694 NEXT (); 2695 ieee = IEEE_DATA (input_bfd); 2696 s = ieee->section_table[section_number]; 2697 if (s->output_section) 2698 { 2699 value = s->output_section->lma; 2700 } 2701 else 2702 { 2703 value = 0; 2704 } 2705 value += s->output_offset; 2706 *tos++ = value; 2707 value = 0; 2708 } 2709 break; 2710 case 0x90: 2711 { 2712 NEXT (); 2713 write_int (*(--tos)); 2714 OUT (0x90); 2715 return; 2716 2717 } 2718 } 2719 } 2720 2721} 2722 2723/* Drop the int in the buffer, and copy a null into the gap, which we 2724 will overwrite later */ 2725 2726struct output_buffer_struct 2727{ 2728 unsigned char *ptrp; 2729 int buffer; 2730}; 2731 2732static void 2733fill_int (buf) 2734 struct output_buffer_struct *buf; 2735{ 2736 if (buf->buffer == output_buffer) 2737 { 2738 /* Still a chance to output the size */ 2739 int value = output_ptr - buf->ptrp + 3; 2740 buf->ptrp[0] = value >> 24; 2741 buf->ptrp[1] = value >> 16; 2742 buf->ptrp[2] = value >> 8; 2743 buf->ptrp[3] = value >> 0; 2744 } 2745} 2746 2747static void 2748drop_int (buf) 2749 struct output_buffer_struct *buf; 2750{ 2751 int type = THIS (); 2752 int ch; 2753 if (type <= 0x84) 2754 { 2755 NEXT (); 2756 switch (type) 2757 { 2758 case 0x84: 2759 ch = THIS (); 2760 NEXT (); 2761 case 0x83: 2762 ch = THIS (); 2763 NEXT (); 2764 case 0x82: 2765 ch = THIS (); 2766 NEXT (); 2767 case 0x81: 2768 ch = THIS (); 2769 NEXT (); 2770 case 0x80: 2771 break; 2772 } 2773 } 2774 OUT (0x84); 2775 buf->ptrp = output_ptr; 2776 buf->buffer = output_buffer; 2777 OUT (0); 2778 OUT (0); 2779 OUT (0); 2780 OUT (0); 2781} 2782 2783static void 2784copy_int () 2785{ 2786 int type = THIS (); 2787 int ch; 2788 if (type <= 0x84) 2789 { 2790 OUT (type); 2791 NEXT (); 2792 switch (type) 2793 { 2794 case 0x84: 2795 ch = THIS (); 2796 NEXT (); 2797 OUT (ch); 2798 case 0x83: 2799 ch = THIS (); 2800 NEXT (); 2801 OUT (ch); 2802 case 0x82: 2803 ch = THIS (); 2804 NEXT (); 2805 OUT (ch); 2806 case 0x81: 2807 ch = THIS (); 2808 NEXT (); 2809 OUT (ch); 2810 case 0x80: 2811 break; 2812 } 2813 } 2814} 2815 2816#define ID copy_id() 2817#define INT copy_int() 2818#define EXP copy_expression() 2819static void copy_till_end (); 2820#define INTn(q) copy_int() 2821#define EXPn(q) copy_expression() 2822 2823static void 2824f1_record () 2825{ 2826 int ch; 2827 /* ATN record */ 2828 NEXT (); 2829 ch = THIS (); 2830 switch (ch) 2831 { 2832 default: 2833 OUT (0xf1); 2834 OUT (ch); 2835 break; 2836 case 0xc9: 2837 NEXT (); 2838 OUT (0xf1); 2839 OUT (0xc9); 2840 INT; 2841 INT; 2842 ch = THIS (); 2843 switch (ch) 2844 { 2845 case 0x16: 2846 NEXT (); 2847 break; 2848 case 0x01: 2849 NEXT (); 2850 break; 2851 case 0x00: 2852 NEXT (); 2853 INT; 2854 break; 2855 case 0x03: 2856 NEXT (); 2857 INT; 2858 break; 2859 case 0x13: 2860 EXPn (instruction address); 2861 break; 2862 default: 2863 break; 2864 } 2865 break; 2866 case 0xd8: 2867 /* EXternal ref */ 2868 NEXT (); 2869 OUT (0xf1); 2870 OUT (0xd8); 2871 EXP; 2872 EXP; 2873 EXP; 2874 EXP; 2875 break; 2876 case 0xce: 2877 NEXT (); 2878 OUT (0xf1); 2879 OUT (0xce); 2880 INT; 2881 INT; 2882 ch = THIS (); 2883 INT; 2884 switch (ch) 2885 { 2886 case 0x01: 2887 INT; 2888 INT; 2889 break; 2890 case 0x02: 2891 INT; 2892 break; 2893 case 0x04: 2894 EXPn (external function); 2895 break; 2896 case 0x05: 2897 break; 2898 case 0x07: 2899 INTn (line number); 2900 INT; 2901 case 0x08: 2902 break; 2903 case 0x0a: 2904 INTn (locked register); 2905 INT; 2906 break; 2907 case 0x3f: 2908 copy_till_end (); 2909 break; 2910 case 0x3e: 2911 copy_till_end (); 2912 break; 2913 case 0x40: 2914 copy_till_end (); 2915 break; 2916 case 0x41: 2917 ID; 2918 break; 2919 } 2920 } 2921 2922} 2923 2924static void 2925f0_record () 2926{ 2927 /* Attribute record */ 2928 NEXT (); 2929 OUT (0xf0); 2930 INTn (Symbol name); 2931 ID; 2932} 2933 2934static void 2935copy_till_end () 2936{ 2937 int ch = THIS (); 2938 while (1) 2939 { 2940 while (ch <= 0x80) 2941 { 2942 OUT (ch); 2943 NEXT (); 2944 ch = THIS (); 2945 } 2946 switch (ch) 2947 { 2948 case 0x84: 2949 OUT (THIS ()); 2950 NEXT (); 2951 case 0x83: 2952 OUT (THIS ()); 2953 NEXT (); 2954 case 0x82: 2955 OUT (THIS ()); 2956 NEXT (); 2957 case 0x81: 2958 OUT (THIS ()); 2959 NEXT (); 2960 OUT (THIS ()); 2961 NEXT (); 2962 2963 ch = THIS (); 2964 break; 2965 default: 2966 return; 2967 } 2968 } 2969 2970} 2971 2972static void 2973f2_record () 2974{ 2975 NEXT (); 2976 OUT (0xf2); 2977 INT; 2978 NEXT (); 2979 OUT (0xce); 2980 INT; 2981 copy_till_end (); 2982} 2983 2984 2985static void block (); 2986static void 2987f8_record () 2988{ 2989 int ch; 2990 NEXT (); 2991 ch = THIS (); 2992 switch (ch) 2993 { 2994 case 0x01: 2995 case 0x02: 2996 case 0x03: 2997 /* Unique typedefs for module */ 2998 /* GLobal typedefs */ 2999 /* High level module scope beginning */ 3000 { 3001 struct output_buffer_struct ob; 3002 NEXT (); 3003 OUT (0xf8); 3004 OUT (ch); 3005 drop_int (&ob); 3006 ID; 3007 3008 block (); 3009 3010 NEXT (); 3011 fill_int (&ob); 3012 OUT (0xf9); 3013 } 3014 break; 3015 case 0x04: 3016 /* Global function */ 3017 { 3018 struct output_buffer_struct ob; 3019 NEXT (); 3020 OUT (0xf8); 3021 OUT (0x04); 3022 drop_int (&ob); 3023 ID; 3024 INTn (stack size); 3025 INTn (ret val); 3026 EXPn (offset); 3027 3028 block (); 3029 3030 NEXT (); 3031 OUT (0xf9); 3032 EXPn (size of block); 3033 fill_int (&ob); 3034 } 3035 break; 3036 3037 case 0x05: 3038 /* File name for source line numbers */ 3039 { 3040 struct output_buffer_struct ob; 3041 NEXT (); 3042 OUT (0xf8); 3043 OUT (0x05); 3044 drop_int (&ob); 3045 ID; 3046 INTn (year); 3047 INTn (month); 3048 INTn (day); 3049 INTn (hour); 3050 INTn (monute); 3051 INTn (second); 3052 block (); 3053 NEXT (); 3054 OUT (0xf9); 3055 fill_int (&ob); 3056 } 3057 break; 3058 3059 case 0x06: 3060 /* Local function */ 3061 { 3062 struct output_buffer_struct ob; 3063 NEXT (); 3064 OUT (0xf8); 3065 OUT (0x06); 3066 drop_int (&ob); 3067 ID; 3068 INTn (stack size); 3069 INTn (type return); 3070 EXPn (offset); 3071 block (); 3072 NEXT (); 3073 OUT (0xf9); 3074 EXPn (size); 3075 fill_int (&ob); 3076 } 3077 break; 3078 3079 case 0x0a: 3080 /* Assembler module scope beginning -*/ 3081 { 3082 struct output_buffer_struct ob; 3083 3084 NEXT (); 3085 OUT (0xf8); 3086 OUT (0x0a); 3087 drop_int (&ob); 3088 ID; 3089 ID; 3090 INT; 3091 ID; 3092 INT; 3093 INT; 3094 INT; 3095 INT; 3096 INT; 3097 INT; 3098 3099 block (); 3100 3101 NEXT (); 3102 OUT (0xf9); 3103 fill_int (&ob); 3104 } 3105 break; 3106 case 0x0b: 3107 { 3108 struct output_buffer_struct ob; 3109 NEXT (); 3110 OUT (0xf8); 3111 OUT (0x0b); 3112 drop_int (&ob); 3113 ID; 3114 INT; 3115 INTn (section index); 3116 EXPn (offset); 3117 INTn (stuff); 3118 3119 block (); 3120 3121 OUT (0xf9); 3122 NEXT (); 3123 EXPn (Size in Maus); 3124 fill_int (&ob); 3125 } 3126 break; 3127 } 3128} 3129 3130static void 3131e2_record () 3132{ 3133 OUT (0xe2); 3134 NEXT (); 3135 OUT (0xce); 3136 NEXT (); 3137 INT; 3138 EXP; 3139} 3140 3141static void 3142block () 3143{ 3144 int ch; 3145 while (1) 3146 { 3147 ch = THIS (); 3148 switch (ch) 3149 { 3150 case 0xe1: 3151 case 0xe5: 3152 return; 3153 case 0xf9: 3154 return; 3155 case 0xf0: 3156 f0_record (); 3157 break; 3158 case 0xf1: 3159 f1_record (); 3160 break; 3161 case 0xf2: 3162 f2_record (); 3163 break; 3164 case 0xf8: 3165 f8_record (); 3166 break; 3167 case 0xe2: 3168 e2_record (); 3169 break; 3170 3171 } 3172 } 3173} 3174 3175 3176 3177/* relocate_debug, 3178 moves all the debug information from the source bfd to the output 3179 bfd, and relocates any expressions it finds 3180*/ 3181 3182static void 3183relocate_debug (output, input) 3184 bfd *output ATTRIBUTE_UNUSED; 3185 bfd *input; 3186{ 3187#define IBS 400 3188#define OBS 400 3189 unsigned char input_buffer[IBS]; 3190 3191 input_ptr_start = input_ptr = input_buffer; 3192 input_ptr_end = input_buffer + IBS; 3193 input_bfd = input; 3194 /* FIXME: Check return value. I'm not sure whether it needs to read 3195 the entire buffer or not. */ 3196 bfd_read ((PTR) input_ptr_start, 1, IBS, input); 3197 block (); 3198} 3199 3200/* 3201 During linking, we we told about the bfds which made up our 3202 contents, we have a list of them. They will still be open, so go to 3203 the debug info in each, and copy it out, relocating it as we go. 3204*/ 3205 3206static boolean 3207ieee_write_debug_part (abfd) 3208 bfd *abfd; 3209{ 3210 ieee_data_type *ieee = IEEE_DATA (abfd); 3211 bfd_chain_type *chain = ieee->chain_root; 3212 unsigned char output_buffer[OBS]; 3213 boolean some_debug = false; 3214 file_ptr here = bfd_tell (abfd); 3215 3216 output_ptr_start = output_ptr = output_buffer; 3217 output_ptr_end = output_buffer + OBS; 3218 output_ptr = output_buffer; 3219 output_bfd = abfd; 3220 3221 if (chain == (bfd_chain_type *) NULL) 3222 { 3223 asection *s; 3224 3225 for (s = abfd->sections; s != NULL; s = s->next) 3226 if ((s->flags & SEC_DEBUGGING) != 0) 3227 break; 3228 if (s == NULL) 3229 { 3230 ieee->w.r.debug_information_part = 0; 3231 return true; 3232 } 3233 3234 ieee->w.r.debug_information_part = here; 3235 if (bfd_write (s->contents, 1, s->_raw_size, abfd) != s->_raw_size) 3236 return false; 3237 } 3238 else 3239 { 3240 while (chain != (bfd_chain_type *) NULL) 3241 { 3242 bfd *entry = chain->this; 3243 ieee_data_type *entry_ieee = IEEE_DATA (entry); 3244 if (entry_ieee->w.r.debug_information_part) 3245 { 3246 if (bfd_seek (entry, entry_ieee->w.r.debug_information_part, 3247 SEEK_SET) 3248 != 0) 3249 return false; 3250 relocate_debug (abfd, entry); 3251 } 3252 3253 chain = chain->next; 3254 } 3255 if (some_debug) 3256 { 3257 ieee->w.r.debug_information_part = here; 3258 } 3259 else 3260 { 3261 ieee->w.r.debug_information_part = 0; 3262 } 3263 3264 flush (); 3265 } 3266 3267 return true; 3268} 3269 3270/* Write the data in an ieee way. */ 3271 3272static boolean 3273ieee_write_data_part (abfd) 3274 bfd *abfd; 3275{ 3276 asection *s; 3277 ieee_data_type *ieee = IEEE_DATA (abfd); 3278 ieee->w.r.data_part = bfd_tell (abfd); 3279 for (s = abfd->sections; s != (asection *) NULL; s = s->next) 3280 { 3281 /* Skip sections that have no loadable contents (.bss, 3282 debugging, etc.) */ 3283 if ((s->flags & SEC_LOAD) == 0) 3284 continue; 3285 3286 /* Sort the reloc records so we can insert them in the correct 3287 places */ 3288 if (s->reloc_count != 0) 3289 { 3290 if (! do_with_relocs (abfd, s)) 3291 return false; 3292 } 3293 else 3294 { 3295 if (! do_without_relocs (abfd, s)) 3296 return false; 3297 } 3298 } 3299 3300 return true; 3301} 3302 3303 3304static boolean 3305init_for_output (abfd) 3306 bfd *abfd; 3307{ 3308 asection *s; 3309 for (s = abfd->sections; s != (asection *) NULL; s = s->next) 3310 { 3311 if ((s->flags & SEC_DEBUGGING) != 0) 3312 continue; 3313 if (s->_raw_size != 0) 3314 { 3315 ieee_per_section (s)->data = (bfd_byte *) (bfd_alloc (abfd, s->_raw_size)); 3316 if (!ieee_per_section (s)->data) 3317 return false; 3318 } 3319 } 3320 return true; 3321} 3322 3323/** exec and core file sections */ 3324 3325/* set section contents is complicated with IEEE since the format is 3326* not a byte image, but a record stream. 3327*/ 3328boolean 3329ieee_set_section_contents (abfd, section, location, offset, count) 3330 bfd *abfd; 3331 sec_ptr section; 3332 PTR location; 3333 file_ptr offset; 3334 bfd_size_type count; 3335{ 3336 if ((section->flags & SEC_DEBUGGING) != 0) 3337 { 3338 if (section->contents == NULL) 3339 { 3340 section->contents = ((unsigned char *) 3341 bfd_alloc (abfd, section->_raw_size)); 3342 if (section->contents == NULL) 3343 return false; 3344 } 3345 /* bfd_set_section_contents has already checked that everything 3346 is within range. */ 3347 memcpy (section->contents + offset, location, count); 3348 return true; 3349 } 3350 3351 if (ieee_per_section (section)->data == (bfd_byte *) NULL) 3352 { 3353 if (!init_for_output (abfd)) 3354 return false; 3355 } 3356 memcpy ((PTR) (ieee_per_section (section)->data + offset), 3357 (PTR) location, 3358 (unsigned int) count); 3359 return true; 3360} 3361 3362/* Write the external symbols of a file. IEEE considers two sorts of 3363 external symbols, public, and referenced. It uses to internal 3364 forms to index them as well. When we write them out we turn their 3365 symbol values into indexes from the right base. */ 3366 3367static boolean 3368ieee_write_external_part (abfd) 3369 bfd *abfd; 3370{ 3371 asymbol **q; 3372 ieee_data_type *ieee = IEEE_DATA (abfd); 3373 3374 unsigned int reference_index = IEEE_REFERENCE_BASE; 3375 unsigned int public_index = IEEE_PUBLIC_BASE + 2; 3376 file_ptr here = bfd_tell (abfd); 3377 boolean hadone = false; 3378 if (abfd->outsymbols != (asymbol **) NULL) 3379 { 3380 3381 for (q = abfd->outsymbols; *q != (asymbol *) NULL; q++) 3382 { 3383 asymbol *p = *q; 3384 if (bfd_is_und_section (p->section)) 3385 { 3386 /* This must be a symbol reference .. */ 3387 if (! ieee_write_byte (abfd, ieee_external_reference_enum) 3388 || ! ieee_write_int (abfd, reference_index) 3389 || ! ieee_write_id (abfd, p->name)) 3390 return false; 3391 p->value = reference_index; 3392 reference_index++; 3393 hadone = true; 3394 } 3395 else if (bfd_is_com_section (p->section)) 3396 { 3397 /* This is a weak reference */ 3398 if (! ieee_write_byte (abfd, ieee_external_reference_enum) 3399 || ! ieee_write_int (abfd, reference_index) 3400 || ! ieee_write_id (abfd, p->name) 3401 || ! ieee_write_byte (abfd, 3402 ieee_weak_external_reference_enum) 3403 || ! ieee_write_int (abfd, reference_index) 3404 || ! ieee_write_int (abfd, p->value)) 3405 return false; 3406 p->value = reference_index; 3407 reference_index++; 3408 hadone = true; 3409 } 3410 else if (p->flags & BSF_GLOBAL) 3411 { 3412 /* This must be a symbol definition */ 3413 3414 if (! ieee_write_byte (abfd, ieee_external_symbol_enum) 3415 || ! ieee_write_int (abfd, public_index) 3416 || ! ieee_write_id (abfd, p->name) 3417 || ! ieee_write_2bytes (abfd, ieee_attribute_record_enum) 3418 || ! ieee_write_int (abfd, public_index) 3419 || ! ieee_write_byte (abfd, 15) /* instruction address */ 3420 || ! ieee_write_byte (abfd, 19) /* static symbol */ 3421 || ! ieee_write_byte (abfd, 1)) /* one of them */ 3422 return false; 3423 3424 /* Write out the value */ 3425 if (! ieee_write_2bytes (abfd, ieee_value_record_enum) 3426 || ! ieee_write_int (abfd, public_index)) 3427 return false; 3428 if (! bfd_is_abs_section (p->section)) 3429 { 3430 if (abfd->flags & EXEC_P) 3431 { 3432 /* If fully linked, then output all symbols 3433 relocated */ 3434 if (! (ieee_write_int 3435 (abfd, 3436 (p->value 3437 + p->section->output_offset 3438 + p->section->output_section->vma)))) 3439 return false; 3440 } 3441 else 3442 { 3443 if (! (ieee_write_expression 3444 (abfd, 3445 p->value + p->section->output_offset, 3446 p->section->output_section->symbol, 3447 false, 0))) 3448 return false; 3449 } 3450 } 3451 else 3452 { 3453 if (! ieee_write_expression (abfd, 3454 p->value, 3455 bfd_abs_section_ptr->symbol, 3456 false, 0)) 3457 return false; 3458 } 3459 p->value = public_index; 3460 public_index++; 3461 hadone = true; 3462 } 3463 else 3464 { 3465 /* This can happen - when there are gaps in the symbols read */ 3466 /* from an input ieee file */ 3467 } 3468 } 3469 } 3470 if (hadone) 3471 ieee->w.r.external_part = here; 3472 3473 return true; 3474} 3475 3476 3477static CONST unsigned char exten[] = 3478{ 3479 0xf0, 0x20, 0x00, 3480 0xf1, 0xce, 0x20, 0x00, 37, 3, 3, /* Set version 3 rev 3 */ 3481 0xf1, 0xce, 0x20, 0x00, 39, 2,/* keep symbol in original case */ 3482 0xf1, 0xce, 0x20, 0x00, 38 /* set object type relocateable to x */ 3483}; 3484 3485static CONST unsigned char envi[] = 3486{ 3487 0xf0, 0x21, 0x00, 3488 3489/* 0xf1, 0xce, 0x21, 00, 50, 0x82, 0x07, 0xc7, 0x09, 0x11, 0x11, 3490 0x19, 0x2c, 3491*/ 3492 0xf1, 0xce, 0x21, 00, 52, 0x00, /* exec ok */ 3493 3494 0xf1, 0xce, 0x21, 0, 53, 0x03,/* host unix */ 3495/* 0xf1, 0xce, 0x21, 0, 54, 2,1,1 tool & version # */ 3496}; 3497 3498static boolean 3499ieee_write_me_part (abfd) 3500 bfd *abfd; 3501{ 3502 ieee_data_type *ieee = IEEE_DATA (abfd); 3503 ieee->w.r.trailer_part = bfd_tell (abfd); 3504 if (abfd->start_address) 3505 { 3506 if (! ieee_write_2bytes (abfd, ieee_value_starting_address_enum) 3507 || ! ieee_write_byte (abfd, ieee_function_either_open_b_enum) 3508 || ! ieee_write_int (abfd, abfd->start_address) 3509 || ! ieee_write_byte (abfd, ieee_function_either_close_b_enum)) 3510 return false; 3511 } 3512 ieee->w.r.me_record = bfd_tell (abfd); 3513 if (! ieee_write_byte (abfd, ieee_module_end_enum)) 3514 return false; 3515 return true; 3516} 3517 3518/* Write out the IEEE processor ID. */ 3519 3520static boolean 3521ieee_write_processor (abfd) 3522 bfd *abfd; 3523{ 3524 const bfd_arch_info_type *arch; 3525 3526 arch = bfd_get_arch_info (abfd); 3527 switch (arch->arch) 3528 { 3529 default: 3530 if (! ieee_write_id (abfd, bfd_printable_name (abfd))) 3531 return false; 3532 break; 3533 3534 case bfd_arch_a29k: 3535 if (! ieee_write_id (abfd, "29000")) 3536 return false; 3537 break; 3538 3539 case bfd_arch_h8300: 3540 if (! ieee_write_id (abfd, "H8/300")) 3541 return false; 3542 break; 3543 3544 case bfd_arch_h8500: 3545 if (! ieee_write_id (abfd, "H8/500")) 3546 return false; 3547 break; 3548 3549 case bfd_arch_i960: 3550 switch (arch->mach) 3551 { 3552 default: 3553 case bfd_mach_i960_core: 3554 case bfd_mach_i960_ka_sa: 3555 if (! ieee_write_id (abfd, "80960KA")) 3556 return false; 3557 break; 3558 3559 case bfd_mach_i960_kb_sb: 3560 if (! ieee_write_id (abfd, "80960KB")) 3561 return false; 3562 break; 3563 3564 case bfd_mach_i960_ca: 3565 if (! ieee_write_id (abfd, "80960CA")) 3566 return false; 3567 break; 3568 3569 case bfd_mach_i960_mc: 3570 case bfd_mach_i960_xa: 3571 if (! ieee_write_id (abfd, "80960MC")) 3572 return false; 3573 break; 3574 } 3575 break; 3576 3577 case bfd_arch_m68k: 3578 { 3579 const char *id; 3580 3581 switch (arch->mach) 3582 { 3583 default: id = "68020"; break; 3584 case bfd_mach_m68000: id = "68000"; break; 3585 case bfd_mach_m68008: id = "68008"; break; 3586 case bfd_mach_m68010: id = "68010"; break; 3587 case bfd_mach_m68020: id = "68020"; break; 3588 case bfd_mach_m68030: id = "68030"; break; 3589 case bfd_mach_m68040: id = "68040"; break; 3590 case bfd_mach_m68060: id = "68060"; break; 3591 case bfd_mach_cpu32: id = "cpu32"; break; 3592 } 3593 3594 if (! ieee_write_id (abfd, id)) 3595 return false; 3596 } 3597 break; 3598 } 3599 3600 return true; 3601} 3602 3603boolean 3604ieee_write_object_contents (abfd) 3605 bfd *abfd; 3606{ 3607 ieee_data_type *ieee = IEEE_DATA (abfd); 3608 unsigned int i; 3609 file_ptr old; 3610 3611 /* Fast forward over the header area */ 3612 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) 3613 return false; 3614 3615 if (! ieee_write_byte (abfd, ieee_module_beginning_enum) 3616 || ! ieee_write_processor (abfd) 3617 || ! ieee_write_id (abfd, abfd->filename)) 3618 return false; 3619 3620 /* Fast forward over the variable bits */ 3621 if (! ieee_write_byte (abfd, ieee_address_descriptor_enum)) 3622 return false; 3623 3624 /* Bits per MAU */ 3625 if (! ieee_write_byte (abfd, (bfd_byte) (bfd_arch_bits_per_byte (abfd)))) 3626 return false; 3627 /* MAU's per address */ 3628 if (! ieee_write_byte (abfd, 3629 (bfd_byte) (bfd_arch_bits_per_address (abfd) 3630 / bfd_arch_bits_per_byte (abfd)))) 3631 return false; 3632 3633 old = bfd_tell (abfd); 3634 if (bfd_seek (abfd, (file_ptr) (8 * N_W_VARIABLES), SEEK_CUR) != 0) 3635 return false; 3636 3637 ieee->w.r.extension_record = bfd_tell (abfd); 3638 if (bfd_write ((char *) exten, 1, sizeof (exten), abfd) != sizeof (exten)) 3639 return false; 3640 if (abfd->flags & EXEC_P) 3641 { 3642 if (! ieee_write_byte (abfd, 0x1)) /* Absolute */ 3643 return false; 3644 } 3645 else 3646 { 3647 if (! ieee_write_byte (abfd, 0x2)) /* Relocateable */ 3648 return false; 3649 } 3650 3651 ieee->w.r.environmental_record = bfd_tell (abfd); 3652 if (bfd_write ((char *) envi, 1, sizeof (envi), abfd) != sizeof (envi)) 3653 return false; 3654 3655 /* The HP emulator database requires a timestamp in the file. */ 3656 { 3657 time_t now; 3658 const struct tm *t; 3659 3660 time (&now); 3661 t = (struct tm *) localtime (&now); 3662 if (! ieee_write_2bytes (abfd, (int) ieee_atn_record_enum) 3663 || ! ieee_write_byte (abfd, 0x21) 3664 || ! ieee_write_byte (abfd, 0) 3665 || ! ieee_write_byte (abfd, 50) 3666 || ! ieee_write_int (abfd, t->tm_year + 1900) 3667 || ! ieee_write_int (abfd, t->tm_mon + 1) 3668 || ! ieee_write_int (abfd, t->tm_mday) 3669 || ! ieee_write_int (abfd, t->tm_hour) 3670 || ! ieee_write_int (abfd, t->tm_min) 3671 || ! ieee_write_int (abfd, t->tm_sec)) 3672 return false; 3673 } 3674 3675 output_bfd = abfd; 3676 3677 flush (); 3678 3679 if (! ieee_write_section_part (abfd)) 3680 return false; 3681 /* First write the symbols. This changes their values into table 3682 indeces so we cant use it after this point. */ 3683 if (! ieee_write_external_part (abfd)) 3684 return false; 3685 3686 /* ieee_write_byte(abfd, ieee_record_seperator_enum);*/ 3687 3688 /* ieee_write_byte(abfd, ieee_record_seperator_enum);*/ 3689 3690 3691 /* Write any debugs we have been told about. */ 3692 if (! ieee_write_debug_part (abfd)) 3693 return false; 3694 3695 /* Can only write the data once the symbols have been written, since 3696 the data contains relocation information which points to the 3697 symbols. */ 3698 if (! ieee_write_data_part (abfd)) 3699 return false; 3700 3701 /* At the end we put the end! */ 3702 if (! ieee_write_me_part (abfd)) 3703 return false; 3704 3705 /* Generate the header */ 3706 if (bfd_seek (abfd, old, SEEK_SET) != 0) 3707 return false; 3708 3709 for (i = 0; i < N_W_VARIABLES; i++) 3710 { 3711 if (! ieee_write_2bytes (abfd, ieee_assign_value_to_variable_enum) 3712 || ! ieee_write_byte (abfd, (bfd_byte) i) 3713 || ! ieee_write_int5_out (abfd, ieee->w.offset[i])) 3714 return false; 3715 } 3716 3717 return true; 3718} 3719 3720/* Native-level interface to symbols. */ 3721 3722/* We read the symbols into a buffer, which is discarded when this 3723 function exits. We read the strings into a buffer large enough to 3724 hold them all plus all the cached symbol entries. */ 3725 3726asymbol * 3727ieee_make_empty_symbol (abfd) 3728 bfd *abfd; 3729{ 3730 ieee_symbol_type *new = 3731 (ieee_symbol_type *) bfd_zmalloc (sizeof (ieee_symbol_type)); 3732 if (!new) 3733 return NULL; 3734 new->symbol.the_bfd = abfd; 3735 return &new->symbol; 3736} 3737 3738static bfd * 3739ieee_openr_next_archived_file (arch, prev) 3740 bfd *arch; 3741 bfd *prev; 3742{ 3743 ieee_ar_data_type *ar = IEEE_AR_DATA (arch); 3744 /* take the next one from the arch state, or reset */ 3745 if (prev == (bfd *) NULL) 3746 { 3747 /* Reset the index - the first two entries are bogus*/ 3748 ar->element_index = 2; 3749 } 3750 while (true) 3751 { 3752 ieee_ar_obstack_type *p = ar->elements + ar->element_index; 3753 ar->element_index++; 3754 if (ar->element_index <= ar->element_count) 3755 { 3756 if (p->file_offset != (file_ptr) 0) 3757 { 3758 if (p->abfd == (bfd *) NULL) 3759 { 3760 p->abfd = _bfd_create_empty_archive_element_shell (arch); 3761 p->abfd->origin = p->file_offset; 3762 } 3763 return p->abfd; 3764 } 3765 } 3766 else 3767 { 3768 bfd_set_error (bfd_error_no_more_archived_files); 3769 return (bfd *) NULL; 3770 } 3771 3772 } 3773} 3774 3775static boolean 3776ieee_find_nearest_line (abfd, 3777 section, 3778 symbols, 3779 offset, 3780 filename_ptr, 3781 functionname_ptr, 3782 line_ptr) 3783 bfd *abfd ATTRIBUTE_UNUSED; 3784 asection *section ATTRIBUTE_UNUSED; 3785 asymbol **symbols ATTRIBUTE_UNUSED; 3786 bfd_vma offset ATTRIBUTE_UNUSED; 3787 const char **filename_ptr ATTRIBUTE_UNUSED; 3788 const char **functionname_ptr ATTRIBUTE_UNUSED; 3789 unsigned int *line_ptr ATTRIBUTE_UNUSED; 3790{ 3791 return false; 3792} 3793 3794static int 3795ieee_generic_stat_arch_elt (abfd, buf) 3796 bfd *abfd; 3797 struct stat *buf; 3798{ 3799 ieee_ar_data_type *ar = (ieee_ar_data_type *) NULL; 3800 ieee_data_type *ieee; 3801 3802 if (abfd->my_archive != NULL) 3803 ar = abfd->my_archive->tdata.ieee_ar_data; 3804 if (ar == (ieee_ar_data_type *) NULL) 3805 { 3806 bfd_set_error (bfd_error_invalid_operation); 3807 return -1; 3808 } 3809 3810 if (IEEE_DATA (abfd) == NULL) 3811 { 3812 if (ieee_object_p (abfd) == NULL) 3813 { 3814 bfd_set_error (bfd_error_wrong_format); 3815 return -1; 3816 } 3817 } 3818 3819 ieee = IEEE_DATA (abfd); 3820 3821 buf->st_size = ieee->w.r.me_record + 1; 3822 buf->st_mode = 0644; 3823 return 0; 3824} 3825 3826static int 3827ieee_sizeof_headers (abfd, x) 3828 bfd *abfd ATTRIBUTE_UNUSED; 3829 boolean x ATTRIBUTE_UNUSED; 3830{ 3831 return 0; 3832} 3833 3834 3835/* The debug info routines are never used. */ 3836#if 0 3837 3838static void 3839ieee_bfd_debug_info_start (abfd) 3840 bfd *abfd; 3841{ 3842 3843} 3844 3845static void 3846ieee_bfd_debug_info_end (abfd) 3847 bfd *abfd; 3848{ 3849 3850} 3851 3852 3853/* Add this section to the list of sections we have debug info for, to 3854 be ready to output it at close time 3855 */ 3856static void 3857ieee_bfd_debug_info_accumulate (abfd, section) 3858 bfd *abfd; 3859 asection *section; 3860{ 3861 ieee_data_type *ieee = IEEE_DATA (section->owner); 3862 ieee_data_type *output_ieee = IEEE_DATA (abfd); 3863 /* can only accumulate data from other ieee bfds */ 3864 if (section->owner->xvec != abfd->xvec) 3865 return; 3866 /* Only bother once per bfd */ 3867 if (ieee->done_debug == true) 3868 return; 3869 ieee->done_debug = true; 3870 3871 /* Don't bother if there is no debug info */ 3872 if (ieee->w.r.debug_information_part == 0) 3873 return; 3874 3875 3876 /* Add to chain */ 3877 { 3878 bfd_chain_type *n = (bfd_chain_type *) bfd_alloc (abfd, sizeof (bfd_chain_type)); 3879 if (!n) 3880 abort (); /* FIXME */ 3881 n->this = section->owner; 3882 n->next = (bfd_chain_type *) NULL; 3883 3884 if (output_ieee->chain_head) 3885 { 3886 output_ieee->chain_head->next = n; 3887 } 3888 else 3889 { 3890 output_ieee->chain_root = n; 3891 3892 } 3893 output_ieee->chain_head = n; 3894 } 3895} 3896 3897#endif 3898 3899#define ieee_close_and_cleanup _bfd_generic_close_and_cleanup 3900#define ieee_bfd_free_cached_info _bfd_generic_bfd_free_cached_info 3901 3902#define ieee_slurp_armap bfd_true 3903#define ieee_slurp_extended_name_table bfd_true 3904#define ieee_construct_extended_name_table \ 3905 ((boolean (*) PARAMS ((bfd *, char **, bfd_size_type *, const char **))) \ 3906 bfd_true) 3907#define ieee_truncate_arname bfd_dont_truncate_arname 3908#define ieee_write_armap \ 3909 ((boolean (*) \ 3910 PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int))) \ 3911 bfd_true) 3912#define ieee_read_ar_hdr bfd_nullvoidptr 3913#define ieee_update_armap_timestamp bfd_true 3914#define ieee_get_elt_at_index _bfd_generic_get_elt_at_index 3915 3916#define ieee_bfd_is_local_label_name bfd_generic_is_local_label_name 3917#define ieee_get_lineno _bfd_nosymbols_get_lineno 3918#define ieee_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol 3919#define ieee_read_minisymbols _bfd_generic_read_minisymbols 3920#define ieee_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol 3921 3922#define ieee_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup 3923 3924#define ieee_set_arch_mach _bfd_generic_set_arch_mach 3925 3926#define ieee_get_section_contents_in_window \ 3927 _bfd_generic_get_section_contents_in_window 3928#define ieee_bfd_get_relocated_section_contents \ 3929 bfd_generic_get_relocated_section_contents 3930#define ieee_bfd_relax_section bfd_generic_relax_section 3931#define ieee_bfd_gc_sections bfd_generic_gc_sections 3932#define ieee_bfd_link_hash_table_create _bfd_generic_link_hash_table_create 3933#define ieee_bfd_link_add_symbols _bfd_generic_link_add_symbols 3934#define ieee_bfd_final_link _bfd_generic_final_link 3935#define ieee_bfd_link_split_section _bfd_generic_link_split_section 3936 3937/*SUPPRESS 460 */ 3938const bfd_target ieee_vec = 3939{ 3940 "ieee", /* name */ 3941 bfd_target_ieee_flavour, 3942 BFD_ENDIAN_UNKNOWN, /* target byte order */ 3943 BFD_ENDIAN_UNKNOWN, /* target headers byte order */ 3944 (HAS_RELOC | EXEC_P | /* object flags */ 3945 HAS_LINENO | HAS_DEBUG | 3946 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), 3947 (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS 3948 | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ 3949 '_', /* leading underscore */ 3950 ' ', /* ar_pad_char */ 3951 16, /* ar_max_namelen */ 3952 bfd_getb64, bfd_getb_signed_64, bfd_putb64, 3953 bfd_getb32, bfd_getb_signed_32, bfd_putb32, 3954 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ 3955 bfd_getb64, bfd_getb_signed_64, bfd_putb64, 3956 bfd_getb32, bfd_getb_signed_32, bfd_putb32, 3957 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ 3958 3959 {_bfd_dummy_target, 3960 ieee_object_p, /* bfd_check_format */ 3961 ieee_archive_p, 3962 _bfd_dummy_target, 3963 }, 3964 { 3965 bfd_false, 3966 ieee_mkobject, 3967 _bfd_generic_mkarchive, 3968 bfd_false 3969 }, 3970 { 3971 bfd_false, 3972 ieee_write_object_contents, 3973 _bfd_write_archive_contents, 3974 bfd_false, 3975 }, 3976 3977 BFD_JUMP_TABLE_GENERIC (ieee), 3978 BFD_JUMP_TABLE_COPY (_bfd_generic), 3979 BFD_JUMP_TABLE_CORE (_bfd_nocore), 3980 BFD_JUMP_TABLE_ARCHIVE (ieee), 3981 BFD_JUMP_TABLE_SYMBOLS (ieee), 3982 BFD_JUMP_TABLE_RELOCS (ieee), 3983 BFD_JUMP_TABLE_WRITE (ieee), 3984 BFD_JUMP_TABLE_LINK (ieee), 3985 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), 3986 3987 NULL, 3988 3989 (PTR) 0 3990}; 3991