This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 02/10] addr32: Output REX prefix for UNSPEC_GOTNTPOFF


On Mon, Mar 5, 2012 at 7:31 AM, Uros Bizjak <ubizjak@gmail.com> wrote:
> On Fri, Mar 2, 2012 at 9:36 PM, H.J. Lu <hongjiu.lu@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.
>

The last byte of the displacement in the previous instruction
may happen to look like a REX byte. In that case, linker
will overwrite the last byte of the previous instruction and
generate the wrong instruction sequence.

I need to update linker to enforce the REX byte check.

-- 
H.J.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]