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);
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 
21284 (AG Nuernberg)

Reply via email to