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