mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-19 01:50:34 +08:00
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:
parent
6a19d2a2ee
commit
160826fefd
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user