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)