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 <[email protected]>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB
21284 (AG Nuernberg)