<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/225226>225226</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [X86] lld silently truncates the resulting 32-bit GOT references instead of failing
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            lld
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          fzakaria
      </td>
    </tr>
</table>

<pre>
    In a binary larger than 2 GiB that displacement does not reach. `ld.lld` **writes the truncated value without a range check** on the TLS relaxation paths, so the result is not a link error but a silently miscompiled binary that segfaults on the first TLS access at runtime.

`lld/ELF/Arch/X86_64.cpp`, `X86_64::relaxTlsGdToIe` writes 32-bit displacements at three sites with no range check:

```cpp
 write32le(loc + 9, val - 9);   // TLSGD (PLTOFF64 form) -> IE
...
 write32le(loc + 8, val - 8);     // TLSGD -> IE
...
    loc[-2] = 0x8b;
 write32le(loc, val);             // TLSDESC -> IE
```

The corresponding *unrelaxed* paths in `X86_64::relocate` do call `checkInt(ctx, loc, val, 32, rel)`. Adding the same check to the relaxation paths
turns this from a silent miscompile into an ordinary `relocation ... out of range` link error.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJx0VFFvozoT_TXmZRTkDITCAw-kaapKlfaTNg_79skxA_jW2JFtuu399Vd2kia7d2-EEhTMOWfOnBnhvRoNUcs2W7bZZWIJk3Xt8Ld4E06J7Gj7z_bFgICjMsJ9ghZuJAdhEgYQntU23gbolT9pIWkmE6C35MHYAI6EnHJgFdd9rnXPKg4MO4bdT6cCeQgTQXCLkSJQD-9CLwQ_VZjsEkCAE2YkkBPJt_NbYE165fD6HRxp8SGCsgZOIkye4SN4mx478osOoM4iBGhl3oCcsw6OCdgrTSboT5iVl3Y-KU39tcBUjqdxEIsO_so4KOdD4hVSkvcgArjFBDVTzngXr4rHCnH_9LpnuO-cnBjuf9TV_6syl6cTq3iUyCp-_o8VHSu6VMVB--f-YF8o-nNxpsDVUf3qayINkyMCn85Ep8DYX3wqui855ytS8-4MW6AmhrW2EhhuoYmC3oWGVbxtWLEFAIZRfiz1eQcM6_-9Hr7t91UJg3UzwwZWrHiClyfGuzzP_wu6vkHXX9C_gf8LCAC0lWyzXSHb7IAVO-Af9ZEV2z_QXAjuwK-fG8nu6fvjHc2XJ2eLDhOBtM6RP1nTKzPGbC4mtYT6GLcULFDmD12zMbKxX70FKbSOR1IHXkxgWMvwEQXe63yEAuO3oyS64jl0faKNAfNivrQQwjXFvwWcd2FxJg6N8jA4O38l-S7HoEywIAxY158DzSp-0Ruh8jyHOF12OMcmlnCbjzzr26JvikZk1K4fGs4L_lBhNrVyaMpmjYUs1yjXXD6UKBtELCUv66akTLXIseINrhHLimOOnIphPayHoi7oQUpWcpqF0rnW73Nu3Zgp7xdqETeIVabFkbRPewgxTVIMQebaeHx1XEbPSq6VD_4GEFTQaXX9qKuYGK3722xf94q_2wnR7ctkPX87gKOBHBlJsck-kOijL4NQWpkxW5xupxBOPjY9ZWpUYVqOubQzw31UcflZnZz9i2RguE81eYb7S1nvLf4TAAD__y4arSo">