diff options
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/generic/sysdep.h | 26 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/x86_64/sigaction.c | 5 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/x86_64/sysdep.h | 4 | ||||
-rw-r--r-- | sysdeps/x86_64/dl-machine.h | 73 |
4 files changed, 75 insertions, 33 deletions
diff --git a/sysdeps/generic/sysdep.h b/sysdeps/generic/sysdep.h index 3223c976e6..0feed3c4a8 100644 --- a/sysdeps/generic/sysdep.h +++ b/sysdeps/generic/sysdep.h @@ -66,5 +66,31 @@ # define cfi_offset(reg, off) # endif +#else /* ! ASSEMBLER */ +# ifdef HAVE_ASM_CFI_DIRECTIVES +# define CFI_STRINGIFY(Name) CFI_STRINGIFY2 (Name) +# define CFI_STRINGIFY2(Name) #Name +# define CFI_STARTPROC ".cfi_startproc" +# define CFI_ENDPROC ".cfi_endproc" +# define CFI_DEF_CFA(reg, off) \ + ".cfi_def_cfa " CFI_STRINGIFY(reg) "," CFI_STRINGIFY(off) +# define CFI_DEF_CFA_REGISTER(reg) \ + ".cfi_def_cfa_register " CFI_STRINGIFY(reg) +# define CFI_DEF_CFA_OFFSET(off) \ + ".cfi_def_cfa_offset " CFI_STRINGIFY(off) +# define CFI_ADJUST_CFA_OFFSET(off) \ + ".cfi_adjust_cfa_offset " CFI_STRINGIFY(off) +# define CFI_OFFSET(reg, off) \ + ".cfi_offset " CFI_STRINGIFY(reg) "," CFI_STRINGIFY(off) +# else +# define CFI_STARTPROC +# define CFI_ENDPROC +# define CFI_DEF_CFA(reg, off) +# define CFI_DEF_CFA_REGISTER(reg) +# define CFI_DEF_CFA_OFFSET(off) +# define CFI_ADJUST_CFA_OFFSET(off) +# define CFI_OFFSET(reg, off) +# endif #endif /* __ASSEMBLER__ */ + diff --git a/sysdeps/unix/sysv/linux/x86_64/sigaction.c b/sysdeps/unix/sysv/linux/x86_64/sigaction.c index 1d8ef6f34f..48cb447859 100644 --- a/sysdeps/unix/sysv/linux/x86_64/sigaction.c +++ b/sysdeps/unix/sysv/linux/x86_64/sigaction.c @@ -97,14 +97,15 @@ weak_alias (__libc_sigaction, sigaction) appropriate GDB maintainer. */ #define RESTORE(name, syscall) RESTORE2 (name, syscall) -#define RESTORE2(name, syscall) \ +# define RESTORE2(name, syscall) \ asm \ ( \ ".align 16\n" \ + CFI_STARTPROC "\n" \ "__" #name ":\n" \ " movq $" #syscall ", %rax\n" \ " syscall\n" \ + CFI_ENDPROC "\n" \ ); - /* The return code for realtime-signals. */ RESTORE (restore_rt, __NR_rt_sigreturn) diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h index e88c48a9e4..430ec86a5d 100644 --- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h +++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h @@ -132,11 +132,13 @@ 0: \ xorq %rdx, %rdx; \ subq %rax, %rdx; \ - pushq %rdx \ + pushq %rdx; \ + cfi_adjust_cfa_offset(8); \ PUSH_ERRNO_LOCATION_RETURN; \ call BP_SYM (__errno_location)@PLT; \ POP_ERRNO_LOCATION_RETURN; \ popq %rdx; \ + cfi_adjust_cfa_offset(-8); \ movl %edx, (%rax); \ orq $-1, %rax; \ jmp L(pseudo_end); diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h index c2eff579eb..964a4b422b 100644 --- a/sysdeps/x86_64/dl-machine.h +++ b/sysdeps/x86_64/dl-machine.h @@ -24,6 +24,7 @@ #define ELF_MACHINE_NAME "x86_64" #include <sys/param.h> +#include <sysdep.h> /* Return nonzero iff ELF header is compatible with the running host. */ static inline int __attribute__ ((unused)) @@ -136,14 +137,17 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) .globl _dl_runtime_resolve\n\ .type _dl_runtime_resolve, @function\n\ .align 16\n\ + " CFI_STARTPROC "\n\ _dl_runtime_resolve:\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\ @@ -152,28 +156,33 @@ _dl_runtime_resolve:\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(PLT did 2 pushes)\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\ \n\ .globl _dl_runtime_profile\n\ .type _dl_runtime_profile, @function\n\ .align 16\n\ + " CFI_STARTPROC "\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 72(%rsp), %rdx # Load return address if needed\n\ movq 64(%rsp), %rsi # Copy args pushed by PLT in register.\n\ movq %rsi,%r11 # Multiply by 24\n\ @@ -183,15 +192,17 @@ _dl_runtime_profile:\n\ movq 56(%rsp), %rdi # %rdi: link_map, %rsi: reloc_offset\n\ call profile_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_profile, .-_dl_runtime_profile\n\ .previous\n\ "); @@ -203,6 +214,7 @@ _dl_runtime_profile:\n\ .type _dl_runtime_resolve, @function\n\ .type _dl_runtime_profile, @function\n\ .align 16\n\ + " CFI_STARTPROC "\n\ _dl_runtime_resolve:\n\ _dl_runtime_profile:\n\ pushq %rax # Preserve registers otherwise clobbered.\n\ @@ -229,6 +241,7 @@ _dl_runtime_profile:\n\ popq %rax\n\ addq $16,%rsp # Adjust stack\n\ jmp *%r11 # Jump to function address.\n\ + " CFI_ENDPROC "\n\ .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\ .size _dl_runtime_profile, .-_dl_runtime_profile\n\ .previous\n\ |