[PATCH] x86: Add tls check in gas

Cui, Lili lili.cui@intel.com
Wed Sep 4 07:46:12 GMT 2024


> > static bool
> > x86_check_tls_relocation (unsigned int r_type)
> >
> > > > +{
> > > > +  switch (r_type)
> > > > +    {
> > > > +    case BFD_RELOC_386_TLS_GOTDESC:
> > > > +      /* Check transition from GDesc access model:
> > > > +    leal x@tlsdesc(%ebx), %eax
> > > > +    call *x@tlsdesc(%eax)
> > > > +       */
> > > > +      if (i.tm.mnem_off == MN_call)
> > > > +   return true;
> > >
> > > There are two forms of CALL - I doubt both are allowed.

H.J, I am confused about "call *x@tlsdesc(%eax)", I don’t know how to handle it in the current patch.

For current gas, we bind it with BFD_RELOC_386_TLS_GOTDESC/ BFD_RELOC_X86_64_GOTPC32_TLSDESC. I also see it in the abi documentation.
But for the linker, R_386_TLS_GOTDESC/ R_X86_64_GOTPC32_TLSDESC only allow lea. It seems that the linker does not support "call *x@tlsdesc(%eax)".

> > > > +      /* fall through */
> > > > +    case BFD_RELOC_386_TLS_GD:
> > > > +      /*  Check transition from GD access model:
> > > > +     leal foo@tlsgd(,%ebx,1), %eax
> > > > +       */
> > > > +    case BFD_RELOC_386_TLS_LDM:
> > > > +      /*  Check transition from LDM access model:
> > > > +     leal foo@tlsldm(%ebx), %eax
> > > > +       */
> > > > +      if (i.tm.mnem_off == MN_lea)
> > > > +   return true;
> > >
> > > And which base/index registers are used doesn't matter? Nor operand
> > > size?
> >
> > We need to check base and index registers as well as operand size.
> > Only EBX is allowed.  This applies to all relocations.  Please check
> 
> I was wrong.
> 
>         leal    sh1@tlsldm(%ecx), %eax
>         call    *___tls_get_addr@GOT(%ecx)
> 
> is also allowed.
> 

Yes.

        leal foo@tlsldm(%reg), %eax --> Dest reg must be '%eax'
                                                                  Memory reg can't be %eax and SIB
                                                                  is not supported.

Thanks,
Lili.


More information about the Binutils mailing list