mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-09-09 17:02:22 +08:00
* elf32-i860.c (i860_howto_pc26_reloc): Finish relocation here
instead of returning bfd_reloc_continue.
This commit is contained in:
@ -1,3 +1,8 @@
|
|||||||
|
2003-08-31 Christian Groessler <chris@groessler.org>
|
||||||
|
|
||||||
|
* elf32-i860.c (i860_howto_pc26_reloc): Finish relocation here
|
||||||
|
instead of returning bfd_reloc_continue.
|
||||||
|
|
||||||
2003-08-31 Andreas Jaeger <aj@suse.de>
|
2003-08-31 Andreas Jaeger <aj@suse.de>
|
||||||
|
|
||||||
* merge.c: Update to ISO C90.
|
* merge.c: Update to ISO C90.
|
||||||
|
@ -37,6 +37,10 @@ i860_howto_pc26_reloc (bfd *abfd ATTRIBUTE_UNUSED,
|
|||||||
bfd *output_bfd,
|
bfd *output_bfd,
|
||||||
char **error_message ATTRIBUTE_UNUSED)
|
char **error_message ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
|
bfd_vma insn;
|
||||||
|
bfd_vma relocation;
|
||||||
|
bfd_byte *addr;
|
||||||
|
|
||||||
if (output_bfd != NULL
|
if (output_bfd != NULL
|
||||||
&& (symbol->flags & BSF_SECTION_SYM) == 0
|
&& (symbol->flags & BSF_SECTION_SYM) == 0
|
||||||
&& (! reloc_entry->howto->partial_inplace
|
&& (! reloc_entry->howto->partial_inplace
|
||||||
@ -46,8 +50,44 @@ i860_howto_pc26_reloc (bfd *abfd ATTRIBUTE_UNUSED,
|
|||||||
return bfd_reloc_ok;
|
return bfd_reloc_ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
reloc_entry->addend -= 4;
|
/* Used elf32-mips.c as an example. */
|
||||||
return bfd_reloc_continue;
|
if (bfd_is_und_section (symbol->section)
|
||||||
|
&& output_bfd == (bfd *) NULL)
|
||||||
|
return bfd_reloc_undefined;
|
||||||
|
|
||||||
|
if (bfd_is_com_section (symbol->section))
|
||||||
|
relocation = 0;
|
||||||
|
else
|
||||||
|
relocation = symbol->value;
|
||||||
|
|
||||||
|
relocation += symbol->section->output_section->vma;
|
||||||
|
relocation += symbol->section->output_offset;
|
||||||
|
relocation += reloc_entry->addend;
|
||||||
|
|
||||||
|
if (reloc_entry->address > input_section->_cooked_size)
|
||||||
|
return bfd_reloc_outofrange;
|
||||||
|
|
||||||
|
/* Adjust for PC-relative relocation. */
|
||||||
|
relocation -= (input_section->output_section->vma
|
||||||
|
+ input_section->output_offset
|
||||||
|
+ reloc_entry->address
|
||||||
|
+ 4);
|
||||||
|
|
||||||
|
/* Check for target out of range. */
|
||||||
|
if ((bfd_signed_vma)relocation > (0x3ffffff << 2)
|
||||||
|
|| (bfd_signed_vma)relocation < (-0x4000000 << 2))
|
||||||
|
return bfd_reloc_outofrange;
|
||||||
|
|
||||||
|
addr = (bfd_byte *) data + reloc_entry->address;
|
||||||
|
insn = bfd_get_32 (abfd, addr);
|
||||||
|
|
||||||
|
relocation >>= reloc_entry->howto->rightshift;
|
||||||
|
insn = (insn & ~reloc_entry->howto->dst_mask)
|
||||||
|
| (relocation & reloc_entry->howto->dst_mask);
|
||||||
|
|
||||||
|
bfd_put_32 (abfd, (bfd_vma) insn, addr);
|
||||||
|
|
||||||
|
return bfd_reloc_ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* special_function for R_860_PC16 relocation. */
|
/* special_function for R_860_PC16 relocation. */
|
||||||
|
Reference in New Issue
Block a user