X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Felf32-mcore.c;h=33b15319890e0862cd103c117e4ae8b65b410f72;hb=ef8e6722f2eaae6d65b360459451f57f1350d2af;hp=32ef86a870221b4fa2e01f4c9aa7f2d788a6e027;hpb=d17e0c6e9a7d377e81dfbd6a8b0fd42fe7b502db;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-mcore.c b/bfd/elf32-mcore.c index 32ef86a870..33b1531989 100644 --- a/bfd/elf32-mcore.c +++ b/bfd/elf32-mcore.c @@ -1,6 +1,5 @@ /* Motorola MCore specific support for 32-bit ELF - Copyright 1994, 1995, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, - 2007 Free Software Foundation, Inc. + Copyright (C) 1994-2015 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -55,7 +54,7 @@ mcore_elf_merge_private_bfd_data (bfd * ibfd, bfd * obfd) flagword old_flags; flagword new_flags; - /* Check if we have the same endianess. */ + /* Check if we have the same endianness. */ if (! _bfd_generic_verify_endian_match (ibfd, obfd)) return FALSE; @@ -89,7 +88,7 @@ static bfd_reloc_status_type mcore_elf_unsupported_reloc (bfd * abfd, arelent * reloc_entry, asymbol * symbol ATTRIBUTE_UNUSED, - PTR data ATTRIBUTE_UNUSED, + void * data ATTRIBUTE_UNUSED, asection * input_section ATTRIBUTE_UNUSED, bfd * output_bfd ATTRIBUTE_UNUSED, char ** error_message ATTRIBUTE_UNUSED) @@ -111,11 +110,11 @@ static reloc_howto_type mcore_elf_howto_raw[] = /* This reloc does nothing. */ HOWTO (R_MCORE_NONE, /* type */ 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ + 3, /* size (0 = byte, 1 = short, 2 = long) */ + 0, /* bitsize */ FALSE, /* pc_relative */ 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ + complain_overflow_dont, /* complain_on_overflow */ NULL, /* special_function */ "R_MCORE_NONE", /* name */ FALSE, /* partial_inplace */ @@ -341,13 +340,22 @@ mcore_elf_info_to_howto (bfd * abfd ATTRIBUTE_UNUSED, arelent * cache_ptr, Elf_Internal_Rela * dst) { + unsigned int r_type; + if (! mcore_elf_howto_table [R_MCORE_PCRELIMM8BY4]) /* Initialize howto table if needed. */ mcore_elf_howto_init (); - BFD_ASSERT (ELF32_R_TYPE (dst->r_info) < (unsigned int) R_MCORE_max); + r_type = ELF32_R_TYPE (dst->r_info); + if (r_type >= R_MCORE_max) + { + (*_bfd_error_handler) (_("%B: unrecognised MCore reloc number: %d"), + abfd, r_type); + bfd_set_error (bfd_error_bad_value); + r_type = R_MCORE_NONE; + } - cache_ptr->howto = mcore_elf_howto_table [ELF32_R_TYPE (dst->r_info)]; + cache_ptr->howto = mcore_elf_howto_table [r_type]; } /* The RELOCATE_SECTION function is called by the ELF backend linker @@ -401,7 +409,7 @@ mcore_elf_relocate_section (bfd * output_bfd, input_bfd, input_section, (long) input_section->reloc_count, - (info->relocatable) ? " (relocatable)" : ""); + (bfd_link_relocatable (info)) ? " (relocatable)" : ""); #endif if (! mcore_elf_howto_table [R_MCORE_PCRELIMM8BY4]) /* Initialize howto table if needed */ @@ -458,26 +466,19 @@ mcore_elf_relocate_section (bfd * output_bfd, } else { - bfd_boolean unresolved_reloc, warned; + bfd_boolean unresolved_reloc, warned, ignored; RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, r_symndx, symtab_hdr, sym_hashes, h, sec, relocation, - unresolved_reloc, warned); + unresolved_reloc, warned, ignored); } - if (sec != NULL && elf_discarded_section (sec)) - { - /* For relocs against symbols from removed linkonce sections, - or sections discarded by a linker script, we just want the - section contents zeroed. Avoid any special processing. */ - _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset); - rel->r_info = 0; - rel->r_addend = 0; - continue; - } + if (sec != NULL && discarded_section (sec)) + RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, + rel, 1, relend, howto, 0, contents); - if (info->relocatable) + if (bfd_link_relocatable (info)) continue; switch (r_type) @@ -594,18 +595,14 @@ mcore_elf_check_relocs (bfd * abfd, { Elf_Internal_Shdr * symtab_hdr; struct elf_link_hash_entry ** sym_hashes; - struct elf_link_hash_entry ** sym_hashes_end; const Elf_Internal_Rela * rel; const Elf_Internal_Rela * rel_end; - if (info->relocatable) + if (bfd_link_relocatable (info)) return TRUE; symtab_hdr = & elf_tdata (abfd)->symtab_hdr; sym_hashes = elf_sym_hashes (abfd); - sym_hashes_end = sym_hashes + symtab_hdr->sh_size / sizeof (Elf32_External_Sym); - if (!elf_bad_symtab (abfd)) - sym_hashes_end -= symtab_hdr->sh_info; rel_end = relocs + sec->reloc_count; @@ -624,6 +621,10 @@ mcore_elf_check_relocs (bfd * abfd, while (h->root.type == bfd_link_hash_indirect || h->root.type == bfd_link_hash_warning) h = (struct elf_link_hash_entry *) h->root.u.i.link; + + /* PR15323, ref flags aren't set for references in the same + object. */ + h->root.non_ir_ref = 1; } switch (ELF32_R_TYPE (rel->r_info)) @@ -656,9 +657,9 @@ static const struct bfd_elf_special_section mcore_elf_special_sections[]= { NULL, 0, 0, 0, 0 } }; -#define TARGET_BIG_SYM bfd_elf32_mcore_big_vec +#define TARGET_BIG_SYM mcore_elf32_be_vec #define TARGET_BIG_NAME "elf32-mcore-big" -#define TARGET_LITTLE_SYM bfd_elf32_mcore_little_vec +#define TARGET_LITTLE_SYM mcore_elf32_le_vec #define TARGET_LITTLE_NAME "elf32-mcore-little" #define ELF_ARCH bfd_arch_mcore