[Issue 22172] New: GOT address is stored to EBX before every function call
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Tue Aug 3 06:41:05 UTC 2021
https://issues.dlang.org/show_bug.cgi?id=22172
Issue ID: 22172
Summary: GOT address is stored to EBX before every function
call
Product: D
Version: D2
Hardware: x86
OS: Linux
Status: NEW
Severity: normal
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: ibuclaw at gdcproject.org
It looks like DMD is loading the GOT into EBX before every function call.
i.e: Abridged version of objdump of a program (from issue 22170)
---
push %ebp
mov %esp,%ebp
sub $0x28,%esp
mov %ebx,-0x28(%ebp) # <- looks like a save (better push %ebx?)
mov %esi,-0x24(%ebp)
mov -0x1c(%ebp),%ebx # store GOT
call 147c8 <_D5mydll10multiply10FiZi at plt>
mov -0x1c(%ebp),%ebx # store GOT
call *%esi
mov -0x1c(%ebp),%ebx # store GOT
call 145b0 <_D5mydll1S3addMFiZi at plt>
mov -0x1c(%ebp),%ebx # store GOT
call 145b0 <_D5mydll1S3addMFiZi at plt>
mov -0x1c(%ebp),%ebx # store GOT
call 14560 <_D5mydll1I6createFZCQs1C at plt>
mov -0x1c(%ebp),%ebx # store GOT
mov (%eax),%ecx
call *0x4(%ecx)
xor %eax,%eax
mov -0x28(%ebp),%ebx # <- looks like a restore (better pop %ebx?)
mov -0x24(%ebp),%esi
leave
ret
---
Surely it'd be more efficient to load GOT in the prologue, then restore the
previous in the epilogue.
i.e: The above rewritten:
---
push %ebp
mov %esp,%ebp
sub $0x28,%esp
mov %ebx,-0x28(%ebp) # <- save previous GOT
mov %esi,-0x24(%ebp)
mov -0x1c(%ebp),%ebx # <- store GOT
call 147c8 <_D5mydll10multiply10FiZi at plt>
call *%esi
call 145b0 <_D5mydll1S3addMFiZi at plt>
call 145b0 <_D5mydll1S3addMFiZi at plt>
call 14560 <_D5mydll1I6createFZCQs1C at plt>
mov (%eax),%ecx
call *0x4(%ecx)
xor %eax,%eax
mov -0x28(%ebp),%ebx # <- restore previous GOT
mov -0x24(%ebp),%esi
leave
ret
---
--
More information about the Digitalmars-d-bugs
mailing list