| Index: bfd/elf32-iq2000.c
|
| diff --git a/bfd/elf32-iq2000.c b/bfd/elf32-iq2000.c
|
| index 079a96219434be4a6ff2ed8129c14d36a1d3eff4..ff7ef4a3ea26ba76e7b901b1533ed4c1b57a289e 100644
|
| --- a/bfd/elf32-iq2000.c
|
| +++ b/bfd/elf32-iq2000.c
|
| @@ -290,7 +290,7 @@ iq2000_elf_relocate_hi16 (bfd *input_bfd,
|
| bfd_vma insn;
|
|
|
| insn = bfd_get_32 (input_bfd, contents + relhi->r_offset);
|
| -
|
| +
|
| value += relhi->r_addend;
|
| value &= 0x7fffffff; /* Mask off top-bit which is Harvard mask bit. */
|
|
|
| @@ -299,7 +299,7 @@ iq2000_elf_relocate_hi16 (bfd *input_bfd,
|
| if (value & 0x8000)
|
| value += 0x10000;
|
|
|
| - value >>= 16;
|
| + value >>= 16;
|
| insn = ((insn & ~0xFFFF) | value);
|
|
|
| bfd_put_32 (input_bfd, insn, contents + relhi->r_offset);
|
| @@ -444,7 +444,7 @@ iq2000_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED,
|
| /* Look through the relocs for a section during the first phase.
|
| Since we don't do .gots or .plts, we just need to consider the
|
| virtual table relocs for gc. */
|
| -
|
| +
|
| static bfd_boolean
|
| iq2000_elf_check_relocs (bfd *abfd,
|
| struct bfd_link_info *info,
|
| @@ -456,19 +456,19 @@ iq2000_elf_check_relocs (bfd *abfd,
|
| const Elf_Internal_Rela *rel;
|
| const Elf_Internal_Rela *rel_end;
|
| bfd_boolean changed = FALSE;
|
| -
|
| +
|
| if (info->relocatable)
|
| return TRUE;
|
| -
|
| +
|
| symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
|
| sym_hashes = elf_sym_hashes (abfd);
|
| -
|
| +
|
| rel_end = relocs + sec->reloc_count;
|
| for (rel = relocs; rel < rel_end; rel++)
|
| {
|
| struct elf_link_hash_entry *h;
|
| unsigned long r_symndx;
|
| -
|
| +
|
| r_symndx = ELF32_R_SYM (rel->r_info);
|
| if (r_symndx < symtab_hdr->sh_info)
|
| h = NULL;
|
| @@ -478,8 +478,12 @@ iq2000_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))
|
| {
|
| /* This relocation describes the C++ object vtable
|
| @@ -488,7 +492,7 @@ iq2000_elf_check_relocs (bfd *abfd,
|
| if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
|
| return FALSE;
|
| break;
|
| -
|
| +
|
| /* This relocation describes which C++ vtable entries
|
| are actually used. Record for later use during GC. */
|
| case R_IQ2000_GNU_VTENTRY:
|
| @@ -584,20 +588,20 @@ iq2000_elf_relocate_section (bfd * output_bfd ATTRIBUTE_UNUSED,
|
| bfd_reloc_status_type r;
|
| const char * name = NULL;
|
| int r_type;
|
| -
|
| +
|
| r_type = ELF32_R_TYPE (rel->r_info);
|
| -
|
| +
|
| if ( r_type == R_IQ2000_GNU_VTINHERIT
|
| || r_type == R_IQ2000_GNU_VTENTRY)
|
| continue;
|
| -
|
| +
|
| r_symndx = ELF32_R_SYM (rel->r_info);
|
|
|
| howto = iq2000_elf_howto_table + ELF32_R_TYPE (rel->r_info);
|
| h = NULL;
|
| sym = NULL;
|
| sec = NULL;
|
| -
|
| +
|
| if (r_symndx < symtab_hdr->sh_info)
|
| {
|
| asection *osec;
|
| @@ -615,7 +619,7 @@ iq2000_elf_relocate_section (bfd * output_bfd ATTRIBUTE_UNUSED,
|
| relocation = (sec->output_section->vma
|
| + sec->output_offset
|
| + sym->st_value);
|
| -
|
| +
|
| name = bfd_elf_string_from_elf_section
|
| (input_bfd, symtab_hdr->sh_link, sym->st_name);
|
| name = (name == NULL) ? bfd_section_name (input_bfd, osec) : name;
|
| @@ -623,12 +627,12 @@ iq2000_elf_relocate_section (bfd * output_bfd ATTRIBUTE_UNUSED,
|
| else
|
| {
|
| bfd_boolean unresolved_reloc;
|
| - bfd_boolean warned;
|
| + bfd_boolean 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);
|
|
|
| name = h->root.root.string;
|
| }
|
| @@ -674,12 +678,12 @@ iq2000_elf_relocate_section (bfd * output_bfd ATTRIBUTE_UNUSED,
|
| (info, (h ? &h->root : NULL), name, howto->name,
|
| (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
|
| break;
|
| -
|
| +
|
| case bfd_reloc_undefined:
|
| r = info->callbacks->undefined_symbol
|
| (info, name, input_bfd, input_section, rel->r_offset, TRUE);
|
| break;
|
| -
|
| +
|
| case bfd_reloc_outofrange:
|
| msg = _("internal error: out of range error");
|
| break;
|
| @@ -836,7 +840,7 @@ iq2000_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
|
| break;
|
| }
|
| }
|
| -
|
| +
|
| /* Print out any mismatches from above. */
|
| if (new_opt[0])
|
| {
|
|
|