1 /* Matsushita 10200 specific support for 32-bit ELF 2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 3 Free Software Foundation, Inc. 4 5 This file is part of BFD, the Binary File Descriptor library. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 2 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ 20 21 #include "bfd.h" 22 #include "sysdep.h" 23 #include "libbfd.h" 24 #include "elf-bfd.h" 25 26 static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup 27 PARAMS ((bfd *abfd, bfd_reloc_code_real_type code)); 28 static void mn10200_info_to_howto 29 PARAMS ((bfd *, arelent *, Elf_Internal_Rela *)); 30 static bfd_boolean mn10200_elf_relax_delete_bytes 31 PARAMS ((bfd *, asection *, bfd_vma, int)); 32 static bfd_boolean mn10200_elf_symbol_address_p 33 PARAMS ((bfd *, asection *, Elf_Internal_Sym *, bfd_vma)); 34 static bfd_reloc_status_type mn10200_elf_final_link_relocate 35 PARAMS ((reloc_howto_type *, bfd *, bfd *, asection *, 36 bfd_byte *, bfd_vma, bfd_vma, bfd_vma, 37 struct bfd_link_info *, asection *, int)); 38 static bfd_boolean mn10200_elf_relocate_section 39 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, 40 bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, 41 asection **)); 42 static bfd_boolean mn10200_elf_relax_section 43 PARAMS ((bfd *, asection *, struct bfd_link_info *, bfd_boolean *)); 44 static bfd_byte * mn10200_elf_get_relocated_section_contents 45 PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *, 46 bfd_byte *, bfd_boolean, asymbol **)); 47 48 enum reloc_type { 49 R_MN10200_NONE = 0, 50 R_MN10200_32, 51 R_MN10200_16, 52 R_MN10200_8, 53 R_MN10200_24, 54 R_MN10200_PCREL8, 55 R_MN10200_PCREL16, 56 R_MN10200_PCREL24, 57 R_MN10200_MAX 58 }; 59 60 static reloc_howto_type elf_mn10200_howto_table[] = { 61 /* Dummy relocation. Does nothing. */ 62 HOWTO (R_MN10200_NONE, 63 0, 64 2, 65 16, 66 FALSE, 67 0, 68 complain_overflow_bitfield, 69 bfd_elf_generic_reloc, 70 "R_MN10200_NONE", 71 FALSE, 72 0, 73 0, 74 FALSE), 75 /* Standard 32 bit reloc. */ 76 HOWTO (R_MN10200_32, 77 0, 78 2, 79 32, 80 FALSE, 81 0, 82 complain_overflow_bitfield, 83 bfd_elf_generic_reloc, 84 "R_MN10200_32", 85 FALSE, 86 0xffffffff, 87 0xffffffff, 88 FALSE), 89 /* Standard 16 bit reloc. */ 90 HOWTO (R_MN10200_16, 91 0, 92 1, 93 16, 94 FALSE, 95 0, 96 complain_overflow_bitfield, 97 bfd_elf_generic_reloc, 98 "R_MN10200_16", 99 FALSE, 100 0xffff, 101 0xffff, 102 FALSE), 103 /* Standard 8 bit reloc. */ 104 HOWTO (R_MN10200_8, 105 0, 106 0, 107 8, 108 FALSE, 109 0, 110 complain_overflow_bitfield, 111 bfd_elf_generic_reloc, 112 "R_MN10200_8", 113 FALSE, 114 0xff, 115 0xff, 116 FALSE), 117 /* Standard 24 bit reloc. */ 118 HOWTO (R_MN10200_24, 119 0, 120 2, 121 24, 122 FALSE, 123 0, 124 complain_overflow_bitfield, 125 bfd_elf_generic_reloc, 126 "R_MN10200_24", 127 FALSE, 128 0xffffff, 129 0xffffff, 130 FALSE), 131 /* Simple 8 pc-relative reloc. */ 132 HOWTO (R_MN10200_PCREL8, 133 0, 134 0, 135 8, 136 TRUE, 137 0, 138 complain_overflow_bitfield, 139 bfd_elf_generic_reloc, 140 "R_MN10200_PCREL8", 141 FALSE, 142 0xff, 143 0xff, 144 TRUE), 145 /* Simple 16 pc-relative reloc. */ 146 HOWTO (R_MN10200_PCREL16, 147 0, 148 1, 149 16, 150 TRUE, 151 0, 152 complain_overflow_bitfield, 153 bfd_elf_generic_reloc, 154 "R_MN10200_PCREL16", 155 FALSE, 156 0xffff, 157 0xffff, 158 TRUE), 159 /* Simple 32bit pc-relative reloc with a 1 byte adjustment 160 to get the pc-relative offset correct. */ 161 HOWTO (R_MN10200_PCREL24, 162 0, 163 2, 164 24, 165 TRUE, 166 0, 167 complain_overflow_bitfield, 168 bfd_elf_generic_reloc, 169 "R_MN10200_PCREL24", 170 FALSE, 171 0xffffff, 172 0xffffff, 173 TRUE), 174 }; 175 176 struct mn10200_reloc_map { 177 bfd_reloc_code_real_type bfd_reloc_val; 178 unsigned char elf_reloc_val; 179 }; 180 181 static const struct mn10200_reloc_map mn10200_reloc_map[] = { 182 { BFD_RELOC_NONE , R_MN10200_NONE , }, 183 { BFD_RELOC_32 , R_MN10200_32 , }, 184 { BFD_RELOC_16 , R_MN10200_16 , }, 185 { BFD_RELOC_8 , R_MN10200_8 , }, 186 { BFD_RELOC_24 , R_MN10200_24 , }, 187 { BFD_RELOC_8_PCREL , R_MN10200_PCREL8 , }, 188 { BFD_RELOC_16_PCREL, R_MN10200_PCREL16, }, 189 { BFD_RELOC_24_PCREL, R_MN10200_PCREL24, }, 190 }; 191 192 static reloc_howto_type * 193 bfd_elf32_bfd_reloc_type_lookup (abfd, code) 194 bfd *abfd ATTRIBUTE_UNUSED; 195 bfd_reloc_code_real_type code; 196 { 197 unsigned int i; 198 199 for (i = 0; 200 i < sizeof (mn10200_reloc_map) / sizeof (struct mn10200_reloc_map); 201 i++) 202 { 203 if (mn10200_reloc_map[i].bfd_reloc_val == code) 204 return &elf_mn10200_howto_table[mn10200_reloc_map[i].elf_reloc_val]; 205 } 206 207 return NULL; 208 } 209 210 /* Set the howto pointer for an MN10200 ELF reloc. */ 211 212 static void 213 mn10200_info_to_howto (abfd, cache_ptr, dst) 214 bfd *abfd ATTRIBUTE_UNUSED; 215 arelent *cache_ptr; 216 Elf_Internal_Rela *dst; 217 { 218 unsigned int r_type; 219 220 r_type = ELF32_R_TYPE (dst->r_info); 221 BFD_ASSERT (r_type < (unsigned int) R_MN10200_MAX); 222 cache_ptr->howto = &elf_mn10200_howto_table[r_type]; 223 } 224 225 /* Perform a relocation as part of a final link. */ 226 227 static bfd_reloc_status_type 228 mn10200_elf_final_link_relocate (howto, input_bfd, output_bfd, 229 input_section, contents, offset, value, 230 addend, info, sym_sec, is_local) 231 reloc_howto_type *howto; 232 bfd *input_bfd; 233 bfd *output_bfd ATTRIBUTE_UNUSED; 234 asection *input_section; 235 bfd_byte *contents; 236 bfd_vma offset; 237 bfd_vma value; 238 bfd_vma addend; 239 struct bfd_link_info *info ATTRIBUTE_UNUSED; 240 asection *sym_sec ATTRIBUTE_UNUSED; 241 int is_local ATTRIBUTE_UNUSED; 242 { 243 unsigned long r_type = howto->type; 244 bfd_byte *hit_data = contents + offset; 245 246 switch (r_type) 247 { 248 249 case R_MN10200_NONE: 250 return bfd_reloc_ok; 251 252 case R_MN10200_32: 253 value += addend; 254 bfd_put_32 (input_bfd, value, hit_data); 255 return bfd_reloc_ok; 256 257 case R_MN10200_16: 258 value += addend; 259 260 if ((long) value > 0x7fff || (long) value < -0x8000) 261 return bfd_reloc_overflow; 262 263 bfd_put_16 (input_bfd, value, hit_data); 264 return bfd_reloc_ok; 265 266 case R_MN10200_8: 267 value += addend; 268 269 if ((long) value > 0x7f || (long) value < -0x80) 270 return bfd_reloc_overflow; 271 272 bfd_put_8 (input_bfd, value, hit_data); 273 return bfd_reloc_ok; 274 275 case R_MN10200_24: 276 value += addend; 277 278 if ((long) value > 0x7fffff || (long) value < -0x800000) 279 return bfd_reloc_overflow; 280 281 value &= 0xffffff; 282 value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000); 283 bfd_put_32 (input_bfd, value, hit_data); 284 return bfd_reloc_ok; 285 286 case R_MN10200_PCREL8: 287 value -= (input_section->output_section->vma 288 + input_section->output_offset); 289 value -= (offset + 1); 290 value += addend; 291 292 if ((long) value > 0xff || (long) value < -0x100) 293 return bfd_reloc_overflow; 294 295 bfd_put_8 (input_bfd, value, hit_data); 296 return bfd_reloc_ok; 297 298 case R_MN10200_PCREL16: 299 value -= (input_section->output_section->vma 300 + input_section->output_offset); 301 value -= (offset + 2); 302 value += addend; 303 304 if ((long) value > 0xffff || (long) value < -0x10000) 305 return bfd_reloc_overflow; 306 307 bfd_put_16 (input_bfd, value, hit_data); 308 return bfd_reloc_ok; 309 310 case R_MN10200_PCREL24: 311 value -= (input_section->output_section->vma 312 + input_section->output_offset); 313 value -= (offset + 3); 314 value += addend; 315 316 if ((long) value > 0xffffff || (long) value < -0x1000000) 317 return bfd_reloc_overflow; 318 319 value &= 0xffffff; 320 value |= (bfd_get_32 (input_bfd, hit_data) & 0xff000000); 321 bfd_put_32 (input_bfd, value, hit_data); 322 return bfd_reloc_ok; 323 324 default: 325 return bfd_reloc_notsupported; 326 } 327 } 328 329 /* Relocate an MN10200 ELF section. */ 330 static bfd_boolean 331 mn10200_elf_relocate_section (output_bfd, info, input_bfd, input_section, 332 contents, relocs, local_syms, local_sections) 333 bfd *output_bfd; 334 struct bfd_link_info *info; 335 bfd *input_bfd; 336 asection *input_section; 337 bfd_byte *contents; 338 Elf_Internal_Rela *relocs; 339 Elf_Internal_Sym *local_syms; 340 asection **local_sections; 341 { 342 Elf_Internal_Shdr *symtab_hdr; 343 struct elf_link_hash_entry **sym_hashes; 344 Elf_Internal_Rela *rel, *relend; 345 346 if (info->relocatable) 347 return TRUE; 348 349 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; 350 sym_hashes = elf_sym_hashes (input_bfd); 351 352 rel = relocs; 353 relend = relocs + input_section->reloc_count; 354 for (; rel < relend; rel++) 355 { 356 int r_type; 357 reloc_howto_type *howto; 358 unsigned long r_symndx; 359 Elf_Internal_Sym *sym; 360 asection *sec; 361 struct elf_link_hash_entry *h; 362 bfd_vma relocation; 363 bfd_reloc_status_type r; 364 365 r_symndx = ELF32_R_SYM (rel->r_info); 366 r_type = ELF32_R_TYPE (rel->r_info); 367 howto = elf_mn10200_howto_table + r_type; 368 369 h = NULL; 370 sym = NULL; 371 sec = NULL; 372 if (r_symndx < symtab_hdr->sh_info) 373 { 374 sym = local_syms + r_symndx; 375 sec = local_sections[r_symndx]; 376 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); 377 } 378 else 379 { 380 bfd_boolean unresolved_reloc, warned; 381 382 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, 383 r_symndx, symtab_hdr, sym_hashes, 384 h, sec, relocation, 385 unresolved_reloc, warned); 386 } 387 388 r = mn10200_elf_final_link_relocate (howto, input_bfd, output_bfd, 389 input_section, 390 contents, rel->r_offset, 391 relocation, rel->r_addend, 392 info, sec, h == NULL); 393 394 if (r != bfd_reloc_ok) 395 { 396 const char *name; 397 const char *msg = (const char *) 0; 398 399 if (h != NULL) 400 name = h->root.root.string; 401 else 402 { 403 name = (bfd_elf_string_from_elf_section 404 (input_bfd, symtab_hdr->sh_link, sym->st_name)); 405 if (name == NULL || *name == '\0') 406 name = bfd_section_name (input_bfd, sec); 407 } 408 409 switch (r) 410 { 411 case bfd_reloc_overflow: 412 if (! ((*info->callbacks->reloc_overflow) 413 (info, (h ? &h->root : NULL), name, howto->name, 414 (bfd_vma) 0, input_bfd, input_section, 415 rel->r_offset))) 416 return FALSE; 417 break; 418 419 case bfd_reloc_undefined: 420 if (! ((*info->callbacks->undefined_symbol) 421 (info, name, input_bfd, input_section, 422 rel->r_offset, TRUE))) 423 return FALSE; 424 break; 425 426 case bfd_reloc_outofrange: 427 msg = _("internal error: out of range error"); 428 goto common_error; 429 430 case bfd_reloc_notsupported: 431 msg = _("internal error: unsupported relocation error"); 432 goto common_error; 433 434 case bfd_reloc_dangerous: 435 msg = _("internal error: dangerous error"); 436 goto common_error; 437 438 default: 439 msg = _("internal error: unknown error"); 440 /* fall through */ 441 442 common_error: 443 if (!((*info->callbacks->warning) 444 (info, msg, name, input_bfd, input_section, 445 rel->r_offset))) 446 return FALSE; 447 break; 448 } 449 } 450 } 451 452 return TRUE; 453 } 454 455 /* This function handles relaxing for the mn10200. 456 457 There are quite a few relaxing opportunities available on the mn10200: 458 459 * jsr:24 -> jsr:16 2 bytes 460 461 * jmp:24 -> jmp:16 2 bytes 462 * jmp:16 -> bra:8 1 byte 463 464 * If the previous instruction is a conditional branch 465 around the jump/bra, we may be able to reverse its condition 466 and change its target to the jump's target. The jump/bra 467 can then be deleted. 2 bytes 468 469 * mov abs24 -> mov abs16 2 byte savings 470 471 * Most instructions which accept imm24 can relax to imm16 2 bytes 472 - Most instructions which accept imm16 can relax to imm8 1 byte 473 474 * Most instructions which accept d24 can relax to d16 2 bytes 475 - Most instructions which accept d16 can relax to d8 1 byte 476 477 abs24, imm24, d24 all look the same at the reloc level. It 478 might make the code simpler if we had different relocs for 479 the various relaxable operand types. 480 481 We don't handle imm16->imm8 or d16->d8 as they're very rare 482 and somewhat more difficult to support. */ 483 484 static bfd_boolean 485 mn10200_elf_relax_section (abfd, sec, link_info, again) 486 bfd *abfd; 487 asection *sec; 488 struct bfd_link_info *link_info; 489 bfd_boolean *again; 490 { 491 Elf_Internal_Shdr *symtab_hdr; 492 Elf_Internal_Rela *internal_relocs; 493 Elf_Internal_Rela *irel, *irelend; 494 bfd_byte *contents = NULL; 495 Elf_Internal_Sym *isymbuf = NULL; 496 497 /* Assume nothing changes. */ 498 *again = FALSE; 499 500 /* We don't have to do anything for a relocatable link, if 501 this section does not have relocs, or if this is not a 502 code section. */ 503 if (link_info->relocatable 504 || (sec->flags & SEC_RELOC) == 0 505 || sec->reloc_count == 0 506 || (sec->flags & SEC_CODE) == 0) 507 return TRUE; 508 509 symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 510 511 /* Get a copy of the native relocations. */ 512 internal_relocs = (_bfd_elf_link_read_relocs 513 (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL, 514 link_info->keep_memory)); 515 if (internal_relocs == NULL) 516 goto error_return; 517 518 /* Walk through them looking for relaxing opportunities. */ 519 irelend = internal_relocs + sec->reloc_count; 520 for (irel = internal_relocs; irel < irelend; irel++) 521 { 522 bfd_vma symval; 523 524 /* If this isn't something that can be relaxed, then ignore 525 this reloc. */ 526 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_NONE 527 || ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_8 528 || ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_MAX) 529 continue; 530 531 /* Get the section contents if we haven't done so already. */ 532 if (contents == NULL) 533 { 534 /* Get cached copy if it exists. */ 535 if (elf_section_data (sec)->this_hdr.contents != NULL) 536 contents = elf_section_data (sec)->this_hdr.contents; 537 else 538 { 539 /* Go get them off disk. */ 540 if (!bfd_malloc_and_get_section (abfd, sec, &contents)) 541 goto error_return; 542 } 543 } 544 545 /* Read this BFD's local symbols if we haven't done so already. */ 546 if (isymbuf == NULL && symtab_hdr->sh_info != 0) 547 { 548 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents; 549 if (isymbuf == NULL) 550 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr, 551 symtab_hdr->sh_info, 0, 552 NULL, NULL, NULL); 553 if (isymbuf == NULL) 554 goto error_return; 555 } 556 557 /* Get the value of the symbol referred to by the reloc. */ 558 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info) 559 { 560 /* A local symbol. */ 561 Elf_Internal_Sym *isym; 562 asection *sym_sec; 563 564 isym = isymbuf + ELF32_R_SYM (irel->r_info); 565 if (isym->st_shndx == SHN_UNDEF) 566 sym_sec = bfd_und_section_ptr; 567 else if (isym->st_shndx == SHN_ABS) 568 sym_sec = bfd_abs_section_ptr; 569 else if (isym->st_shndx == SHN_COMMON) 570 sym_sec = bfd_com_section_ptr; 571 else 572 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx); 573 symval = (isym->st_value 574 + sym_sec->output_section->vma 575 + sym_sec->output_offset); 576 } 577 else 578 { 579 unsigned long indx; 580 struct elf_link_hash_entry *h; 581 582 /* An external symbol. */ 583 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info; 584 h = elf_sym_hashes (abfd)[indx]; 585 BFD_ASSERT (h != NULL); 586 if (h->root.type != bfd_link_hash_defined 587 && h->root.type != bfd_link_hash_defweak) 588 { 589 /* This appears to be a reference to an undefined 590 symbol. Just ignore it--it will be caught by the 591 regular reloc processing. */ 592 continue; 593 } 594 595 symval = (h->root.u.def.value 596 + h->root.u.def.section->output_section->vma 597 + h->root.u.def.section->output_offset); 598 } 599 600 /* For simplicity of coding, we are going to modify the section 601 contents, the section relocs, and the BFD symbol table. We 602 must tell the rest of the code not to free up this 603 information. It would be possible to instead create a table 604 of changes which have to be made, as is done in coff-mips.c; 605 that would be more work, but would require less memory when 606 the linker is run. */ 607 608 /* Try to turn a 24bit pc-relative branch/call into a 16bit pc-relative 609 branch/call. */ 610 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_PCREL24) 611 { 612 bfd_vma value = symval; 613 614 /* Deal with pc-relative gunk. */ 615 value -= (sec->output_section->vma + sec->output_offset); 616 value -= (irel->r_offset + 3); 617 value += irel->r_addend; 618 619 /* See if the value will fit in 16 bits, note the high value is 620 0x7fff + 2 as the target will be two bytes closer if we are 621 able to relax. */ 622 if ((long) value < 0x8001 && (long) value > -0x8000) 623 { 624 unsigned char code; 625 626 /* Get the opcode. */ 627 code = bfd_get_8 (abfd, contents + irel->r_offset - 1); 628 629 if (code != 0xe0 && code != 0xe1) 630 continue; 631 632 /* Note that we've changed the relocs, section contents, etc. */ 633 elf_section_data (sec)->relocs = internal_relocs; 634 elf_section_data (sec)->this_hdr.contents = contents; 635 symtab_hdr->contents = (unsigned char *) isymbuf; 636 637 /* Fix the opcode. */ 638 if (code == 0xe0) 639 bfd_put_8 (abfd, 0xfc, contents + irel->r_offset - 2); 640 else if (code == 0xe1) 641 bfd_put_8 (abfd, 0xfd, contents + irel->r_offset - 2); 642 643 /* Fix the relocation's type. */ 644 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), 645 R_MN10200_PCREL16); 646 647 /* The opcode got shorter too, so we have to fix the offset. */ 648 irel->r_offset -= 1; 649 650 /* Delete two bytes of data. */ 651 if (!mn10200_elf_relax_delete_bytes (abfd, sec, 652 irel->r_offset + 1, 2)) 653 goto error_return; 654 655 /* That will change things, so, we should relax again. 656 Note that this is not required, and it may be slow. */ 657 *again = TRUE; 658 } 659 } 660 661 /* Try to turn a 16bit pc-relative branch into a 8bit pc-relative 662 branch. */ 663 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_PCREL16) 664 { 665 bfd_vma value = symval; 666 667 /* Deal with pc-relative gunk. */ 668 value -= (sec->output_section->vma + sec->output_offset); 669 value -= (irel->r_offset + 2); 670 value += irel->r_addend; 671 672 /* See if the value will fit in 8 bits, note the high value is 673 0x7f + 1 as the target will be one bytes closer if we are 674 able to relax. */ 675 if ((long) value < 0x80 && (long) value > -0x80) 676 { 677 unsigned char code; 678 679 /* Get the opcode. */ 680 code = bfd_get_8 (abfd, contents + irel->r_offset - 1); 681 682 if (code != 0xfc) 683 continue; 684 685 /* Note that we've changed the relocs, section contents, etc. */ 686 elf_section_data (sec)->relocs = internal_relocs; 687 elf_section_data (sec)->this_hdr.contents = contents; 688 symtab_hdr->contents = (unsigned char *) isymbuf; 689 690 /* Fix the opcode. */ 691 bfd_put_8 (abfd, 0xea, contents + irel->r_offset - 1); 692 693 /* Fix the relocation's type. */ 694 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), 695 R_MN10200_PCREL8); 696 697 /* Delete one byte of data. */ 698 if (!mn10200_elf_relax_delete_bytes (abfd, sec, 699 irel->r_offset + 1, 1)) 700 goto error_return; 701 702 /* That will change things, so, we should relax again. 703 Note that this is not required, and it may be slow. */ 704 *again = TRUE; 705 } 706 } 707 708 /* Try to eliminate an unconditional 8 bit pc-relative branch 709 which immediately follows a conditional 8 bit pc-relative 710 branch around the unconditional branch. 711 712 original: new: 713 bCC lab1 bCC' lab2 714 bra lab2 715 lab1: lab1: 716 717 This happens when the bCC can't reach lab2 at assembly time, 718 but due to other relaxations it can reach at link time. */ 719 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_PCREL8) 720 { 721 Elf_Internal_Rela *nrel; 722 bfd_vma value = symval; 723 unsigned char code; 724 725 /* Deal with pc-relative gunk. */ 726 value -= (sec->output_section->vma + sec->output_offset); 727 value -= (irel->r_offset + 1); 728 value += irel->r_addend; 729 730 /* Do nothing if this reloc is the last byte in the section. */ 731 if (irel->r_offset == sec->size) 732 continue; 733 734 /* See if the next instruction is an unconditional pc-relative 735 branch, more often than not this test will fail, so we 736 test it first to speed things up. */ 737 code = bfd_get_8 (abfd, contents + irel->r_offset + 1); 738 if (code != 0xea) 739 continue; 740 741 /* Also make sure the next relocation applies to the next 742 instruction and that it's a pc-relative 8 bit branch. */ 743 nrel = irel + 1; 744 if (nrel == irelend 745 || irel->r_offset + 2 != nrel->r_offset 746 || ELF32_R_TYPE (nrel->r_info) != (int) R_MN10200_PCREL8) 747 continue; 748 749 /* Make sure our destination immediately follows the 750 unconditional branch. */ 751 if (symval != (sec->output_section->vma + sec->output_offset 752 + irel->r_offset + 3)) 753 continue; 754 755 /* Now make sure we are a conditional branch. This may not 756 be necessary, but why take the chance. 757 758 Note these checks assume that R_MN10200_PCREL8 relocs 759 only occur on bCC and bCCx insns. If they occured 760 elsewhere, we'd need to know the start of this insn 761 for this check to be accurate. */ 762 code = bfd_get_8 (abfd, contents + irel->r_offset - 1); 763 if (code != 0xe0 && code != 0xe1 && code != 0xe2 764 && code != 0xe3 && code != 0xe4 && code != 0xe5 765 && code != 0xe6 && code != 0xe7 && code != 0xe8 766 && code != 0xe9 && code != 0xec && code != 0xed 767 && code != 0xee && code != 0xef && code != 0xfc 768 && code != 0xfd && code != 0xfe && code != 0xff) 769 continue; 770 771 /* We also have to be sure there is no symbol/label 772 at the unconditional branch. */ 773 if (mn10200_elf_symbol_address_p (abfd, sec, isymbuf, 774 irel->r_offset + 1)) 775 continue; 776 777 /* Note that we've changed the relocs, section contents, etc. */ 778 elf_section_data (sec)->relocs = internal_relocs; 779 elf_section_data (sec)->this_hdr.contents = contents; 780 symtab_hdr->contents = (unsigned char *) isymbuf; 781 782 /* Reverse the condition of the first branch. */ 783 switch (code) 784 { 785 case 0xfc: 786 code = 0xfd; 787 break; 788 case 0xfd: 789 code = 0xfc; 790 break; 791 case 0xfe: 792 code = 0xff; 793 break; 794 case 0xff: 795 code = 0xfe; 796 break; 797 case 0xe8: 798 code = 0xe9; 799 break; 800 case 0xe9: 801 code = 0xe8; 802 break; 803 case 0xe0: 804 code = 0xe2; 805 break; 806 case 0xe2: 807 code = 0xe0; 808 break; 809 case 0xe3: 810 code = 0xe1; 811 break; 812 case 0xe1: 813 code = 0xe3; 814 break; 815 case 0xe4: 816 code = 0xe6; 817 break; 818 case 0xe6: 819 code = 0xe4; 820 break; 821 case 0xe7: 822 code = 0xe5; 823 break; 824 case 0xe5: 825 code = 0xe7; 826 break; 827 case 0xec: 828 code = 0xed; 829 break; 830 case 0xed: 831 code = 0xec; 832 break; 833 case 0xee: 834 code = 0xef; 835 break; 836 case 0xef: 837 code = 0xee; 838 break; 839 } 840 bfd_put_8 (abfd, code, contents + irel->r_offset - 1); 841 842 /* Set the reloc type and symbol for the first branch 843 from the second branch. */ 844 irel->r_info = nrel->r_info; 845 846 /* Make the reloc for the second branch a null reloc. */ 847 nrel->r_info = ELF32_R_INFO (ELF32_R_SYM (nrel->r_info), 848 R_MN10200_NONE); 849 850 /* Delete two bytes of data. */ 851 if (!mn10200_elf_relax_delete_bytes (abfd, sec, 852 irel->r_offset + 1, 2)) 853 goto error_return; 854 855 /* That will change things, so, we should relax again. 856 Note that this is not required, and it may be slow. */ 857 *again = TRUE; 858 } 859 860 /* Try to turn a 24bit immediate, displacement or absolute address 861 into a 16bit immediate, displacement or absolute address. */ 862 if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10200_24) 863 { 864 bfd_vma value = symval; 865 866 /* See if the value will fit in 16 bits. 867 We allow any 16bit match here. We prune those we can't 868 handle below. */ 869 if ((long) value < 0x7fff && (long) value > -0x8000) 870 { 871 unsigned char code; 872 873 /* All insns which have 24bit operands are 5 bytes long, 874 the first byte will always be 0xf4, but we double check 875 it just in case. */ 876 877 /* Get the first opcode. */ 878 code = bfd_get_8 (abfd, contents + irel->r_offset - 2); 879 880 if (code != 0xf4) 881 continue; 882 883 /* Get the second opcode. */ 884 code = bfd_get_8 (abfd, contents + irel->r_offset - 1); 885 886 switch (code & 0xfc) 887 { 888 /* mov imm24,dn -> mov imm16,dn */ 889 case 0x70: 890 /* Not safe if the high bit is on as relaxing may 891 move the value out of high mem and thus not fit 892 in a signed 16bit value. */ 893 if (value & 0x8000) 894 continue; 895 896 /* Note that we've changed the relocation contents, etc. */ 897 elf_section_data (sec)->relocs = internal_relocs; 898 elf_section_data (sec)->this_hdr.contents = contents; 899 symtab_hdr->contents = (unsigned char *) isymbuf; 900 901 /* Fix the opcode. */ 902 bfd_put_8 (abfd, 0xf8 + (code & 0x03), 903 contents + irel->r_offset - 2); 904 905 /* Fix the relocation's type. */ 906 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), 907 R_MN10200_16); 908 909 /* The opcode got shorter too, so we have to fix the 910 offset. */ 911 irel->r_offset -= 1; 912 913 /* Delete two bytes of data. */ 914 if (!mn10200_elf_relax_delete_bytes (abfd, sec, 915 irel->r_offset + 1, 2)) 916 goto error_return; 917 918 /* That will change things, so, we should relax again. 919 Note that this is not required, and it may be slow. */ 920 *again = TRUE; 921 break; 922 923 /* mov imm24,an -> mov imm16,an 924 cmp imm24,an -> cmp imm16,an 925 mov (abs24),dn -> mov (abs16),dn 926 mov dn,(abs24) -> mov dn,(abs16) 927 movb dn,(abs24) -> movb dn,(abs16) 928 movbu (abs24),dn -> movbu (abs16),dn */ 929 case 0x74: 930 case 0x7c: 931 case 0xc0: 932 case 0x40: 933 case 0x44: 934 case 0xc8: 935 /* Note that we've changed the relocation contents, etc. */ 936 elf_section_data (sec)->relocs = internal_relocs; 937 elf_section_data (sec)->this_hdr.contents = contents; 938 symtab_hdr->contents = (unsigned char *) isymbuf; 939 940 if ((code & 0xfc) == 0x74) 941 code = 0xdc + (code & 0x03); 942 else if ((code & 0xfc) == 0x7c) 943 code = 0xec + (code & 0x03); 944 else if ((code & 0xfc) == 0xc0) 945 code = 0xc8 + (code & 0x03); 946 else if ((code & 0xfc) == 0x40) 947 code = 0xc0 + (code & 0x03); 948 else if ((code & 0xfc) == 0x44) 949 code = 0xc4 + (code & 0x03); 950 else if ((code & 0xfc) == 0xc8) 951 code = 0xcc + (code & 0x03); 952 953 /* Fix the opcode. */ 954 bfd_put_8 (abfd, code, contents + irel->r_offset - 2); 955 956 /* Fix the relocation's type. */ 957 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), 958 R_MN10200_16); 959 960 /* The opcode got shorter too, so we have to fix the 961 offset. */ 962 irel->r_offset -= 1; 963 964 /* Delete two bytes of data. */ 965 if (!mn10200_elf_relax_delete_bytes (abfd, sec, 966 irel->r_offset + 1, 2)) 967 goto error_return; 968 969 /* That will change things, so, we should relax again. 970 Note that this is not required, and it may be slow. */ 971 *again = TRUE; 972 break; 973 974 /* cmp imm24,dn -> cmp imm16,dn 975 mov (abs24),an -> mov (abs16),an 976 mov an,(abs24) -> mov an,(abs16) 977 add imm24,dn -> add imm16,dn 978 add imm24,an -> add imm16,an 979 sub imm24,dn -> sub imm16,dn 980 sub imm24,an -> sub imm16,an 981 And all d24->d16 in memory ops. */ 982 case 0x78: 983 case 0xd0: 984 case 0x50: 985 case 0x60: 986 case 0x64: 987 case 0x68: 988 case 0x6c: 989 case 0x80: 990 case 0xf0: 991 case 0x00: 992 case 0x10: 993 case 0xb0: 994 case 0x30: 995 case 0xa0: 996 case 0x20: 997 case 0x90: 998 /* Not safe if the high bit is on as relaxing may 999 move the value out of high mem and thus not fit 1000 in a signed 16bit value. */ 1001 if (((code & 0xfc) == 0x78 1002 || (code & 0xfc) == 0x60 1003 || (code & 0xfc) == 0x64 1004 || (code & 0xfc) == 0x68 1005 || (code & 0xfc) == 0x6c 1006 || (code & 0xfc) == 0x80 1007 || (code & 0xfc) == 0xf0 1008 || (code & 0xfc) == 0x00 1009 || (code & 0xfc) == 0x10 1010 || (code & 0xfc) == 0xb0 1011 || (code & 0xfc) == 0x30 1012 || (code & 0xfc) == 0xa0 1013 || (code & 0xfc) == 0x20 1014 || (code & 0xfc) == 0x90) 1015 && (value & 0x8000) != 0) 1016 continue; 1017 1018 /* Note that we've changed the relocation contents, etc. */ 1019 elf_section_data (sec)->relocs = internal_relocs; 1020 elf_section_data (sec)->this_hdr.contents = contents; 1021 symtab_hdr->contents = (unsigned char *) isymbuf; 1022 1023 /* Fix the opcode. */ 1024 bfd_put_8 (abfd, 0xf7, contents + irel->r_offset - 2); 1025 1026 if ((code & 0xfc) == 0x78) 1027 code = 0x48 + (code & 0x03); 1028 else if ((code & 0xfc) == 0xd0) 1029 code = 0x30 + (code & 0x03); 1030 else if ((code & 0xfc) == 0x50) 1031 code = 0x20 + (code & 0x03); 1032 else if ((code & 0xfc) == 0x60) 1033 code = 0x18 + (code & 0x03); 1034 else if ((code & 0xfc) == 0x64) 1035 code = 0x08 + (code & 0x03); 1036 else if ((code & 0xfc) == 0x68) 1037 code = 0x1c + (code & 0x03); 1038 else if ((code & 0xfc) == 0x6c) 1039 code = 0x0c + (code & 0x03); 1040 else if ((code & 0xfc) == 0x80) 1041 code = 0xc0 + (code & 0x07); 1042 else if ((code & 0xfc) == 0xf0) 1043 code = 0xb0 + (code & 0x07); 1044 else if ((code & 0xfc) == 0x00) 1045 code = 0x80 + (code & 0x07); 1046 else if ((code & 0xfc) == 0x10) 1047 code = 0xa0 + (code & 0x07); 1048 else if ((code & 0xfc) == 0xb0) 1049 code = 0x70 + (code & 0x07); 1050 else if ((code & 0xfc) == 0x30) 1051 code = 0x60 + (code & 0x07); 1052 else if ((code & 0xfc) == 0xa0) 1053 code = 0xd0 + (code & 0x07); 1054 else if ((code & 0xfc) == 0x20) 1055 code = 0x90 + (code & 0x07); 1056 else if ((code & 0xfc) == 0x90) 1057 code = 0x50 + (code & 0x07); 1058 1059 bfd_put_8 (abfd, code, contents + irel->r_offset - 1); 1060 1061 /* Fix the relocation's type. */ 1062 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), 1063 R_MN10200_16); 1064 1065 /* Delete one bytes of data. */ 1066 if (!mn10200_elf_relax_delete_bytes (abfd, sec, 1067 irel->r_offset + 2, 1)) 1068 goto error_return; 1069 1070 /* That will change things, so, we should relax again. 1071 Note that this is not required, and it may be slow. */ 1072 *again = TRUE; 1073 break; 1074 1075 /* movb (abs24),dn ->movbu (abs16),dn extxb bn */ 1076 case 0xc4: 1077 /* Note that we've changed the reldection contents, etc. */ 1078 elf_section_data (sec)->relocs = internal_relocs; 1079 elf_section_data (sec)->this_hdr.contents = contents; 1080 symtab_hdr->contents = (unsigned char *) isymbuf; 1081 1082 bfd_put_8 (abfd, 0xcc + (code & 0x03), 1083 contents + irel->r_offset - 2); 1084 1085 bfd_put_8 (abfd, 0xb8 + (code & 0x03), 1086 contents + irel->r_offset - 1); 1087 1088 /* Fix the relocation's type. */ 1089 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), 1090 R_MN10200_16); 1091 1092 /* The reloc will be applied one byte in front of its 1093 current location. */ 1094 irel->r_offset -= 1; 1095 1096 /* Delete one bytes of data. */ 1097 if (!mn10200_elf_relax_delete_bytes (abfd, sec, 1098 irel->r_offset + 2, 1)) 1099 goto error_return; 1100 1101 /* That will change things, so, we should relax again. 1102 Note that this is not required, and it may be slow. */ 1103 *again = TRUE; 1104 break; 1105 } 1106 } 1107 } 1108 } 1109 1110 if (isymbuf != NULL 1111 && symtab_hdr->contents != (unsigned char *) isymbuf) 1112 { 1113 if (! link_info->keep_memory) 1114 free (isymbuf); 1115 else 1116 { 1117 /* Cache the symbols for elf_link_input_bfd. */ 1118 symtab_hdr->contents = (unsigned char *) isymbuf; 1119 } 1120 } 1121 1122 if (contents != NULL 1123 && elf_section_data (sec)->this_hdr.contents != contents) 1124 { 1125 if (! link_info->keep_memory) 1126 free (contents); 1127 else 1128 { 1129 /* Cache the section contents for elf_link_input_bfd. */ 1130 elf_section_data (sec)->this_hdr.contents = contents; 1131 } 1132 } 1133 1134 if (internal_relocs != NULL 1135 && elf_section_data (sec)->relocs != internal_relocs) 1136 free (internal_relocs); 1137 1138 return TRUE; 1139 1140 error_return: 1141 if (isymbuf != NULL 1142 && symtab_hdr->contents != (unsigned char *) isymbuf) 1143 free (isymbuf); 1144 if (contents != NULL 1145 && elf_section_data (sec)->this_hdr.contents != contents) 1146 free (contents); 1147 if (internal_relocs != NULL 1148 && elf_section_data (sec)->relocs != internal_relocs) 1149 free (internal_relocs); 1150 1151 return FALSE; 1152 } 1153 1154 /* Delete some bytes from a section while relaxing. */ 1155 1156 static bfd_boolean 1157 mn10200_elf_relax_delete_bytes (abfd, sec, addr, count) 1158 bfd *abfd; 1159 asection *sec; 1160 bfd_vma addr; 1161 int count; 1162 { 1163 Elf_Internal_Shdr *symtab_hdr; 1164 unsigned int sec_shndx; 1165 bfd_byte *contents; 1166 Elf_Internal_Rela *irel, *irelend; 1167 Elf_Internal_Rela *irelalign; 1168 bfd_vma toaddr; 1169 Elf_Internal_Sym *isym; 1170 Elf_Internal_Sym *isymend; 1171 struct elf_link_hash_entry **sym_hashes; 1172 struct elf_link_hash_entry **end_hashes; 1173 unsigned int symcount; 1174 1175 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec); 1176 1177 contents = elf_section_data (sec)->this_hdr.contents; 1178 1179 /* The deletion must stop at the next ALIGN reloc for an aligment 1180 power larger than the number of bytes we are deleting. */ 1181 1182 irelalign = NULL; 1183 toaddr = sec->size; 1184 1185 irel = elf_section_data (sec)->relocs; 1186 irelend = irel + sec->reloc_count; 1187 1188 /* Actually delete the bytes. */ 1189 memmove (contents + addr, contents + addr + count, 1190 (size_t) (toaddr - addr - count)); 1191 sec->size -= count; 1192 1193 /* Adjust all the relocs. */ 1194 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++) 1195 { 1196 /* Get the new reloc address. */ 1197 if ((irel->r_offset > addr 1198 && irel->r_offset < toaddr)) 1199 irel->r_offset -= count; 1200 } 1201 1202 /* Adjust the local symbols defined in this section. */ 1203 symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 1204 isym = (Elf_Internal_Sym *) symtab_hdr->contents; 1205 for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++) 1206 { 1207 if (isym->st_shndx == sec_shndx 1208 && isym->st_value > addr 1209 && isym->st_value < toaddr) 1210 isym->st_value -= count; 1211 } 1212 1213 /* Now adjust the global symbols defined in this section. */ 1214 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym) 1215 - symtab_hdr->sh_info); 1216 sym_hashes = elf_sym_hashes (abfd); 1217 end_hashes = sym_hashes + symcount; 1218 for (; sym_hashes < end_hashes; sym_hashes++) 1219 { 1220 struct elf_link_hash_entry *sym_hash = *sym_hashes; 1221 if ((sym_hash->root.type == bfd_link_hash_defined 1222 || sym_hash->root.type == bfd_link_hash_defweak) 1223 && sym_hash->root.u.def.section == sec 1224 && sym_hash->root.u.def.value > addr 1225 && sym_hash->root.u.def.value < toaddr) 1226 { 1227 sym_hash->root.u.def.value -= count; 1228 } 1229 } 1230 1231 return TRUE; 1232 } 1233 1234 /* Return TRUE if a symbol exists at the given address, else return 1235 FALSE. */ 1236 static bfd_boolean 1237 mn10200_elf_symbol_address_p (abfd, sec, isym, addr) 1238 bfd *abfd; 1239 asection *sec; 1240 Elf_Internal_Sym *isym; 1241 bfd_vma addr; 1242 { 1243 Elf_Internal_Shdr *symtab_hdr; 1244 unsigned int sec_shndx; 1245 Elf_Internal_Sym *isymend; 1246 struct elf_link_hash_entry **sym_hashes; 1247 struct elf_link_hash_entry **end_hashes; 1248 unsigned int symcount; 1249 1250 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec); 1251 1252 /* Examine all the local symbols. */ 1253 symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 1254 for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++) 1255 { 1256 if (isym->st_shndx == sec_shndx 1257 && isym->st_value == addr) 1258 return TRUE; 1259 } 1260 1261 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym) 1262 - symtab_hdr->sh_info); 1263 sym_hashes = elf_sym_hashes (abfd); 1264 end_hashes = sym_hashes + symcount; 1265 for (; sym_hashes < end_hashes; sym_hashes++) 1266 { 1267 struct elf_link_hash_entry *sym_hash = *sym_hashes; 1268 if ((sym_hash->root.type == bfd_link_hash_defined 1269 || sym_hash->root.type == bfd_link_hash_defweak) 1270 && sym_hash->root.u.def.section == sec 1271 && sym_hash->root.u.def.value == addr) 1272 return TRUE; 1273 } 1274 1275 return FALSE; 1276 } 1277 1278 /* This is a version of bfd_generic_get_relocated_section_contents 1279 which uses mn10200_elf_relocate_section. */ 1280 1281 static bfd_byte * 1282 mn10200_elf_get_relocated_section_contents (output_bfd, link_info, link_order, 1283 data, relocatable, symbols) 1284 bfd *output_bfd; 1285 struct bfd_link_info *link_info; 1286 struct bfd_link_order *link_order; 1287 bfd_byte *data; 1288 bfd_boolean relocatable; 1289 asymbol **symbols; 1290 { 1291 Elf_Internal_Shdr *symtab_hdr; 1292 asection *input_section = link_order->u.indirect.section; 1293 bfd *input_bfd = input_section->owner; 1294 asection **sections = NULL; 1295 Elf_Internal_Rela *internal_relocs = NULL; 1296 Elf_Internal_Sym *isymbuf = NULL; 1297 1298 /* We only need to handle the case of relaxing, or of having a 1299 particular set of section contents, specially. */ 1300 if (relocatable 1301 || elf_section_data (input_section)->this_hdr.contents == NULL) 1302 return bfd_generic_get_relocated_section_contents (output_bfd, link_info, 1303 link_order, data, 1304 relocatable, 1305 symbols); 1306 1307 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; 1308 1309 memcpy (data, elf_section_data (input_section)->this_hdr.contents, 1310 (size_t) input_section->size); 1311 1312 if ((input_section->flags & SEC_RELOC) != 0 1313 && input_section->reloc_count > 0) 1314 { 1315 Elf_Internal_Sym *isym; 1316 Elf_Internal_Sym *isymend; 1317 asection **secpp; 1318 bfd_size_type amt; 1319 1320 internal_relocs = (_bfd_elf_link_read_relocs 1321 (input_bfd, input_section, (PTR) NULL, 1322 (Elf_Internal_Rela *) NULL, FALSE)); 1323 if (internal_relocs == NULL) 1324 goto error_return; 1325 1326 if (symtab_hdr->sh_info != 0) 1327 { 1328 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents; 1329 if (isymbuf == NULL) 1330 isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr, 1331 symtab_hdr->sh_info, 0, 1332 NULL, NULL, NULL); 1333 if (isymbuf == NULL) 1334 goto error_return; 1335 } 1336 1337 amt = symtab_hdr->sh_info; 1338 amt *= sizeof (asection *); 1339 sections = (asection **) bfd_malloc (amt); 1340 if (sections == NULL && amt != 0) 1341 goto error_return; 1342 1343 isymend = isymbuf + symtab_hdr->sh_info; 1344 for (isym = isymbuf, secpp = sections; isym < isymend; ++isym, ++secpp) 1345 { 1346 asection *isec; 1347 1348 if (isym->st_shndx == SHN_UNDEF) 1349 isec = bfd_und_section_ptr; 1350 else if (isym->st_shndx == SHN_ABS) 1351 isec = bfd_abs_section_ptr; 1352 else if (isym->st_shndx == SHN_COMMON) 1353 isec = bfd_com_section_ptr; 1354 else 1355 isec = bfd_section_from_elf_index (input_bfd, isym->st_shndx); 1356 1357 *secpp = isec; 1358 } 1359 1360 if (! mn10200_elf_relocate_section (output_bfd, link_info, input_bfd, 1361 input_section, data, internal_relocs, 1362 isymbuf, sections)) 1363 goto error_return; 1364 1365 if (sections != NULL) 1366 free (sections); 1367 if (isymbuf != NULL 1368 && symtab_hdr->contents != (unsigned char *) isymbuf) 1369 free (isymbuf); 1370 if (elf_section_data (input_section)->relocs != internal_relocs) 1371 free (internal_relocs); 1372 } 1373 1374 return data; 1375 1376 error_return: 1377 if (sections != NULL) 1378 free (sections); 1379 if (isymbuf != NULL 1380 && symtab_hdr->contents != (unsigned char *) isymbuf) 1381 free (isymbuf); 1382 if (internal_relocs != NULL 1383 && elf_section_data (input_section)->relocs != internal_relocs) 1384 free (internal_relocs); 1385 return NULL; 1386 } 1387 1388 #define TARGET_LITTLE_SYM bfd_elf32_mn10200_vec 1389 #define TARGET_LITTLE_NAME "elf32-mn10200" 1390 #define ELF_ARCH bfd_arch_mn10200 1391 #define ELF_MACHINE_CODE EM_MN10200 1392 #define ELF_MACHINE_ALT1 EM_CYGNUS_MN10200 1393 #define ELF_MAXPAGESIZE 0x1000 1394 1395 #define elf_backend_rela_normal 1 1396 #define elf_info_to_howto mn10200_info_to_howto 1397 #define elf_info_to_howto_rel 0 1398 #define elf_backend_relocate_section mn10200_elf_relocate_section 1399 #define bfd_elf32_bfd_relax_section mn10200_elf_relax_section 1400 #define bfd_elf32_bfd_get_relocated_section_contents \ 1401 mn10200_elf_get_relocated_section_contents 1402 1403 #define elf_symbol_leading_char '_' 1404 1405 #include "elf32-target.h" 1406