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