[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