aboutsummaryrefslogtreecommitdiff
path: root/libiberty/simple-object-elf.c
diff options
context:
space:
mode:
authoramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>2017-10-24 12:45:01 +0000
committeramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>2017-10-24 12:45:01 +0000
commit51aff68fd3296e0ebdc76defc983f00d86be2ad7 (patch)
treec72d263dff68680ad25620e43d5d51f190ada7b0 /libiberty/simple-object-elf.c
parent01a6e9e7771310ed9b7d0195033cb33e78e094b1 (diff)
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@254042 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libiberty/simple-object-elf.c')
-rw-r--r--libiberty/simple-object-elf.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/libiberty/simple-object-elf.c b/libiberty/simple-object-elf.c
index 1afd3ebc951..14f71053150 100644
--- a/libiberty/simple-object-elf.c
+++ b/libiberty/simple-object-elf.c
@@ -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);