+ symbol->section->output_section->vma);
bfd_vma addend = bfd_getl_signed_32 (data + reloc_entry->address);
relocation += addend;
- if (bfd_get_flavour (output_bfd) == bfd_target_coff_flavour
- && obj_pe (output_bfd))
- relocation -= pe_data (output_bfd)->pe_opthdr.ImageBase;
+ bfd *obfd = input_section->output_section->owner;
+ if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
+ && obj_pe (obfd))
+ relocation -= pe_data (obfd)->pe_opthdr.ImageBase;
else
{
*error_message = "unsupported";
= HOW (IMAGE_REL_ARM64_SECREL,
0, 4, 32, false, 0, dont, secrel_reloc, 0xffffffff);
+static const reloc_howto_type arm64_reloc_howto_secidx
+= HOW (IMAGE_REL_ARM64_SECTION,
+ 0, 2, 16, false, 0, dont, NULL, 0xffff);
+
static const reloc_howto_type* const arm64_howto_table[] = {
&arm64_reloc_howto_abs,
&arm64_reloc_howto_64,
&arm64_reloc_howto_branch14,
&arm64_reloc_howto_pgoff12a,
&arm64_reloc_howto_32nb,
- &arm64_reloc_howto_secrel
+ &arm64_reloc_howto_secrel,
+ &arm64_reloc_howto_secidx
};
/* No adjustment to addends should be needed. The actual relocation
return &arm64_reloc_howto_32nb;
case BFD_RELOC_32_SECREL:
return &arm64_reloc_howto_secrel;
+ case BFD_RELOC_16_SECIDX:
+ return &arm64_reloc_howto_secidx;
default:
BFD_FAIL ();
return NULL;
return &arm64_reloc_howto_32nb;
case IMAGE_REL_ARM64_SECREL:
return &arm64_reloc_howto_secrel;
+ case IMAGE_REL_ARM64_SECTION:
+ return &arm64_reloc_howto_secidx;
default:
return NULL;
}
break;
}
+ case IMAGE_REL_ARM64_SECTION:
+ {
+ uint16_t idx = 0, i = 1;
+ asection *s;
+
+ s = output_bfd->sections;
+ while (s)
+ {
+ if (s == sec->output_section)
+ {
+ idx = i;
+ break;
+ }
+
+ i++;
+ s = s->next;
+ }
+
+
+ bfd_putl16 (idx, contents + rel->r_vaddr);
+ rel->r_type = IMAGE_REL_ARM64_ABSOLUTE;
+
+ break;
+ }
+
default:
info->callbacks->einfo (_("%F%P: Unhandled relocation type %u\n"),
rel->r_type);