aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/x86_64/dl-machine.h
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/x86_64/dl-machine.h')
-rw-r--r--sysdeps/x86_64/dl-machine.h33
1 files changed, 18 insertions, 15 deletions
diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h
index 964a4b422b..8017c51677 100644
--- a/sysdeps/x86_64/dl-machine.h
+++ b/sysdeps/x86_64/dl-machine.h
@@ -217,13 +217,15 @@ _dl_runtime_profile:\n\
" CFI_STARTPROC "\n\
_dl_runtime_resolve:\n\
_dl_runtime_profile:\n\
- pushq %rax # Preserve registers otherwise clobbered.\n\
- pushq %rcx\n\
- pushq %rdx\n\
- pushq %rsi\n\
- pushq %rdi\n\
- pushq %r8\n\
- pushq %r9\n\
+ subq $56,%rsp\n\
+ " CFI_ADJUST_CFA_OFFSET(72)" # Incorporate PLT\n\
+ movq %rax,(%rsp) # Preserve registers otherwise clobbered.\n\
+ movq %rcx,8(%rsp)\n\
+ movq %rdx,16(%rsp)\n\
+ movq %rsi,24(%rsp)\n\
+ movq %rdi,32(%rsp)\n\
+ movq %r8,40(%rsp)\n\
+ movq %r9,48(%rsp)\n\
movq 64(%rsp), %rsi # Copy args pushed by PLT in register.\n\
movq %rsi,%r11 # Multiply by 24\n\
addq %r11,%rsi\n\
@@ -232,14 +234,15 @@ _dl_runtime_profile:\n\
movq 56(%rsp), %rdi # %rdi: link_map, %rsi: reloc_offset\n\
call fixup # Call resolver.\n\
movq %rax, %r11 # Save return value\n\
- popq %r9 # Get register content back.\n\
- popq %r8\n\
- popq %rdi\n\
- popq %rsi\n\
- popq %rdx\n\
- popq %rcx\n\
- popq %rax\n\
- addq $16,%rsp # Adjust stack\n\
+ movq 48(%rsp),%r9 # Get register content back.\n\
+ movq 40(%rsp),%r8\n\
+ movq 32(%rsp),%rdi\n\
+ movq 24(%rsp),%rsi\n\
+ movq 16(%rsp),%rdx\n\
+ movq 8(%rsp),%rcx\n\
+ movq (%rsp),%rax\n\
+ addq $72,%rsp # Adjust stack\n\
+ " CFI_ADJUST_CFA_OFFSET(-72)"\n\
jmp *%r11 # Jump to function address.\n\
" CFI_ENDPROC "\n\
.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\