This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] tile: Mark __tls_get_addr in gc_mark_hook


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=8e354058532d48dce19fdf0b2e0653609a69f19e

commit 8e354058532d48dce19fdf0b2e0653609a69f19e
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Wed Oct 18 15:46:57 2017 -0700

    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.

Diff:
---
 bfd/ChangeLog       |  6 ++++++
 bfd/elf32-tilepro.c | 12 ++++++++++--
 bfd/elfxx-tilegx.c  | 12 ++++++++++--
 3 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index c574a9a..a300d1c 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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>
 
 	* elf32-microblaze.c (microblaze_elf_check_relocs): Check for
diff --git a/bfd/elf32-tilepro.c b/bfd/elf32-tilepro.c
index 7ab60bb..0bdb6c4 100644
--- a/bfd/elf32-tilepro.c
+++ b/bfd/elf32-tilepro.c
@@ -1864,6 +1864,8 @@ tilepro_elf_gc_mark_hook (asection *sec,
      dealing with TLS optimization, ought to be !bfd_link_executable (info).  */
   if (bfd_link_pic (info))
     {
+      struct bfd_link_hash_entry *bh;
+
       switch (ELF32_R_TYPE (rel->r_info))
 	{
 	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
 	     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);
+	  bh = NULL;
+	  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);
 	  h->mark = 1;
 	  if (h->u.weakdef != NULL)
diff --git a/bfd/elfxx-tilegx.c b/bfd/elfxx-tilegx.c
index c9e860a..d7b0419 100644
--- a/bfd/elfxx-tilegx.c
+++ b/bfd/elfxx-tilegx.c
@@ -2103,6 +2103,8 @@ tilegx_elf_gc_mark_hook (asection *sec,
      dealing with TLS optimization, ought to be !bfd_link_executable (info).  */
   if (bfd_link_pic (info))
     {
+      struct bfd_link_hash_entry *bh;
+
       switch (TILEGX_ELF_R_TYPE (rel->r_info))
 	{
 	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
 	     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);
+	  bh = NULL;
+	  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);
 	  h->mark = 1;
 	  if (h->u.weakdef != NULL)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]