diff options
author | Alan Modra <amodra@gmail.com> | 2017-10-24 23:15:01 +1030 |
---|---|---|
committer | Alan Modra <amodra@gcc.gnu.org> | 2017-10-24 23:15:01 +1030 |
commit | 160826fefd78b57a02adb87f9977b7fb31095084 (patch) | |
tree | c72d263dff68680ad25620e43d5d51f190ada7b0 /libiberty/simple-object-elf.c | |
parent | 6a19d2a2ee10ae74b77e3f2c0d85be2cda38cd54 (diff) | |
download | gcc-160826fefd78b57a02adb87f9977b7fb31095084.zip gcc-160826fefd78b57a02adb87f9977b7fb31095084.tar.gz gcc-160826fefd78b57a02adb87f9977b7fb31095084.tar.bz2 |
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
Diffstat (limited to 'libiberty/simple-object-elf.c')
-rw-r--r-- | libiberty/simple-object-elf.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/libiberty/simple-object-elf.c b/libiberty/simple-object-elf.c index 1afd3eb..14f7105 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); |