diff options
author | Alan Modra <amodra@gmail.com> | 2013-01-31 07:32:45 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2013-01-31 07:32:45 +0000 |
commit | b45b6908c154735e69e2dfefd34748f79ca85753 (patch) | |
tree | fcbe4218b0b529dcec6ae3c69b0f783cd56e2da9 /bfd/elfxx-sparc.c | |
parent | bcaa2f8235869541dfefd7edf8494890e06f5871 (diff) | |
download | gdb-b45b6908c154735e69e2dfefd34748f79ca85753.zip gdb-b45b6908c154735e69e2dfefd34748f79ca85753.tar.gz gdb-b45b6908c154735e69e2dfefd34748f79ca85753.tar.bz2 |
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.
Diffstat (limited to 'bfd/elfxx-sparc.c')
-rw-r--r-- | bfd/elfxx-sparc.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/bfd/elfxx-sparc.c b/bfd/elfxx-sparc.c index 196d566..9684ffd 100644 --- a/bfd/elfxx-sparc.c +++ b/bfd/elfxx-sparc.c @@ -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); } |