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