PR82687, g++.dg/asan/default-options-1.C fails with PR82575 fix

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.

	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.

From-SVN: r254042
This commit is contained in:
Alan Modra 2017-10-24 23:15:01 +10:30 committed by Alan Modra
parent 6a19d2a2ee
commit 160826fefd
2 changed files with 26 additions and 10 deletions

View File

@ -1,3 +1,10 @@
2017-10-24 Alan Modra <amodra@gmail.com>
PR lto/82687
PR lto/82575
* simple-object-elf.c (simple_object_elf_copy_lto_debug_sections):
Only make __gnu_lto symbols hidden.
2017-10-20 Alan Modra <amodra@gmail.com>
PR lto/82575

View File

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