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]
Other format: [Raw text]

Re: [hjl@lucon.org: Re: your patch to remove unused sections]


On Tue, Apr 12, 2005 at 12:13:56AM +0930, Alan Modra wrote:
> On Mon, Apr 11, 2005 at 07:09:30AM -0700, H. J. Lu wrote:
> > Hi Alan,
> > 
> > Have you looked at this patch?
> 
> Yes, I was going to ask for a revision, but wanted to check whether my
> idea was feasible before asking you to make a change, which would remove
> the following loop:
> 
> > +	  /* .bss and similar sections won't have the linker_mark
> > +	     field set.  We have to check if its output section is
> > +	     included in output_bfd.  */
> > +	  for (sec = output_bfd->sections; sec != NULL; sec = sec->next)
> > +	    if (sec == sym->section->output_section)
> > +	      break;
> 
> I haven't had time to check, but here's the idea anyway:  After removing
> an unused output section s with bfd_section_list_remove (output_bfd, s),
> clear s->next.  Then
> 
>   if (sym->section->output_section->next == NULL
>       && *output_bfd->section_tail != sym->section->output_section)

It should be

  if (sym->section->output_section->next == NULL
      && output_bfd->section_tail != &sym->section->output_section->next)

>     {
>       /* The section has been removed.  */
>     }

This patch works for me.


H.J.
----
2005-04-11  H.J. Lu  <hongjiu.lu@intel.com>

	* linker.c (_bfd_generic_link_output_symbols): Also check if
	the output section of an input section has been removed from
	the output file.

	* section.c (bfd_section_list_remove): Clear the next field
	of the removed section.
	(bfd_section_removed_from_list): New.
	* bfd-in2.h: Regenerated.

--- bfd/linker.c.generic	2005-02-11 09:28:14.000000000 -0800
+++ bfd/linker.c	2005-04-11 09:47:58.000000000 -0700
@@ -2363,12 +2363,14 @@ _bfd_generic_link_output_symbols (bfd *o
 	abort ();
 
       /* If this symbol is in a section which is not being included
-	 in the output file, then we don't want to output the symbol.
-
-	 Gross.  .bss and similar sections won't have the linker_mark
-	 field set.  */
-      if ((sym->section->flags & SEC_HAS_CONTENTS) != 0
-	  && ! sym->section->linker_mark)
+	 in the output file, then we don't want to output the
+	 symbol.  .bss and similar sections won't have the linker_mark
+	 field set.  We also check if its output section has been
+	 removed from the output file.  */
+      if (((sym->section->flags & SEC_HAS_CONTENTS) != 0
+	   && ! sym->section->linker_mark)
+	  || bfd_section_removed_from_list (output_bfd,
+					    sym->section->output_section))
 	output = FALSE;
 
       if (output)
--- bfd/section.c.generic	2005-03-03 08:56:09.000000000 -0800
+++ bfd/section.c	2005-04-11 10:25:52.573055557 -0700
@@ -546,6 +546,8 @@ CODE_FRAGMENT
 .      *_ps = _s->next;					\
 .      if (_s->next == NULL)				\
 .        (ABFD)->section_tail = _ps;			\
+.      else						\
+.        _s->next = NULL;				\
 .    }							\
 .  while (0)
 .#define bfd_section_list_insert(ABFD, PS, S) \
@@ -559,6 +561,8 @@ CODE_FRAGMENT
 .        (ABFD)->section_tail = &_s->next;		\
 .    }							\
 .  while (0)
+.#define bfd_section_removed_from_list(ABFD, S)	\
+.  ((S)->next == NULL && &(S)->next != (ABFD)->section_tail)
 .
 */
 


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