[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