[committed, PATCH] Remove Disp16|Disp32 from 64-bit direct branches

H.J. Lu hjl.tools@gmail.com
Tue May 12 15:43:00 GMT 2015


On Tue, May 12, 2015 at 8:37 AM, Michael Matz <matz@suse.de> wrote:
> Hi,
>
> On Tue, 12 May 2015, Jan Beulich wrote:
>
>> I don't think so - this looks quite okay. It would become more of an
>> issue when looking at other than relocatable object files (namely when
>> their image base is non-zero), or ones with .text exceeding 32k.
>
> Actually also that one is correctly printed I think (from a hello world
> main, where I added a jmprel16 +0):
>
> 000000000040055c <main>:
>   40055c:       55                      push   %rbp
>   40055d:       48 89 e5                mov    %rsp,%rbp
>   400560:       48 83 ec 30             sub    $0x30,%rsp
>   400564:       c6 45 d1 00             movb   $0x0,-0x2f(%rbp)
>   400568:       c6 45 d0 61             movb   $0x61,-0x30(%rbp)
>   40056c:       48 8d 45 d0             lea    -0x30(%rbp),%rax
>   400570:       48 89 c2                mov    %rax,%rdx
>   400573:       be 44 06 40 00          mov    $0x400644,%esi
>   400578:       66 e9 00 00             jmpw   57c <_init-0x3ffe8c>
>
> 000000000040057c <next>:
>   40057c:       bf 52 06 40 00          mov    $0x400652,%edi
>   ...
>
> It shows that rip is going to be truncated.
>

This is the same issue as

https://sourceware.org/bugzilla/show_bug.cgi?id=18386

On Intel processors, 0x66 prefix before direct 32-bit unconditional
call/jmp is ignored.  Whatever we do is wrong on AMD or Intel
processors.


-- 
H.J.



More information about the Binutils mailing list