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]) |
{ |