+
+ case R_DISP7:
+ {
+ bfd_vma dst = bfd_coff_reloc16_get_value (reloc, link_info,
+ input_section);
+ bfd_vma dot = (*dst_ptr
+ + input_section->output_offset
+ + input_section->output_section->vma);
+ bfd_signed_vma gap = dst - dot - 1;
+
+ if ((gap & 1) != 0 || gap > 0 || gap < -254)
+ {
+ link_info->callbacks->reloc_overflow
+ (link_info, NULL, bfd_asymbol_name (*reloc->sym_ptr_ptr),
+ reloc->howto->name, reloc->addend, input_section->owner,
+ input_section, reloc->address);
+ return false;
+ }
+
+ bfd_put_8 (in_abfd,
+ ((bfd_get_8 (in_abfd, data + *dst_ptr) & 0x80)
+ + (-gap / 2 & 0x7f)),
+ data + *dst_ptr);
+ *dst_ptr += 1;
+ *src_ptr += 1;
+ break;
+ }
+
+ case R_CALLR:
+ {
+ bfd_vma dst = bfd_coff_reloc16_get_value (reloc, link_info,
+ input_section);
+ bfd_vma dot = (*dst_ptr
+ + input_section->output_offset
+ + input_section->output_section->vma);
+ bfd_signed_vma gap = dst - dot - 2;
+
+ if ((gap & 1) != 0 || gap > 4096 || gap < -4095)
+ {
+ link_info->callbacks->reloc_overflow
+ (link_info, NULL, bfd_asymbol_name (*reloc->sym_ptr_ptr),
+ reloc->howto->name, reloc->addend, input_section->owner,
+ input_section, reloc->address);
+ return false;
+ }
+
+ bfd_put_16 (in_abfd,
+ ((bfd_get_16 (in_abfd, data + *dst_ptr) & 0xf000)
+ | (-gap / 2 & 0x0fff)),
+ data + *dst_ptr);
+ *dst_ptr += 2;
+ *src_ptr += 2;
+ break;
+ }
+
+ case R_REL16:
+ {
+ bfd_vma dst = bfd_coff_reloc16_get_value (reloc, link_info,
+ input_section);
+ bfd_vma dot = (*dst_ptr
+ + input_section->output_offset
+ + input_section->output_section->vma);
+ bfd_signed_vma gap = dst - dot - 2;
+
+ if (gap > 32767 || gap < -32768)
+ {
+ link_info->callbacks->reloc_overflow
+ (link_info, NULL, bfd_asymbol_name (*reloc->sym_ptr_ptr),
+ reloc->howto->name, reloc->addend, input_section->owner,
+ input_section, reloc->address);
+ return false;
+ }
+
+ bfd_put_16 (in_abfd, gap, data + *dst_ptr);
+ *dst_ptr += 2;
+ *src_ptr += 2;
+ break;
+ }
+