Message ID | 20171019133004.GX27132@bubble.grove.modra.org |
---|---|
State | New |
Headers | show |
Series | PR82575, lto debugobj references __gnu_lto_slim, ld test liblto-17 fails | expand |
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); > >
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);