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] |
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 review. Thanks Sri * 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.
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] |