On Fri, Mar 2, 2012 at 9:36 PM, H.J. Lu <hongjiu...@intel.com> wrote:

> X86-64 linker optimizes TLS_MODEL_INITIAL_EXEC to TLS_MODEL_LOCAL_EXEC
> by checking
>
>        movq foo@gottpoff(%rip), %reg
>
> and
>
>        addq foo@gottpoff(%rip), %reg
>
> It uses the REX prefix to avoid the last byte of the previous
> instruction.  With 32bit Pmode, we may not have the REX prefix and
> the last byte of the previous instruction may be an offset, which
> may look like a REX prefix.  IE->LE optimization will generate corrupted
> binary.  This patch makes sure we always output an REX pfrefix for
> UNSPEC_GOTNTPOFF.  OK for trunk?

Actually, linker has:

    case R_X86_64_GOTTPOFF:
      /* Check transition from IE access model:
                mov foo@gottpoff(%rip), %reg
                add foo@gottpoff(%rip), %reg
       */

      /* Check REX prefix first.  */
      if (offset >= 3 && (offset + 4) <= sec->size)
        {
          val = bfd_get_8 (abfd, contents + offset - 3);
          if (val != 0x48 && val != 0x4c)
            {
              /* X32 may have 0x44 REX prefix or no REX prefix.  */
              if (ABI_64_P (abfd))
                return FALSE;
            }
        }
      else
        {
          /* X32 may not have any REX prefix.  */
          if (ABI_64_P (abfd))
            return FALSE;
          if (offset < 2 || (offset + 3) > sec->size)
            return FALSE;
        }

So, it should handle the case without REX just OK. If it doesn't, then
this is a bug in binutils.

Uros.

Reply via email to