On Tue, 24 Oct 2017, Alan Modra wrote:

> Was Re: PR82575, lto debugobj references __gnu_lto_slim, ld test liblto-17 
> fails
> On Fri, Oct 20, 2017 at 12:00:04AM +1030, Alan Modra wrote:
> >     PR lto/82575
> >     * simple-object-elf.c (simple_object_elf_copy_lto_debug_sections):
> >     Make discarded non-local symbols weak and hidden.
> 
> The problem with making discarded symbols hidden is that the
> non-default visibility is sticky.  When symbols other than the
> __gnu_lto ones are discarded that turns out to be a bad idea.

So a UNDEF weak hidden causes a later non-weak defined default
visibility symbol to become hidden?  The wonders of ELF ...

> Bootstrapped and regression tested powerpc64le-linux.  OK?

Ok.

Richard.

>       PR lto/82687
>       PR lto/82575
>       * simple-object-elf.c (simple_object_elf_copy_lto_debug_sections):
>       Only make __gnu_lto symbols hidden.  Delete outdated comment.
>       Silence ISO C warning.
> 
> diff --git a/libiberty/simple-object-elf.c b/libiberty/simple-object-elf.c
> index 1afd3eb..14f7105 100644
> --- a/libiberty/simple-object-elf.c
> +++ b/libiberty/simple-object-elf.c
> @@ -1088,6 +1088,7 @@ simple_object_elf_copy_lto_debug_sections 
> (simple_object_read *sobj,
>    off_t shstroff;
>    unsigned char *names;
>    unsigned int i;
> +  int changed;
>    int *pfnret;
>    const char **pfnname;
>  
> @@ -1161,7 +1162,6 @@ simple_object_elf_copy_lto_debug_sections 
> (simple_object_read *sobj,
>  
>    /* Mark sections as preserved that are required by to be preserved
>       sections.  */
> -  int changed;
>    do
>      {
>        changed = 0;
> @@ -1349,9 +1349,6 @@ simple_object_elf_copy_lto_debug_sections 
> (simple_object_read *sobj,
>                    and __gnu_lto_slim which otherwise cause endless
>                    LTO plugin invocation.  */
>                 if (st_shndx == SHN_COMMON)
> -                 /* Setting st_name to "" seems to work to purge
> -                    COMMON symbols (in addition to setting their
> -                    size to zero).  */
>                   discard = 1;
>                 /* We also need to remove symbols refering to sections
>                    we'll eventually remove as with fat LTO objects
> @@ -1368,17 +1365,29 @@ simple_object_elf_copy_lto_debug_sections 
> (simple_object_read *sobj,
>                     /* Make discarded symbols undefined and unnamed
>                        in case it is local.  */
>                     int bind = ELF_ST_BIND (*st_info);
> +                   int other = STV_DEFAULT;
> +                   size_t st_name;
> +
>                     if (bind == STB_LOCAL)
> -                     {
> -                       ELF_SET_FIELD (type_functions, ei_class, Sym,
> -                                      ent, st_name, Elf_Word, 0);
> -                       *st_other = STV_DEFAULT;
> -                     }
> +                     ELF_SET_FIELD (type_functions, ei_class, Sym,
> +                                    ent, st_name, Elf_Word, 0);
>                     else
>                       {
>                         bind = STB_WEAK;
> -                       *st_other = STV_HIDDEN;
> +                       st_name = ELF_FETCH_FIELD (type_functions, ei_class,
> +                                                  Sym, ent, st_name,
> +                                                  Elf_Word);
> +                       if (st_name < strsz)
> +                         {
> +                           char *p = strings + st_name;
> +                           if (p[0] == '_'
> +                               && p[1] == '_'
> +                               && strncmp (p + (p[2] == '_'),
> +                                           "__gnu_lto_", 10) == 0)
> +                             other = STV_HIDDEN;
> +                         }
>                       }
> +                   *st_other = other;
>                     *st_info = ELF_ST_INFO (bind, STT_NOTYPE);
>                     ELF_SET_FIELD (type_functions, ei_class, Sym,
>                                    ent, st_value, Elf_Addr, 0);

Reply via email to