This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


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

Re: [RFA:] test-case for relocs for linkonce-excluded sections don't become zero, causing g++ EH failure


On Sat, Sep 29, 2001 at 07:57:37PM +0930, Alan Modra wrote:
> I'll take a look at it - we might be able to get rid of kept_section
> as that was something I added to struct sec when writing this
> bit of code.

Yes, we can.  The test in cofflink.c is redundant, as all removed
link-once sections have their output_section set to bfd_abs_section.
All the other code accessing kept_section was involved in fudging
removed section sym values.

bfd/ChangeLog
	* section.c (struct sec): Remove kept_section.
	(STD_SECTION): Remove kept_section initialisation.
	(bfd_make_section_anyway): Here too.
	* ecoff.c (bfd_debug_section): Remove kept_section initialisation.
	* cofflink.c (_bfd_coff_link_input_bfd): Don't test kept_section.
	* elflink.h (elf_link_input_bfd): Set discarded link-once section
	symbols to zero, and remove all code involved with kept_section
	and tracking section symbol values.
	* bfd-in2.h: Regenerate.
	* configure.in: Bump version number.
	* configure: Regenerate.

ld/ChangeLog
	* ldlang.c (section_already_linked): Remove assignment to kept_section.

I also increased the bfd version to 2.11.92 with this patch, as the
change in struct sec will make bfd shared libs incompatible.

-- 
Alan Modra

Index: bfd/section.c
===================================================================
RCS file: /cvs/src/src/bfd/section.c,v
retrieving revision 1.35
diff -u -p -r1.35 section.c
--- section.c	2001/09/28 20:51:15	1.35
+++ section.c	2001/09/29 11:26:20
@@ -485,10 +485,6 @@ CODE_FRAGMENT
 .
 .  struct bfd_comdat_info *comdat;
 .
-.  {* Points to the kept section if this section is a link-once section,
-.     and is discarded.  *}
-.  struct sec *kept_section;
-.
 .  {* When a section is being output, this value changes as more
 .     linenumbers are written out.  *}
 .
@@ -599,8 +595,8 @@ static const asymbol global_syms[] =
     /* line_filepos, userdata, contents, lineno, lineno_count,       */	\
        0,            NULL,     NULL,     NULL,   0,			\
 									\
-    /* entsize, comdat, kept_section, moving_line_filepos,           */	\
-       0,       NULL,   NULL,         0,				\
+    /* entsize, comdat, moving_line_filepos,                         */	\
+       0,       NULL,   0,						\
 									\
     /* target_index, used_by_bfd, constructor_chain, owner,          */	\
        0,            NULL,        NULL,              NULL,		\
@@ -807,7 +803,6 @@ bfd_make_section_anyway (abfd, name)
   newsect->line_filepos = 0;
   newsect->owner = abfd;
   newsect->comdat = NULL;
-  newsect->kept_section = NULL;
 
   /* Create a symbol whos only job is to point to this section. This is
      useful for things like relocs which are relative to the base of a
Index: bfd/ecoff.c
===================================================================
RCS file: /cvs/src/src/bfd/ecoff.c,v
retrieving revision 1.11
diff -u -p -r1.11 ecoff.c
--- ecoff.c	2001/09/18 09:57:22	1.11
+++ ecoff.c	2001/09/29 11:26:07
@@ -86,8 +86,8 @@ static asection bfd_debug_section =
      NULL,       NULL,        0,           0,       0,
   /* line_filepos, userdata, contents, lineno, lineno_count,       */
      0,            NULL,     NULL,     NULL,   0,
-  /* entsize, comdat, kept_section, moving_line_filepos,           */
-     0,       NULL,   NULL,         0,
+  /* entsize, comdat, moving_line_filepos,                         */
+     0,       NULL,   0,
   /* target_index, used_by_bfd, constructor_chain, owner,          */
      0,            NULL,        NULL,              NULL,
   /* symbol,                                                       */
