[PATCH] [ARC] More fixes for TLS.

Claudiu Zissulescu claudiu.zissulescu@synopsys.com
Fri Nov 9 15:03:00 GMT 2018


This is ok. Please fix the GNU styling issues and commit.

Cheers,
Claudiu

> -----Original Message-----
> From: cupertinomiranda@gmail.com [mailto:cupertinomiranda@gmail.com]
> Sent: Friday, November 09, 2018 1:25 PM
> To: binutils@sourceware.org
> Cc: francois.bedard@synopsys.com; cupertino.miranda@synopsys.com;
> claudiu.zissulescu@synopsys.com; Cupertino Miranda
> <cupertino.miranda@synopsys.com>
> Subject: [PATCH] [ARC] More fixes for TLS.
> 
> From: Cupertino Miranda <cmiranda@synopsys.com>
> 
> Good morning,
> 
> Just another patch for review.
> 
> Cheers,
> Cupertino Miranda
> 
> Added warning for static TLS reloc.
> 
> Fixed issue related to TLS and partial static linking of libraries:
>   This issue was detected when throwing exceptions in C++ while linking with
>   -static-libstdc++.
>   TLS relocation from the libstdc++ wasn't being patched as local now that it
> was
>   static linked with the executable.
> 
> Fix for TLS with static and pie. Problem introduced by earlier patch:
>   Fixes the following glibc tests:
>    - elf/tst-tls1-static
> 
> bfd/
>     xxxx-xx-xx  Cupertino Miranda  <cmiranda@synopsys.com>
> 
> 	    * arc-got.h (arc_got_entry_type_for_reloc): Changed to
> 	      correct static TLS relocs.
>             * elf32-arc.c (elf_arc_check_relocs): Introduced warning to
> 	      TLS relocs which require -fPIC.
> 	      (arc_create_forced_local_got_entries_for_tls): Created.
> 	      Traverses list of GOT entries to be resolved statically
> 	      when needed.
> 	      (elf_arc_finish_dynamic_sections): Changed. Calls
> 	      arc_create_forced_local_got_entries_for_tls for each known
> 	      possibly GOT symbol.
> ---
>  bfd/arc-got.h   |  33 +++++++++-------
>  bfd/elf32-arc.c | 116 +++++++++++++++++++++++++++++++++++++++++--
> -------------
>  2 files changed, 105 insertions(+), 44 deletions(-)
> 
> diff --git a/bfd/arc-got.h b/bfd/arc-got.h
> index 69e9aa3..253578b 100644
> --- a/bfd/arc-got.h
> +++ b/bfd/arc-got.h
> @@ -208,7 +208,7 @@ arc_got_entry_type_for_reloc (reloc_howto_type
> *howto)
>  		     __LINE__, name_for_global_symbol (H));		\
>        }									\
>      if (H)								\
> -      if (h->dynindx == -1 && !h->forced_local)				\
> +      if (H->dynindx == -1 && !H->forced_local)				\
>  	if (! bfd_elf_link_record_dynamic_symbol (info, H))		\
>  	  return FALSE;							\
>       htab->s##SECNAME->size += 4;					\
> @@ -284,6 +284,7 @@ relocate_fix_got_relocs_for_got_info (struct
> got_entry **	   list_p,
>    BFD_ASSERT (entry);
> 
>    if (h == NULL
> +      || h->forced_local == TRUE
>        || (! elf_hash_table (info)->dynamic_sections_created
>  	  || (bfd_link_pic (info)
>  	      && SYMBOL_REFERENCES_LOCAL (info, h))))
> @@ -331,27 +332,31 @@ relocate_fix_got_relocs_for_got_info (struct
> got_entry **	   list_p,
>  		BFD_ASSERT (tls_sec && tls_sec->output_section);
>  		bfd_vma sec_vma = tls_sec->output_section->vma;
> 
> -		bfd_put_32 (output_bfd,
> +		if (h == NULL || h->forced_local
> +		   || !elf_hash_table (info)->dynamic_sections_created)
> +		  {
> +		    bfd_put_32 (output_bfd,
>  			    sym_value - sec_vma
>  			    + (elf_hash_table (info)-
> >dynamic_sections_created
>  			       ? 0
> -			       : (align_power (TCB_SIZE,
> +			       : (align_power (0,
>  					       tls_sec->alignment_power))),
>  			    htab->sgot->contents + entry->offset
>  			    + (entry->existing_entries ==
> TLS_GOT_MOD_AND_OFF
>  			       ? 4 : 0));
> 
> -		ARC_DEBUG ("arc_info: FIXED -> %s value = %#lx "
> -			   "@ %lx, for symbol %s\n",
> -			   (entry->type == GOT_TLS_GD ? "GOT_TLS_GD" :
> -			    "GOT_TLS_IE"),
> -			   (long) (sym_value - sec_vma),
> -			   (long) (htab->sgot->output_section->vma
> -			      + htab->sgot->output_offset
> -			      + entry->offset
> -			      + (entry->existing_entries ==
> TLS_GOT_MOD_AND_OFF
> -				 ? 4 : 0)),
> -			   symbol_name);
> +		    ARC_DEBUG ("arc_info: FIXED -> %s value = %#lx "
> +			  "@ %lx, for symbol %s\n",
> +			  (entry->type == GOT_TLS_GD ? "GOT_TLS_GD" :
> +			   "GOT_TLS_IE"),
> +			  (long) (sym_value - sec_vma),
> +			  (long) (htab->sgot->output_section->vma
> +			     + htab->sgot->output_offset
> +			     + entry->offset
> +			     + (entry->existing_entries ==
> TLS_GOT_MOD_AND_OFF
> +				? 4 : 0)),
> +			  symbol_name);
> +		  }
>  	      }
>  	      break;
> 
> diff --git a/bfd/elf32-arc.c b/bfd/elf32-arc.c
> index 668642c..0a98b9f 100644
> --- a/bfd/elf32-arc.c
> +++ b/bfd/elf32-arc.c
> @@ -1989,36 +1989,35 @@ elf_arc_check_relocs (bfd *
> 	 abfd,
> 
>        switch (r_type)
>  	{
> -	  case R_ARC_32:
> -	  case R_ARC_32_ME:
> -	    /* During shared library creation, these relocs should not
> -	       appear in a shared library (as memory will be read only
> -	       and the dynamic linker can not resolve these.  However
> -	       the error should not occur for e.g. debugging or
> -	       non-readonly sections.  */
> -	    if (h != NULL
> -		&& (bfd_link_dll (info) && !bfd_link_pie (info))
> -		&& (sec->flags & SEC_ALLOC) != 0
> -		&& (sec->flags & SEC_READONLY) != 0
> -		&& ((sec->flags & SEC_CODE) != 0
> -		    || (sec->flags & SEC_DEBUGGING) != 0))
> -	      {
> -		const char *name;
> -		if (h)
> -		  name = h->root.root.string;
> -		else
> -		  /* bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);  */
> -		  name = "UNKNOWN";
> -		_bfd_error_handler
> -		  /* xgettext:c-format */
> -		  (_("%pB: relocation %s against `%s' can not be used"
> -		     " when making a shared object; recompile with -fPIC"),
> -		   abfd,
> -		   arc_elf_howto (r_type)->name,
> -		   name);
> -		bfd_set_error (bfd_error_bad_value);
> -		return FALSE;
> -	      }
> +	case R_ARC_32:
> +	case R_ARC_32_ME:
> +	  /* During shared library creation, these relocs should not
> +	     appear in a shared library (as memory will be read only
> +	     and the dynamic linker can not resolve these.  However
> +	     the error should not occur for e.g. debugging or
> +	     non-readonly sections.  */
> +	  if (h != NULL
> +	      && (bfd_link_dll (info) && !bfd_link_pie (info))
> +	      && (sec->flags & SEC_ALLOC) != 0
> +	      && (sec->flags & SEC_READONLY) != 0
> +	      && ((sec->flags & SEC_CODE) != 0
> +		  || (sec->flags & SEC_DEBUGGING) != 0))
> +	    {
> +	      const char *name;
> +	      if (h)
> +		name = h->root.root.string;
> +	      else
> +		name = "UNKNOWN";
> +	      _bfd_error_handler
> +	      /* xgettext:c-format */
> +	      (_("%pB: relocation %s against `%s' can not be used"
> +		 " when making a shared object; recompile with -fPIC"),
> +		 abfd,
> +		 arc_elf_howto (r_type)->name,
> +		 name);
> +	      bfd_set_error (bfd_error_bad_value);
> +	      return FALSE;
> +	    }
> 
>  	    /* In some cases we are not setting the 'non_got_ref'
>  	       flag, even though the relocations don't require a GOT
> @@ -2068,6 +2067,25 @@ elf_arc_check_relocs (bfd *			 abfd,
>        if (is_reloc_for_GOT (howto)
>  	  || is_reloc_for_TLS (howto))
>  	{
> +	  if (bfd_link_dll (info) && !bfd_link_pie (info)
> +	      && (r_type == R_ARC_TLS_LE_32 || r_type ==
> R_ARC_TLS_LE_S9))
> +	    {
> +	      const char *name;
> +	      if (h)
> +	        name = h->root.root.string;
> +	      else
> +	        /* bfd_elf_sym_name (abfd, symtab_hdr, isym, NULL);  */
> +	        name = "UNKNOWN";
> +	      _bfd_error_handler
> +	        /* xgettext:c-format */
> +	        (_("%pB: relocation %s against `%s' can not be used"
> +	           " when making a shared object; recompile with -fPIC"),
> +	         abfd,
> +	         arc_elf_howto (r_type)->name,
> +	         name);
> +	      bfd_set_error (bfd_error_bad_value);
> +	      return FALSE;
> +	    }
>  	  if (! _bfd_elf_create_got_section (dynobj, info))
>  	    return FALSE;
> 
> @@ -2490,6 +2508,38 @@ elf_arc_finish_dynamic_symbol (bfd *
> output_bfd,
>      s = bfd_get_linker_section (dynobj, SECTION);		\
>    break;
> 
> +
> +struct obfd_info_group {
> +  bfd *output_bfd;
> +  struct bfd_link_info *info;
> +};
> +
> +static bfd_boolean
> +arc_create_forced_local_got_entries_for_tls (struct bfd_hash_entry *bh,
> +					     void *data)
> +{
> +  struct elf_arc_link_hash_entry * h =
> +    (struct elf_arc_link_hash_entry *) bh;
> +  struct obfd_info_group *tmp = (struct obfd_info_group *) data;
> +
> +  if (h->got_ents != NULL)
> +    {
> +      BFD_ASSERT (h);
> +
> +      struct got_entry *list = h->got_ents;
> +
> +      while (list != NULL)
> +	{
> +	  create_got_dynrelocs_for_single_entry (list, tmp->output_bfd,
> +						 tmp->info, h);
> +	  list = list->next;
> +	}
> +    }
> +
> +  return TRUE;
> +}
> +
> +
>  /* Function :  elf_arc_finish_dynamic_sections
>     Brief    :  Finish up the dynamic sections handling.
>     Args     :  output_bfd :
> @@ -2623,6 +2673,12 @@ elf_arc_finish_dynamic_sections (bfd *
> output_bfd,
>  	}
>      }
> 
> +  struct obfd_info_group group;
> +  group.output_bfd = output_bfd;
> +  group.info = info;
> +  bfd_hash_traverse (&info->hash->table,
> +		     arc_create_forced_local_got_entries_for_tls, &group);
> +
>    return TRUE;
>  }
> 
> --
> 2.9.0



More information about the Binutils mailing list