[ARC] ARC_PC32 dynamic reloc incorrectly generated.

Fixed issue related to the generation of ARC_PC32 dynamic relocs when symbol
is dynamic but still defined in a non shared object.

bfd/ChangeLog:

    Cupertino Miranda  <cmiranda@synopsys.com>

	elf32-arc.c (elf_arc_relocate_section): Small refactor and condition
	changes.
This commit is contained in:
Cupertino Miranda 2016-11-30 14:07:20 +01:00
parent 7ef0acc15e
commit cd6402916f
2 changed files with 18 additions and 10 deletions

View File

@ -1,3 +1,8 @@
2018-06-08 Cupertino Miranda <cmiranda@synopsys.com>
* elf32-arc.c (elf_arc_relocate_section): Small refactor and condition
changes.
2017-06-08 Cupertino Miranda <cmiranda@synopsys.com> 2017-06-08 Cupertino Miranda <cmiranda@synopsys.com>
* config/tc-arc.c (md_undefined_symbol): Changed. * config/tc-arc.c (md_undefined_symbol): Changed.

View File

@ -1713,16 +1713,22 @@ elf_arc_relocate_section (bfd * output_bfd,
} }
} }
#define IS_ARC_PCREL_TYPE(TYPE) \
( (TYPE == R_ARC_PC32) \
|| (TYPE == R_ARC_32_PCREL))
switch (r_type) switch (r_type)
{ {
case R_ARC_32: case R_ARC_32:
case R_ARC_32_ME: case R_ARC_32_ME:
case R_ARC_PC32: case R_ARC_PC32:
case R_ARC_32_PCREL: case R_ARC_32_PCREL:
if ((bfd_link_pic (info)) if (bfd_link_pic (info)
&& ((r_type != R_ARC_PC32 && r_type != R_ARC_32_PCREL) && (!IS_ARC_PCREL_TYPE (r_type)
|| (h != NULL || (h != NULL
&& h->dynindx != -1 && h->dynindx != -1
&& !h->def_regular
&& (!info->symbolic || !h->def_regular)))) && (!info->symbolic || !h->def_regular))))
{ {
Elf_Internal_Rela outrel; Elf_Internal_Rela outrel;
@ -1739,6 +1745,7 @@ elf_arc_relocate_section (bfd * output_bfd,
info, info,
input_section, input_section,
rel->r_offset); rel->r_offset);
if (outrel.r_offset == (bfd_vma) -1) if (outrel.r_offset == (bfd_vma) -1)
skip = TRUE; skip = TRUE;
@ -1746,10 +1753,6 @@ elf_arc_relocate_section (bfd * output_bfd,
outrel.r_offset += (input_section->output_section->vma outrel.r_offset += (input_section->output_section->vma
+ input_section->output_offset); + input_section->output_offset);
#define IS_ARC_PCREL_TYPE(TYPE) \
( (TYPE == R_ARC_PC32) \
|| (TYPE == R_ARC_32_PCREL))
if (skip) if (skip)
{ {
memset (&outrel, 0, sizeof outrel); memset (&outrel, 0, sizeof outrel);
@ -1757,10 +1760,10 @@ elf_arc_relocate_section (bfd * output_bfd,
} }
else if (h != NULL else if (h != NULL
&& h->dynindx != -1 && h->dynindx != -1
&& ((IS_ARC_PCREL_TYPE (r_type)) && (IS_ARC_PCREL_TYPE (r_type)
|| !(bfd_link_executable (info) || !(bfd_link_executable (info)
|| SYMBOLIC_BIND (info, h)) || SYMBOLIC_BIND (info, h))
|| ! h->def_regular)) || ! h->def_regular))
{ {
BFD_ASSERT (h != NULL); BFD_ASSERT (h != NULL);
if ((input_section->flags & SEC_ALLOC) != 0) if ((input_section->flags & SEC_ALLOC) != 0)