Fix "FAIL: -Bsymbolic-functions" for cris-linux in ld

* elf32-cris.c (cris_elf_relocate_section)
	(elf_cris_finish_dynamic_symbol, cris_elf_check_relocs)
	(elf_cris_discard_excess_dso_dynamics): Use SYMBOLIC_BIND, not
	just h->symbolic, to check if a symbol should be bound
	symbolically.
This commit is contained in:
Hans-Peter Nilsson
2015-08-03 20:34:51 +02:00
parent ee2d2b1020
commit cb1c8103f1
2 changed files with 15 additions and 7 deletions

View File

@ -1,3 +1,11 @@
2015-08-03 Hans-Peter Nilsson <hp@axis.com>
* elf32-cris.c (cris_elf_relocate_section)
(elf_cris_finish_dynamic_symbol, cris_elf_check_relocs)
(elf_cris_discard_excess_dso_dynamics): Use SYMBOLIC_BIND, not
just h->symbolic, to check if a symbol should be bound
symbolically.
2015-07-30 H.J. Lu <hongjiu.lu@intel.com> 2015-07-30 H.J. Lu <hongjiu.lu@intel.com>
PR ld/18735 PR ld/18735

View File

@ -1093,7 +1093,7 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
h->elf_link_hash_flags test, though it's there in h->elf_link_hash_flags test, though it's there in
other targets. */ other targets. */
if (info->shared if (info->shared
&& ((! info->symbolic && h->dynindx != -1) && ((!SYMBOLIC_BIND (info, h) && h->dynindx != -1)
|| !h->def_regular) || !h->def_regular)
&& (input_section->flags & SEC_ALLOC) != 0 && (input_section->flags & SEC_ALLOC) != 0
&& (r_type == R_CRIS_8 && (r_type == R_CRIS_8
@ -1212,7 +1212,7 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
|| h->type == STT_FUNC || h->type == STT_FUNC
|| h->needs_plt)) || h->needs_plt))
|| (info->shared || (info->shared
&& (info->symbolic || h->dynindx == -1) && (SYMBOLIC_BIND (info, h) || h->dynindx == -1)
&& h->def_regular)) && h->def_regular))
{ {
/* This wasn't checked above for ! info->shared, but /* This wasn't checked above for ! info->shared, but
@ -1432,7 +1432,7 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
&& ((r_type != R_CRIS_8_PCREL && ((r_type != R_CRIS_8_PCREL
&& r_type != R_CRIS_16_PCREL && r_type != R_CRIS_16_PCREL
&& r_type != R_CRIS_32_PCREL) && r_type != R_CRIS_32_PCREL)
|| (!info->symbolic || (!SYMBOLIC_BIND (info, h)
|| (h != NULL && !h->def_regular)))) || (h != NULL && !h->def_regular))))
{ {
Elf_Internal_Rela outrel; Elf_Internal_Rela outrel;
@ -1484,7 +1484,7 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
/* h->dynindx may be -1 if the symbol was marked to /* h->dynindx may be -1 if the symbol was marked to
become local. */ become local. */
else if (h != NULL else if (h != NULL
&& ((! info->symbolic && h->dynindx != -1) && ((!SYMBOLIC_BIND (info, h) && h->dynindx != -1)
|| !h->def_regular)) || !h->def_regular))
{ {
BFD_ASSERT (h->dynindx != -1); BFD_ASSERT (h->dynindx != -1);
@ -2245,7 +2245,7 @@ elf_cris_finish_dynamic_symbol (bfd *output_bfd,
where = sgot->contents + (h->got.offset &~ (bfd_vma) 1); where = sgot->contents + (h->got.offset &~ (bfd_vma) 1);
if (! elf_hash_table (info)->dynamic_sections_created if (! elf_hash_table (info)->dynamic_sections_created
|| (info->shared || (info->shared
&& (info->symbolic || h->dynindx == -1) && (SYMBOLIC_BIND (info, h) || h->dynindx == -1)
&& h->def_regular)) && h->def_regular))
{ {
rela.r_info = ELF32_R_INFO (0, R_CRIS_RELATIVE); rela.r_info = ELF32_R_INFO (0, R_CRIS_RELATIVE);
@ -3661,7 +3661,7 @@ cris_elf_check_relocs (bfd *abfd,
this shared library) then we can also eliminate the this shared library) then we can also eliminate the
reloc. See comment above for more eliminable cases which reloc. See comment above for more eliminable cases which
we can't identify at this time. */ we can't identify at this time. */
if (info->symbolic if (SYMBOLIC_BIND (info, h)
&& h->root.type != bfd_link_hash_defweak && h->root.type != bfd_link_hash_defweak
&& h->def_regular) && h->def_regular)
break; break;
@ -3953,7 +3953,7 @@ elf_cris_discard_excess_dso_dynamics (struct elf_cris_link_hash_entry *h,
any relocs. */ any relocs. */
if (h->root.def_regular if (h->root.def_regular
&& (h->root.forced_local && (h->root.forced_local
|| info->symbolic)) || SYMBOLIC_BIND (info, &h->root)))
{ {
for (s = h->pcrel_relocs_copied; s != NULL; s = s->next) for (s = h->pcrel_relocs_copied; s != NULL; s = s->next)
{ {