mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-10-16 20:32:21 +08:00
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:
@ -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>
|
2013-01-31 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
* elf64-ppc.c (ppc_stub_name): Trim off trailing "+0".
|
* elf64-ppc.c (ppc_stub_name): Trim off trailing "+0".
|
||||||
|
@ -1868,11 +1868,33 @@ tilepro_elf_gc_mark_hook (asection *sec,
|
|||||||
if (h != NULL)
|
if (h != NULL)
|
||||||
{
|
{
|
||||||
switch (ELF32_R_TYPE (rel->r_info))
|
switch (ELF32_R_TYPE (rel->r_info))
|
||||||
{
|
{
|
||||||
case R_TILEPRO_GNU_VTINHERIT:
|
case R_TILEPRO_GNU_VTINHERIT:
|
||||||
case R_TILEPRO_GNU_VTENTRY:
|
case R_TILEPRO_GNU_VTENTRY:
|
||||||
break;
|
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);
|
return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
|
||||||
|
@ -1873,6 +1873,29 @@ _bfd_sparc_elf_gc_mark_hook (asection *sec,
|
|||||||
return NULL;
|
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);
|
return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2107,11 +2107,33 @@ tilegx_elf_gc_mark_hook (asection *sec,
|
|||||||
if (h != NULL)
|
if (h != NULL)
|
||||||
{
|
{
|
||||||
switch (TILEGX_ELF_R_TYPE (rel->r_info))
|
switch (TILEGX_ELF_R_TYPE (rel->r_info))
|
||||||
{
|
{
|
||||||
case R_TILEGX_GNU_VTINHERIT:
|
case R_TILEGX_GNU_VTINHERIT:
|
||||||
case R_TILEGX_GNU_VTENTRY:
|
case R_TILEGX_GNU_VTENTRY:
|
||||||
break;
|
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);
|
return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
|
||||||
|
Reference in New Issue
Block a user