August 03, 2021 [Issue 22172] New: GOT address is stored to EBX before every function call | ||||
|---|---|---|---|---|
| ||||
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@puremagic.com Reporter: ibuclaw@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@plt> mov -0x1c(%ebp),%ebx # store GOT call *%esi mov -0x1c(%ebp),%ebx # store GOT call 145b0 <_D5mydll1S3addMFiZi@plt> mov -0x1c(%ebp),%ebx # store GOT call 145b0 <_D5mydll1S3addMFiZi@plt> mov -0x1c(%ebp),%ebx # store GOT call 14560 <_D5mydll1I6createFZCQs1C@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@plt> call *%esi call 145b0 <_D5mydll1S3addMFiZi@plt> call 145b0 <_D5mydll1S3addMFiZi@plt> call 14560 <_D5mydll1I6createFZCQs1C@plt> mov (%eax),%ecx call *0x4(%ecx) xor %eax,%eax mov -0x28(%ebp),%ebx # <- restore previous GOT mov -0x24(%ebp),%esi leave ret --- -- | ||||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply