PATCH: Multiple sections with same name don't work

H. J. Lu hjl@lucon.org
Sat May 1 07:06:00 GMT 2004


On Fri, Apr 30, 2004 at 10:50:08PM -0700, H. J. Lu wrote:
> On Fri, Apr 30, 2004 at 10:12:01PM -0700, Zack Weinberg wrote:
> > Alan Modra <amodra@bigpond.net.au> writes:
> > 
> > > On Fri, Apr 30, 2004 at 08:43:00PM -0700, H. J. Lu wrote:
> > >> On Sat, May 01, 2004 at 12:29:13PM +0930, Alan Modra wrote:
> > >> > Actually, it is probably a mistake to try to support multiple sections
> > >> > of the same name in gas.  For instance, if you have two .text sections,
> > >> > how is gas supposed to evaluate ".long .text" ?
> > >> 
> > >> Will that be generated by compiler? If not, we can issue an error.
> > >
> > > The real question is: Do we need multiple sections of the same name
> > > in assembly files?  I don't think we do.
> > 
> > I need them in order to generate COMDAT sections compatible with the
> > HPUX linker.  gcc might emit e.g.
> > 
> >      .section .text 
> >      # non-COMDAT code  ...
> > 
> >      .section .text,"G",symbol_name,comdat
> >      # code for symbol_name ...
> > 
> >      .section .eh_frame
> >      # non-COMDAT unwind info ...
> > 
> >      .section .eh_frame,"G",symbol_name,comdat
> >      # unwind info for symbol_name ...
> > 
> 
> I am testing this patch now.
> 
> 
> H.J.

> 2004-04-30  H.J. Lu  <hongjiu.lu@intel.com>
> 
> 	* symbols.c (symbol_set_bfdsym): Don't reset BFD section symbol.
> 

This patch is not enough. Here is an updated one.


H.J.
-------------- next part --------------
2004-04-30  H.J. Lu  <hongjiu.lu@intel.com>

	* subsegs.c (section_symbol): Create a new section symbol if
	the existing one doesn't match.

	* symbols.c (symbol_set_bfdsym): Don't reset BFD section symbol.

--- gas/subsegs.c.same	2003-12-04 10:43:25.000000000 -0800
+++ gas/subsegs.c	2004-04-30 23:51:32.000000000 -0700
@@ -524,7 +524,9 @@ section_symbol (segT sec)
   else
     {
       s = symbol_find_base (sec->symbol->name, 0);
-      if (s == NULL)
+      /* We have to make sure it is the right symbol when we have
+	 multiple sections with the same section name.  */
+      if (s == NULL || S_GET_SEGMENT (s) != sec)
 	s = symbol_new (sec->symbol->name, sec, 0, &zero_address_frag);
       else
 	{
--- gas/symbols.c.same	2003-12-04 10:43:25.000000000 -0800
+++ gas/symbols.c	2004-04-30 23:52:45.000000000 -0700
@@ -2260,7 +2260,9 @@ symbol_set_bfdsym (symbolS *s, asymbol *
 {
   if (LOCAL_SYMBOL_CHECK (s))
     s = local_symbol_convert ((struct local_symbol *) s);
-  s->bsym = bsym;
+  /* Don't reset it if it is already a BFD section symbol.  */
+  if ((s->bsym->flags & BSF_SECTION_SYM) == 0)
+    s->bsym = bsym;
 }
 
 #endif /* BFD_ASSEMBLER */


More information about the Binutils mailing list