[PATCH] MIPS/Gas: Support .L/$ as the mark of local symbol

Maciej W. Rozycki macro@orcam.me.uk
Wed Feb 21 14:47:21 GMT 2024


On Wed, 21 Feb 2024, YunQiang Su wrote:

> > > In as.texi, there are lines:
> > >   A local symbol is any symbol beginning with certain local
> > >   label prefixes. By default, the local label prefix is
> > >   @samp{.L} for ELF systems or @samp{L} for traditional a.out
> > >   systems, but each target may have its own set of local
> > >   label prefixes.
> > >
> > > Let's support it for MIPS:
> > > 1) For OldABI, GCC uses "$" to mark local symbols, and
> > >    for NewABI, ".L" is used. So let's support both for
> > >    OldABI, and ".L" only for NewABI.
> > > 2) Emit an fatal error, if a local symbol is used, while
> > >    not defined, just like LLVM does.
> >
> >  I gather you want to avoid a case of an undefined reference making it to
> > output for a symbol whose name suggests its a local label, right?
> >
> >  But that seems like material for the generic part of GAS rather than the
> > MIPS backend only (and then specifically SVR4 PIC only and not non-PIC or
> > VxWorks, according to your code as submitted), so that all targets behave
> > consistently, and I can't see e.g. i386 GAS doing it.
> >
> >  So a question raises: what problem are you trying to solve?  Can you give
> > us a piece of code that you think is handled incorrectly by GAS, and why?
> >
> 
> main:
>      la $4,$hello
> 
> $ mipsel-linux-gnu-as -KPIC tt.s && objdump -dr a.out
> 
> 00000000 <main>:
>    0: 8f840000 lw a0,0(gp)
> 0: R_MIPS_GOT16 $hello
> 
> In this case, GAS treat $hello as an external symbol, so only a single
> R_MIPS_GOT16 is used.

 So that's indeed a waste of a GOT entry if `$hello' does end up local in 
the link, but I fail to see it being a problem itself.  It's no different 
from where you have forced an ordinary symbol local via a linker script 
really: it will have retained its individual GOT entry even though it 
cannot be preempted anymore and could well use a shared entry with an 
offset.

 If you're concerned as to the piece of GAS documentation you quoted, then 
refer to the paragraph that follows:

  "Local symbols are defined and used within the assembler, but they are 
normally not saved in object files.  Thus, they are not visible when 
debugging.  You may use the `-L' option (see Section 2.7 [Include Local 
Symbols], page 26) to retain the local symbols in the object files."

-- which clarifies that this is specifically about symbols automatically 
produced internally by GAS for its own use, e.g. referring to `.' will 
emit such a symbol.  In addition to the prefix described in the previous 
paragraph they use a non-printable character immediately following so as 
to make sure they don't clash with a symbol provided by assembly code 
supplied, cf. LOCAL_LABEL_CHAR.

 Then symbols supplied by assembly code are interpreted according to their 
attributes and an undefined symbol is necessarily global.  If the supplier 
of code produced non-compliant code, then the GIGO principle applies, GAS 
just does what it's been told to, just as will say a C compiler when you 
use a symbol from a reserved namespace in ordinary user code.  Tools must 
not stand in the way.

 If you think a warning would be useful here, then I guess that might be 
acceptable, but as I say that would have to go into a generic part of GAS.

  Maciej


More information about the Binutils mailing list