This is the mail archive of the binutils@sourceware.org mailing list for the binutils 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] | |
On Tue, May 31, 2016 at 11:02 AM, Sriraman Tallam <tmsriram@google.com> wrote:
> On Sat, May 28, 2016 at 10:44 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
>> On Fri, May 27, 2016 at 3:14 PM, Sriraman Tallam <tmsriram@google.com> wrote:
>>> On Fri, May 20, 2016 at 1:32 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>>>> On Fri, May 20, 2016 at 1:27 PM, Sriraman Tallam <tmsriram@google.com> wrote:
>>>>> Hi,
>>>>>
>>>>> GCC has option -fno-plt which converts all extern calls to indirect
>>>>> calls via GOT to prevent the linker for generating any PLT stubs.
>>>>> However, if the function ends up defined in the executable this patch
>>>>> will convert those indirect calls/jumps to direct. Since the indirect
>>>>> calls are one byte longer, an extra nop is needed at the beginning.
>>>>>
>>>>> Here is a simple example:
>>>>>
>>>>> main.c
>>>>> ---------
>>>>> extern int foo();
>>>>> int main() {
>>>>> return foo();
>>>>> }
>>>>>
>>>>> deffoo.c
>>>>> -----------
>>>>> int foo() {
>>>>> return 0;
>>>>> }
>>>>>
>>>>> $ gcc -fno-plt main.c deffoo.c
>>>>> $objdump -d a.out
>>>>>
>>>>> 0000000000400626 <main>:
>>>>> ...
>>>>> 40062a: ff 15 28 14 00 00 callq *0x1428(%rip) #
>>>>> 401a58 <_DYNAMIC+0x1d8>
>>>>>
>>>>> The call is indirect even though foo is defined in the executable.
>>>>>
>>>>> With this patch,
>>>>> 0000000000400606 <main>:
>>>>> ....
>>>>> 40060a: 90 nop
>>>>> 40060b: e8 03 00 00 00 callq 400613 <foo>
>>>>>
>>>>> The call is now direct with an extra nop.
>>>>>
>>>>>
>>>>
>>>> Please try ld, which uses 0x67 prefix (addr32) instead of nop.
>>>> Also for
>>>>
>>>> jmp *foo#GOTPCREL(%rip)
>>>>
>>>> ld converts it to
>>>>
>>>> jmp foo
>>>> nop
>>>
>>> I have modified the patch to keep it consistent with what ld produces.
>>>
>>> Please take another look.
>>>
>>> * x86_64.cc (can_convert_callq_to_direct): New function.
>>> Target_x86_64<size>::Scan::global: Check if an indirect call via
>>> GOT can be converted to direct.
>>> Target_x86_64<size>::Relocate::relocate: Change any indirect call
>>> via GOT that can be converted.
>>> * testsuite/Makefile.am (x86_64_indirect_call_to_direct.sh): New test.
>>> * testsuite/Makefile.in: Regenerate.
>>> * testsuite/x86_64_indirect_call_to_direct1.s: New file.
>>> * testsuite/x86_64_indirect_jump_to_direct1.s: New file.
>>>
>>
>> Do you need to check R_X86_64_REX_GOTPCRELX for branch?
>
> Ok, patch changed to not check for this and refactored a bit.
Ping, Is this patch ok now?
* x86_64.cc (can_convert_callq_to_direct): New function.
Target_x86_64<size>::Scan::global: Check if an indirect call via
GOT can be converted to direct.
Target_x86_64<size>::Relocate::relocate: Change any indirect call
via GOT that can be converted.
* testsuite/Makefile.am (x86_64_indirect_call_to_direct.sh): New test.
* testsuite/Makefile.in: Regenerate.
* testsuite/x86_64_indirect_call_to_direct1.s: New file.
* testsuite/x86_64_indirect_jump_to_direct1.s: New file.
Patch attached.
Thanks
Sri
>
> Thanks
> Sri
>
>>
>> --
>> H.J.
Attachment:
convert_indirect_call_patch.txt
Description: Text document
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |