PR ld/15056

* elfxx-sparc.c (_bfd_sparc_elf_gc_mark_hook): Handle implicit
	references to __tls_get_addr.
	* elf32-tilpro.c (tilepro_elf_gc_mark_hook): Likewise.  Correct
	vtinherit and vtentry reloc handling too.
	* elfxx-tilegx.c (tilegx_elf_gc_mark_hook): As for tilepro.
This commit is contained in:
Alan Modra 2013-01-31 07:32:45 +00:00
parent bcaa2f8235
commit b45b6908c1
4 changed files with 87 additions and 10 deletions

View File

@ -1,3 +1,13 @@
2013-01-31 Alan Modra <amodra@gmail.com>
David S. Miller <davem@davemloft.net>
PR ld/15056
* elfxx-sparc.c (_bfd_sparc_elf_gc_mark_hook): Handle implicit
references to __tls_get_addr.
* elf32-tilpro.c (tilepro_elf_gc_mark_hook): Likewise. Correct
vtinherit and vtentry reloc handling too.
* elfxx-tilegx.c (tilegx_elf_gc_mark_hook): As for tilepro.
2013-01-31 Alan Modra <amodra@gmail.com>
* elf64-ppc.c (ppc_stub_name): Trim off trailing "+0".

View File

@ -1868,11 +1868,33 @@ tilepro_elf_gc_mark_hook (asection *sec,
if (h != NULL)
{
switch (ELF32_R_TYPE (rel->r_info))
{
case R_TILEPRO_GNU_VTINHERIT:
case R_TILEPRO_GNU_VTENTRY:
break;
}
{
case R_TILEPRO_GNU_VTINHERIT:
case R_TILEPRO_GNU_VTENTRY:
return NULL;
}
}
/* FIXME: The test here, in check_relocs and in relocate_section
dealing with TLS optimization, ought to be !info->executable. */
if (info->shared)
{
switch (ELF32_R_TYPE (rel->r_info))
{
case R_TILEPRO_TLS_GD_CALL:
/* This reloc implicitly references __tls_get_addr. We know
another reloc will reference the same symbol as the one
on this reloc, so the real symbol and section will be
gc marked when processing the other reloc. That lets
us handle __tls_get_addr here. */
h = elf_link_hash_lookup (elf_hash_table (info), "__tls_get_addr",
FALSE, FALSE, TRUE);
BFD_ASSERT (h != NULL);
h->mark = 1;
if (h->u.weakdef != NULL)
h->u.weakdef->mark = 1;
sym = NULL;
}
}
return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);

View File

@ -1873,6 +1873,29 @@ _bfd_sparc_elf_gc_mark_hook (asection *sec,
return NULL;
}
/* FIXME: The test here, in check_relocs and in relocate_section
dealing with TLS optimization, ought to be !info->executable. */
if (info->shared)
{
switch (SPARC_ELF_R_TYPE (rel->r_info))
{
case R_SPARC_TLS_GD_CALL:
case R_SPARC_TLS_LDM_CALL:
/* This reloc implicitly references __tls_get_addr. We know
another reloc will reference the same symbol as the one
on this reloc, so the real symbol and section will be
gc marked when processing the other reloc. That lets
us handle __tls_get_addr here. */
h = elf_link_hash_lookup (elf_hash_table (info), "__tls_get_addr",
FALSE, FALSE, TRUE);
BFD_ASSERT (h != NULL);
h->mark = 1;
if (h->u.weakdef != NULL)
h->u.weakdef->mark = 1;
sym = NULL;
}
}
return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
}

View File

@ -2107,11 +2107,33 @@ tilegx_elf_gc_mark_hook (asection *sec,
if (h != NULL)
{
switch (TILEGX_ELF_R_TYPE (rel->r_info))
{
case R_TILEGX_GNU_VTINHERIT:
case R_TILEGX_GNU_VTENTRY:
break;
}
{
case R_TILEGX_GNU_VTINHERIT:
case R_TILEGX_GNU_VTENTRY:
return NULL;
}
}
/* FIXME: The test here, in check_relocs and in relocate_section
dealing with TLS optimization, ought to be !info->executable. */
if (info->shared)
{
switch (TILEGX_ELF_R_TYPE (rel->r_info))
{
case R_TILEGX_TLS_GD_CALL:
/* This reloc implicitly references __tls_get_addr. We know
another reloc will reference the same symbol as the one
on this reloc, so the real symbol and section will be
gc marked when processing the other reloc. That lets
us handle __tls_get_addr here. */
h = elf_link_hash_lookup (elf_hash_table (info), "__tls_get_addr",
FALSE, FALSE, TRUE);
BFD_ASSERT (h != NULL);
h->mark = 1;
if (h->u.weakdef != NULL)
h->u.weakdef->mark = 1;
sym = NULL;
}
}
return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);