mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-22 11:00:01 +08:00
* elf32-sh.c (sh_elf_howto_table, R_SH_REL32): Make
partial_inplace, matching assembler output. Set src_mask to all ones. (sh_elf_relocate_section): Delete misplaced comment. For relocatable linking against section symbol, call _bfd_relocate_contents for partial_inplace relocs and adjust rel->r_addend for others. <case R_SH_DIR32, R_SH_REL32>: Fetch partial_inplace addend with bfd_get_32, not at rel->r_addend.
This commit is contained in:
@ -1,3 +1,16 @@
|
|||||||
|
2001-09-30 kaz Kojima <kkojima@rr.iij4u.or.jp>
|
||||||
|
Hans-Peter Nilsson <hp@bitrange.com>
|
||||||
|
|
||||||
|
* elf32-sh.c (sh_elf_howto_table, R_SH_REL32): Make
|
||||||
|
partial_inplace, matching assembler output. Set src_mask to
|
||||||
|
all ones.
|
||||||
|
(sh_elf_relocate_section): Delete misplaced comment.
|
||||||
|
For relocatable linking against section symbol, call
|
||||||
|
_bfd_relocate_contents for partial_inplace relocs and adjust
|
||||||
|
rel->r_addend for others.
|
||||||
|
<case R_SH_DIR32, R_SH_REL32>: Fetch partial_inplace addend with
|
||||||
|
bfd_get_32, not at rel->r_addend.
|
||||||
|
|
||||||
2001-09-30 Alan Modra <amodra@bigpond.net.au>
|
2001-09-30 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
* elf.c (_bfd_elf_link_hash_copy_indirect): Set ind refcounts to
|
* elf.c (_bfd_elf_link_hash_copy_indirect): Set ind refcounts to
|
||||||
|
@ -134,8 +134,8 @@ static reloc_howto_type sh_elf_howto_table[] =
|
|||||||
complain_overflow_signed, /* complain_on_overflow */
|
complain_overflow_signed, /* complain_on_overflow */
|
||||||
sh_elf_ignore_reloc, /* special_function */
|
sh_elf_ignore_reloc, /* special_function */
|
||||||
"R_SH_REL32", /* name */
|
"R_SH_REL32", /* name */
|
||||||
false, /* partial_inplace */
|
true, /* partial_inplace */
|
||||||
0, /* src_mask */
|
0xffffffff, /* src_mask */
|
||||||
0xffffffff, /* dst_mask */
|
0xffffffff, /* dst_mask */
|
||||||
true), /* pcrel_offset */
|
true), /* pcrel_offset */
|
||||||
|
|
||||||
@ -3026,7 +3026,11 @@ sh_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
|||||||
|
|
||||||
howto = sh_elf_howto_table + r_type;
|
howto = sh_elf_howto_table + r_type;
|
||||||
|
|
||||||
/* This is a final link. */
|
/* For relocs that aren't partial_inplace, we get the addend from
|
||||||
|
the relocation. */
|
||||||
|
if (! howto->partial_inplace)
|
||||||
|
addend = rel->r_addend;
|
||||||
|
|
||||||
h = NULL;
|
h = NULL;
|
||||||
sym = NULL;
|
sym = NULL;
|
||||||
sec = NULL;
|
sec = NULL;
|
||||||
@ -3046,7 +3050,32 @@ sh_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
|||||||
section symbol winds up in the output section. */
|
section symbol winds up in the output section. */
|
||||||
sym = local_syms + r_symndx;
|
sym = local_syms + r_symndx;
|
||||||
if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
|
if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
|
||||||
goto final_link_relocate;
|
{
|
||||||
|
if (! howto->partial_inplace)
|
||||||
|
{
|
||||||
|
/* For relocations with the addend in the
|
||||||
|
relocation, we need just to update the addend.
|
||||||
|
All real relocs are of type partial_inplace; this
|
||||||
|
code is mostly for completeness. */
|
||||||
|
rel->r_addend += sec->output_offset + sym->st_value;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Relocs of type partial_inplace need to pick up the
|
||||||
|
contents in the contents and add the offset resulting
|
||||||
|
from the changed location of the section symbol.
|
||||||
|
Using _bfd_final_link_relocate (e.g. goto
|
||||||
|
final_link_relocate) here would be wrong, because
|
||||||
|
relocations marked pc_relative would get the current
|
||||||
|
location subtracted, and we must only do that at the
|
||||||
|
final link. */
|
||||||
|
r = _bfd_relocate_contents (howto, input_bfd,
|
||||||
|
sec->output_offset
|
||||||
|
+ sym->st_value,
|
||||||
|
contents + rel->r_offset);
|
||||||
|
goto relocation_done;
|
||||||
|
}
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -3253,7 +3282,8 @@ sh_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
|||||||
BFD_ASSERT (h != NULL && h->dynindx != -1);
|
BFD_ASSERT (h != NULL && h->dynindx != -1);
|
||||||
relocate = false;
|
relocate = false;
|
||||||
outrel.r_info = ELF32_R_INFO (h->dynindx, R_SH_REL32);
|
outrel.r_info = ELF32_R_INFO (h->dynindx, R_SH_REL32);
|
||||||
outrel.r_addend = rel->r_addend;
|
outrel.r_addend
|
||||||
|
= bfd_get_32 (input_bfd, contents + rel->r_offset);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -3266,14 +3296,18 @@ sh_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
|||||||
{
|
{
|
||||||
relocate = true;
|
relocate = true;
|
||||||
outrel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
|
outrel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE);
|
||||||
outrel.r_addend = relocation + rel->r_addend;
|
outrel.r_addend
|
||||||
|
= relocation + bfd_get_32 (input_bfd,
|
||||||
|
contents + rel->r_offset);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
BFD_ASSERT (h->dynindx != -1);
|
BFD_ASSERT (h->dynindx != -1);
|
||||||
relocate = false;
|
relocate = false;
|
||||||
outrel.r_info = ELF32_R_INFO (h->dynindx, R_SH_DIR32);
|
outrel.r_info = ELF32_R_INFO (h->dynindx, R_SH_DIR32);
|
||||||
outrel.r_addend = relocation + rel->r_addend;
|
outrel.r_addend
|
||||||
|
= relocation + bfd_get_32 (input_bfd,
|
||||||
|
contents + rel->r_offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3290,8 +3324,6 @@ sh_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
|||||||
if (! relocate)
|
if (! relocate)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (r_type == R_SH_DIR32)
|
|
||||||
addend = rel->r_addend;
|
|
||||||
goto final_link_relocate;
|
goto final_link_relocate;
|
||||||
|
|
||||||
case R_SH_GOT32:
|
case R_SH_GOT32:
|
||||||
@ -3471,6 +3503,7 @@ sh_elf_relocate_section (output_bfd, info, input_bfd, input_section,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
relocation_done:
|
||||||
if (r != bfd_reloc_ok)
|
if (r != bfd_reloc_ok)
|
||||||
{
|
{
|
||||||
switch (r)
|
switch (r)
|
||||||
|
Reference in New Issue
Block a user