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