[PATCH] D15769: [ELF] - implemented R_386_TLS_IE_32 relocation.

Rafael EspĂ­ndola via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 24 08:45:00 PST 2015


Do you know what uses gottpoff in x86? Looking at llvm it seems we
always produce gotntpoff.

Cheers,
Rafel


On 24 December 2015 at 09:18, George Rimar <grimar at accesssoftek.com> wrote:
> grimar added a comment.
>
> So problem I have in this patch is next. Assume we have the code below:
> movl %gs:0,%eax
> addl tls0 at gottpoff(%ebx),%eax
>
> movl %gs:0,%eax
> addl tls0 at gotntpoff(%ebx),%eax
>
> First sequence generates R_386_TLS_IE_32, second generates R_386_TLS_IE. And the problem is
> that such part of code looks to require 2 got entries. First one is entry for positive TLS offset,
> second is GOT entry for positive TLS offset.
> gold implementation contains enum allowing it to generate different GOT entries:
>
>   enum Got_type
>    {
>      GOT_TYPE_STANDARD = 0,      // GOT entry for a regular symbol
>      GOT_TYPE_TLS_NOFFSET = 1,   // GOT entry for negative TLS offset
>      GOT_TYPE_TLS_OFFSET = 2,    // GOT entry for positive TLS offset
>      GOT_TYPE_TLS_PAIR = 3,      // GOT entry for TLS module/offset pair
>      GOT_TYPE_TLS_DESC = 4       // GOT entry for TLS_DESC pair
>    };
>
> We don`t have types of GOT entries. All we have now is uint32_t GotPltIndex; in SymbolBody.
> Currently gold`s GOT_TYPE_TLS_OFFSET is only used for i386 R_386_TLS_IE_32 relocation so it is corner case.
> I dont know how much is possible for one symbol to reproduce the case like above and require 2 entries.
> So far I would suggest to check somehow that corner case and produce an "unsupported" error for now.
> We could rewrite code in next way:
> bool Regular = Target->requiresRegularGot(Type);
>
>   ...
>   unsigned IsRegularGot : 1;
>   bool SymbolBody::isInGot(bool Regular) const {
>     if (GotIndex == -1U)
>       return false;
>     if (IsRegularGot != Regular)
>       error("...");
>     return true;
>   }
>   ...
>   template <class ELFT> void GotSection<ELFT>::addEntry(SymbolBody *Sym, bool Regular) {
>     Sym->GotIndex = Target->getGotHeaderEntriesNum() + Entries.size();
>     Sym->IsRegularGot = Regular;
>     Entries.push_back(Sym);
>   }
>
> Another option would be to implement GOT entries types I think.
>
>
> http://reviews.llvm.org/D15769
>
>
>


More information about the llvm-commits mailing list