tile: Mark __tls_get_addr in gc_mark_hook

TLS_GD_CALL relocations implicitly reference __tls_get_addr.  Since
elf_gc_mark_hook is called before check_relocs now, we need to call
_bfd_generic_link_add_one_symbol to mark __tls_get_addr for garbage
collection.

	* elf32-tilepro.c (tilepro_elf_gc_mark_hook): Call
	_bfd_generic_link_add_one_symbol to mark __tls_get_addr.
	* elfxx-tilegx.c (tilegx_elf_gc_mark_hook): Likewise.
This commit is contained in:
H.J. Lu
2017-10-18 15:46:57 -07:00
parent 8dfa5d5a63
commit 8e35405853
3 changed files with 26 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2017-10-18 H.J. Lu <hongjiu.lu@intel.com>
* elf32-tilepro.c (tilepro_elf_gc_mark_hook): Call
_bfd_generic_link_add_one_symbol to mark __tls_get_addr.
* elfxx-tilegx.c (tilegx_elf_gc_mark_hook): Likewise.
2017-10-17 H.J. Lu <hongjiu.lu@intel.com> 2017-10-17 H.J. Lu <hongjiu.lu@intel.com>
* elf32-microblaze.c (microblaze_elf_check_relocs): Check for * elf32-microblaze.c (microblaze_elf_check_relocs): Check for

View File

@ -1864,6 +1864,8 @@ tilepro_elf_gc_mark_hook (asection *sec,
dealing with TLS optimization, ought to be !bfd_link_executable (info). */ dealing with TLS optimization, ought to be !bfd_link_executable (info). */
if (bfd_link_pic (info)) if (bfd_link_pic (info))
{ {
struct bfd_link_hash_entry *bh;
switch (ELF32_R_TYPE (rel->r_info)) switch (ELF32_R_TYPE (rel->r_info))
{ {
case R_TILEPRO_TLS_GD_CALL: case R_TILEPRO_TLS_GD_CALL:
@ -1872,8 +1874,14 @@ tilepro_elf_gc_mark_hook (asection *sec,
on this reloc, so the real symbol and section will be on this reloc, so the real symbol and section will be
gc marked when processing the other reloc. That lets gc marked when processing the other reloc. That lets
us handle __tls_get_addr here. */ us handle __tls_get_addr here. */
h = elf_link_hash_lookup (elf_hash_table (info), "__tls_get_addr", bh = NULL;
FALSE, FALSE, TRUE); if (! _bfd_generic_link_add_one_symbol (info, sec->owner,
"__tls_get_addr", 0,
bfd_und_section_ptr,
0, NULL, FALSE,
FALSE, &bh))
return NULL;
h = (struct elf_link_hash_entry *) bh;
BFD_ASSERT (h != NULL); BFD_ASSERT (h != NULL);
h->mark = 1; h->mark = 1;
if (h->u.weakdef != NULL) if (h->u.weakdef != NULL)

View File

@ -2103,6 +2103,8 @@ tilegx_elf_gc_mark_hook (asection *sec,
dealing with TLS optimization, ought to be !bfd_link_executable (info). */ dealing with TLS optimization, ought to be !bfd_link_executable (info). */
if (bfd_link_pic (info)) if (bfd_link_pic (info))
{ {
struct bfd_link_hash_entry *bh;
switch (TILEGX_ELF_R_TYPE (rel->r_info)) switch (TILEGX_ELF_R_TYPE (rel->r_info))
{ {
case R_TILEGX_TLS_GD_CALL: case R_TILEGX_TLS_GD_CALL:
@ -2111,8 +2113,14 @@ tilegx_elf_gc_mark_hook (asection *sec,
on this reloc, so the real symbol and section will be on this reloc, so the real symbol and section will be
gc marked when processing the other reloc. That lets gc marked when processing the other reloc. That lets
us handle __tls_get_addr here. */ us handle __tls_get_addr here. */
h = elf_link_hash_lookup (elf_hash_table (info), "__tls_get_addr", bh = NULL;
FALSE, FALSE, TRUE); if (! _bfd_generic_link_add_one_symbol (info, sec->owner,
"__tls_get_addr", 0,
bfd_und_section_ptr,
0, NULL, FALSE,
FALSE, &bh))
return NULL;
h = (struct elf_link_hash_entry *) bh;
BFD_ASSERT (h != NULL); BFD_ASSERT (h != NULL);
h->mark = 1; h->mark = 1;
if (h->u.weakdef != NULL) if (h->u.weakdef != NULL)