This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Was Re: PR82575, lto debugobj references __gnu_lto_slim, ld test liblto-17 fails
On Fri, Oct 20, 2017 at 12:00:04AM +1030, Alan Modra wrote:
> 	PR lto/82575
> 	* simple-object-elf.c (simple_object_elf_copy_lto_debug_sections):
> 	Make discarded non-local symbols weak and hidden.

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.

Bootstrapped and regression tested powerpc64le-linux.  OK?

	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.

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

-- 
Alan Modra
Australia Development Lab, IBM


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]