diff mbox series

PR82575, lto debugobj references __gnu_lto_slim, ld test liblto-17 fails

Message ID 20171019133004.GX27132@bubble.grove.modra.org
State New
Headers show
Series PR82575, lto debugobj references __gnu_lto_slim, ld test liblto-17 fails | expand

Commit Message

Alan Modra Oct. 19, 2017, 1:30 p.m. UTC
Bootstrapped and regression tested powerpc64le-linux.  OK for trunk?

	PR lto/82575
	* simple-object-elf.c (simple_object_elf_copy_lto_debug_sections):
	Make discarded non-local symbols weak and hidden.

Comments

Richard Biener Oct. 19, 2017, 1:51 p.m. UTC | #1
On Fri, 20 Oct 2017, Alan Modra wrote:

> Bootstrapped and regression tested powerpc64le-linux.  OK for trunk?

Ok.

Thanks,
Richard.

> 	PR lto/82575
> 	* simple-object-elf.c (simple_object_elf_copy_lto_debug_sections):
> 	Make discarded non-local symbols weak and hidden.
> 
> diff --git a/libiberty/simple-object-elf.c b/libiberty/simple-object-elf.c
> index c394924..1afd3eb 100644
> --- a/libiberty/simple-object-elf.c
> +++ b/libiberty/simple-object-elf.c
> @@ -236,8 +236,10 @@ typedef struct
>  
>  #define STB_LOCAL	0	/* Local symbol */
>  #define STB_GLOBAL	1	/* Global symbol */
> +#define STB_WEAK	2	/* Weak global */
>  
>  #define STV_DEFAULT	0	/* Visibility is specified by binding type */
> +#define STV_HIDDEN	2	/* Can only be seen inside currect component */
>  
>  /* Functions to fetch and store different ELF types, depending on the
>     endianness and size.  */
> @@ -1365,18 +1367,25 @@ simple_object_elf_copy_lto_debug_sections (simple_object_read *sobj,
>  		    {
>  		      /* Make discarded symbols undefined and unnamed
>  		         in case it is local.  */
> -		      if (ELF_ST_BIND (*st_info) == STB_LOCAL)
> -			ELF_SET_FIELD (type_functions, ei_class, Sym,
> -				       ent, st_name, Elf_Word, 0);
> +		      int bind = ELF_ST_BIND (*st_info);
> +		      if (bind == STB_LOCAL)
> +			{
> +			  ELF_SET_FIELD (type_functions, ei_class, Sym,
> +					 ent, st_name, Elf_Word, 0);
> +			  *st_other = STV_DEFAULT;
> +			}
> +		      else
> +			{
> +			  bind = STB_WEAK;
> +			  *st_other = STV_HIDDEN;
> +			}
> +		      *st_info = ELF_ST_INFO (bind, STT_NOTYPE);
>  		      ELF_SET_FIELD (type_functions, ei_class, Sym,
>  				     ent, st_value, Elf_Addr, 0);
>  		      ELF_SET_FIELD (type_functions, ei_class, Sym,
>  				     ent, st_size, Elf_Word, 0);
>  		      ELF_SET_FIELD (type_functions, ei_class, Sym,
>  				     ent, st_shndx, Elf_Half, SHN_UNDEF);
> -		      *st_info = ELF_ST_INFO (ELF_ST_BIND (*st_info),
> -					      STT_NOTYPE);
> -		      *st_other = STV_DEFAULT;
>  		    }
>  		}
>  	      XDELETEVEC (strings);
> 
>
diff mbox series

Patch

diff --git a/libiberty/simple-object-elf.c b/libiberty/simple-object-elf.c
index c394924..1afd3eb 100644
--- a/libiberty/simple-object-elf.c
+++ b/libiberty/simple-object-elf.c
@@ -236,8 +236,10 @@  typedef struct
 
 #define STB_LOCAL	0	/* Local symbol */
 #define STB_GLOBAL	1	/* Global symbol */
+#define STB_WEAK	2	/* Weak global */
 
 #define STV_DEFAULT	0	/* Visibility is specified by binding type */
+#define STV_HIDDEN	2	/* Can only be seen inside currect component */
 
 /* Functions to fetch and store different ELF types, depending on the
    endianness and size.  */
@@ -1365,18 +1367,25 @@  simple_object_elf_copy_lto_debug_sections (simple_object_read *sobj,
 		    {
 		      /* Make discarded symbols undefined and unnamed
 		         in case it is local.  */
-		      if (ELF_ST_BIND (*st_info) == STB_LOCAL)
-			ELF_SET_FIELD (type_functions, ei_class, Sym,
-				       ent, st_name, Elf_Word, 0);
+		      int bind = ELF_ST_BIND (*st_info);
+		      if (bind == STB_LOCAL)
+			{
+			  ELF_SET_FIELD (type_functions, ei_class, Sym,
+					 ent, st_name, Elf_Word, 0);
+			  *st_other = STV_DEFAULT;
+			}
+		      else
+			{
+			  bind = STB_WEAK;
+			  *st_other = STV_HIDDEN;
+			}
+		      *st_info = ELF_ST_INFO (bind, STT_NOTYPE);
 		      ELF_SET_FIELD (type_functions, ei_class, Sym,
 				     ent, st_value, Elf_Addr, 0);
 		      ELF_SET_FIELD (type_functions, ei_class, Sym,
 				     ent, st_size, Elf_Word, 0);
 		      ELF_SET_FIELD (type_functions, ei_class, Sym,
 				     ent, st_shndx, Elf_Half, SHN_UNDEF);
-		      *st_info = ELF_ST_INFO (ELF_ST_BIND (*st_info),
-					      STT_NOTYPE);
-		      *st_other = STV_DEFAULT;
 		    }
 		}
 	      XDELETEVEC (strings);