Index: bfd/cofflink.c
===================================================================
RCS file: /cvs/src/src/bfd/cofflink.c,v
retrieving revision 1.28
diff -u -p -r1.28 cofflink.c
--- cofflink.c	2001/09/20 23:30:34	1.28
+++ cofflink.c	2001/09/29 11:26:03
@@ -1516,15 +1516,13 @@ _bfd_coff_link_input_bfd (finfo, input_b
 
 #ifndef COFF_WITH_PE
       /* Skip section symbols for sections which are not going to be
-	 emitted, or which belong to linkonce sections that are going
-	 to be discarded.  */
+	 emitted.  */
       if (!skip
 	  && isym.n_sclass == C_STAT
 	  && isym.n_type == T_NULL
           && isym.n_numaux > 0)
         {
-          if ((*secpp)->output_section == bfd_abs_section_ptr
-              || (*secpp)->kept_section)
+          if ((*secpp)->output_section == bfd_abs_section_ptr)
             skip = true;
         }
 #endif
Index: bfd/elflink.h
===================================================================
RCS file: /cvs/src/src/bfd/elflink.h,v
retrieving revision 1.109
diff -u -p -r1.109 elflink.h
--- elflink.h	2001/09/29 06:21:58	1.109
+++ elflink.h	2001/09/29 11:26:15
@@ -5962,12 +5962,8 @@ elf_link_input_bfd (finfo, input_bfd)
 	    }
 	}
 
-      name = NULL;
       if (isym->st_shndx == SHN_UNDEF)
-        {
-	  isec = bfd_und_section_ptr;
-	  name = isec->name;
-	}
+	isec = bfd_und_section_ptr;
       else if (isym->st_shndx > 0 && isym->st_shndx < SHN_LORESERVE)
 	{
 	  isec = section_from_elf_index (input_bfd, isym->st_shndx);
@@ -5979,15 +5975,9 @@ elf_link_input_bfd (finfo, input_bfd)
 					  isym->st_value, (bfd_vma) 0);
 	}
       else if (isym->st_shndx == SHN_ABS)
-	{
-	  isec = bfd_abs_section_ptr;
-	  name = isec->name;
-	}
+	isec = bfd_abs_section_ptr;
       else if (isym->st_shndx == SHN_COMMON)
-	{
-	  isec = bfd_com_section_ptr;
-	  name = isec->name;
-	}
+	isec = bfd_com_section_ptr;
       else
 	{
 	  /* Who knows?  */
@@ -6002,39 +5992,18 @@ elf_link_input_bfd (finfo, input_bfd)
 
       if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
 	{
-	  asection *ksec;
-
-	  /* Save away all section symbol values.  */
-	  if (isec != NULL)
-	    {
-	      if (name)
-		{
-		  if (isec->symbol->value != isym->st_value)
-		    (*_bfd_error_handler)
-		      (_("%s: invalid section symbol index 0x%x (%s) ignored"),
-		       bfd_archive_filename (input_bfd), isym->st_shndx,
-		       name);
-		  continue;
-		}
-	      isec->symbol->value = isym->st_value;
-	    }
-
-	  /* If this is a discarded link-once section symbol, update
-	     it's value to that of the kept section symbol.  The
-	     linker will keep the first of any matching link-once
-	     sections, so we should have already seen it's section
-	     symbol.  I trust no-one will have the bright idea of
-	     re-ordering the bfd list...  */
+	  /* If this is a discarded link-once section symbol, set its
+	     value to 0.  We should really undefine it, and complain
+	     if anything in the final link tries to use it, but
+	     DWARF-based exception handling might have an entry in
+	     .eh_frame to describe a routine in the linkonce section,
+	     and it turns out to be hard to remove the .eh_frame entry
+	     too.  FIXME.  */
 	  if (isec != NULL
 	      && (bfd_get_section_flags (input_bfd, isec) & SEC_LINK_ONCE) != 0
-	      && (ksec = isec->kept_section) != NULL)
+	      && bfd_is_abs_section (isec->output_section))
 	    {
-	      isym->st_value = ksec->symbol->value;
-
-	      /* That put the value right, but the section info is all
-		 wrong.  I hope this works.  */
-	      isec->output_offset = ksec->output_offset;
-	      isec->output_section = ksec->output_section;
+	      isym->st_value = 0;
 	    }
 
 	  /* We never output section symbols.  Instead, we use the
Index: ld/ldlang.c
===================================================================
RCS file: /cvs/src/src/ld/ldlang.c,v
retrieving revision 1.62
diff -u -p -r1.62 ldlang.c
--- ldlang.c	2001/09/19 05:33:33	1.62
+++ ldlang.c	2001/09/29 11:27:01
@@ -1013,11 +1013,8 @@ section_already_linked (abfd, sec, data)
 
 	  /* Set the output_section field so that lang_add_section
 	     does not create a lang_input_section structure for this
-	     section.  Since there might be a symbol in the section
-	     being discarded, we must retain a pointer to the section
-	     which we are really going to use.  */
+	     section.  */
 	  sec->output_section = bfd_abs_section_ptr;
-	  sec->kept_section = l->sec;
 
 	  return;
 	}


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