PowerPC64, support medium model access to common symbols
Some versions of clang apparently generate non-PIC on powerpc64le to access common symbols. Since a common symbol and a strong definition with the same name should resolve to the strong definition we have the possibility of non-PIC attempting to access shared library variables. This is really a clanger since powerpc64le is supposed to be PIC by default, but let's see if ld can cope by generating .dynbss copies. * elf64-ppc.c (must_be_dyn_reloc): Return 0 for TOC16 relocs. (ppc64_elf_check_relocs): Support dynamic/copy relocs for TOC16. (ppc64_elf_adjust_dynamic_symbol): Don't keep dynamic reloc when needs_copy even if all relocs are in rw sections. (dec_dynrel_count): Handle TOC16 relocs. (ppc64_elf_relocate_section): Support dynamic relocs for TOC16. (ppc64_elf_finish_dynamic_symbol): Adjust to handle needs_copy semantic change.
This commit is contained in:
parent
a3d181d2e7
commit
1bdd8facfb
@ -1,3 +1,14 @@
|
||||
2019-09-18 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* elf64-ppc.c (must_be_dyn_reloc): Return 0 for TOC16 relocs.
|
||||
(ppc64_elf_check_relocs): Support dynamic/copy relocs for TOC16.
|
||||
(ppc64_elf_adjust_dynamic_symbol): Don't keep dynamic reloc when
|
||||
needs_copy even if all relocs are in rw sections.
|
||||
(dec_dynrel_count): Handle TOC16 relocs.
|
||||
(ppc64_elf_relocate_section): Support dynamic relocs for TOC16.
|
||||
(ppc64_elf_finish_dynamic_symbol): Adjust to handle needs_copy
|
||||
semantic change.
|
||||
|
||||
2019-09-16 Phil Blundell <pb@pbcl.net>
|
||||
|
||||
* version.m4: Set version to 2.33.50.
|
||||
|
@ -2745,6 +2745,12 @@ must_be_dyn_reloc (struct bfd_link_info *info,
|
||||
case R_PPC64_REL32:
|
||||
case R_PPC64_REL64:
|
||||
case R_PPC64_REL30:
|
||||
case R_PPC64_TOC16:
|
||||
case R_PPC64_TOC16_DS:
|
||||
case R_PPC64_TOC16_LO:
|
||||
case R_PPC64_TOC16_HI:
|
||||
case R_PPC64_TOC16_HA:
|
||||
case R_PPC64_TOC16_LO_DS:
|
||||
return 0;
|
||||
|
||||
case R_PPC64_TPREL16:
|
||||
@ -4830,6 +4836,16 @@ ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||
case R_PPC64_TOC16_HA:
|
||||
case R_PPC64_TOC16_LO_DS:
|
||||
sec->has_toc_reloc = 1;
|
||||
if (h != NULL && !bfd_link_pic (info))
|
||||
{
|
||||
/* We may need a copy reloc. */
|
||||
h->non_got_ref = 1;
|
||||
/* Strongly prefer a copy reloc over a dynamic reloc.
|
||||
glibc ld.so as of 2019-08 will error out if one of
|
||||
these relocations is emitted. */
|
||||
h->needs_copy = 1;
|
||||
goto dodyn;
|
||||
}
|
||||
break;
|
||||
|
||||
/* Marker reloc. */
|
||||
@ -6425,7 +6441,9 @@ ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
|
||||
/* If we don't find any dynamic relocs in read-only sections, then
|
||||
we'll be keeping the dynamic relocs and avoiding the copy reloc. */
|
||||
|| (ELIMINATE_COPY_RELOCS && !alias_readonly_dynrelocs (h))
|
||||
|| (ELIMINATE_COPY_RELOCS
|
||||
&& !h->needs_copy
|
||||
&& !alias_readonly_dynrelocs (h))
|
||||
|
||||
/* Protected variables do not work with .dynbss. The copy in
|
||||
.dynbss won't be used by the shared library with the protected
|
||||
@ -6813,6 +6831,16 @@ dec_dynrel_count (bfd_vma r_info,
|
||||
default:
|
||||
return TRUE;
|
||||
|
||||
case R_PPC64_TOC16:
|
||||
case R_PPC64_TOC16_DS:
|
||||
case R_PPC64_TOC16_LO:
|
||||
case R_PPC64_TOC16_HI:
|
||||
case R_PPC64_TOC16_HA:
|
||||
case R_PPC64_TOC16_LO_DS:
|
||||
if (h == NULL)
|
||||
return TRUE;
|
||||
break;
|
||||
|
||||
case R_PPC64_TPREL16:
|
||||
case R_PPC64_TPREL16_LO:
|
||||
case R_PPC64_TPREL16_HI:
|
||||
@ -15801,6 +15829,8 @@ ppc64_elf_relocate_section (bfd *output_bfd,
|
||||
case R_PPC64_TOC16_LO_DS:
|
||||
case R_PPC64_TOC16_HA:
|
||||
addend -= TOCstart + htab->sec_info[input_section->id].toc_off;
|
||||
if (h != NULL)
|
||||
goto dodyn;
|
||||
break;
|
||||
|
||||
/* Relocate against the beginning of the section. */
|
||||
@ -16734,18 +16764,18 @@ ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
|
||||
break;
|
||||
}
|
||||
|
||||
if (h->needs_copy)
|
||||
if (h->needs_copy
|
||||
&& (h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak)
|
||||
&& (h->root.u.def.section == htab->elf.sdynbss
|
||||
|| h->root.u.def.section == htab->elf.sdynrelro))
|
||||
{
|
||||
/* This symbol needs a copy reloc. Set it up. */
|
||||
Elf_Internal_Rela rela;
|
||||
asection *srel;
|
||||
bfd_byte *loc;
|
||||
|
||||
if (h->dynindx == -1
|
||||
|| (h->root.type != bfd_link_hash_defined
|
||||
&& h->root.type != bfd_link_hash_defweak)
|
||||
|| htab->elf.srelbss == NULL
|
||||
|| htab->elf.sreldynrelro == NULL)
|
||||
if (h->dynindx == -1)
|
||||
abort ();
|
||||
|
||||
rela.r_offset = (h->root.u.def.value
|
||||
|
Loading…
Reference in New Issue
Block a user