PR82687, g++.dg/asan/default-options-1.C fails with PR82575 fix
authorAlan Modra <amodra@gmail.com>
Tue, 24 Oct 2017 12:45:01 +0000 (23:15 +1030)
committerAlan Modra <amodra@gcc.gnu.org>
Tue, 24 Oct 2017 12:45:01 +0000 (23:15 +1030)
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

libiberty/ChangeLog
libiberty/simple-object-elf.c

index 46dc0fa7e04c26ada8d404f1da34b074a71a62eb..eb3cbc1819dfc940c02b886e05e389e57d8c806a 100644 (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
index 1afd3ebc951dd4ecfe1f3a6d6a620297c4ec747e..14f71053150890aecc8d500ac0e8f1f493bbe71b 100644 (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);