diff options
-rw-r--r-- | sysdeps/i386/Makefile | 1 | ||||
-rw-r--r-- | sysdeps/i386/dl-trampoline.S | 39 | ||||
-rw-r--r-- | sysdeps/i386/link-defines.sym | 18 |
3 files changed, 43 insertions, 15 deletions
diff --git a/sysdeps/i386/Makefile b/sysdeps/i386/Makefile index 922be06b33..9f12190e32 100644 --- a/sysdeps/i386/Makefile +++ b/sysdeps/i386/Makefile @@ -33,6 +33,7 @@ sysdep-CFLAGS += -mpreferred-stack-boundary=4 else ifeq ($(subdir),csu) sysdep-CFLAGS += -mpreferred-stack-boundary=4 +gen-as-const-headers += link-defines.sym else # Likewise, any function which calls user callbacks uses-callbacks += -mpreferred-stack-boundary=4 diff --git a/sysdeps/i386/dl-trampoline.S b/sysdeps/i386/dl-trampoline.S index f11972cb0d..7c72b03b19 100644 --- a/sysdeps/i386/dl-trampoline.S +++ b/sysdeps/i386/dl-trampoline.S @@ -17,6 +17,7 @@ <http://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <link-defines.h> .text .globl _dl_runtime_resolve @@ -161,24 +162,32 @@ _dl_runtime_profile: +4 free %esp free */ - subl $20, %esp - cfi_adjust_cfa_offset (20) - movl %eax, (%esp) - movl %edx, 4(%esp) - fstpt 8(%esp) - fstpt 20(%esp) +#if LONG_DOUBLE_SIZE != 12 +# error "long double size must be 12 bytes" +#endif + # Allocate space for La_i86_retval and subtract 12 free bytes. + subl $(LRV_SIZE - 12), %esp + cfi_adjust_cfa_offset (LRV_SIZE - 12) + movl %eax, LRV_EAX_OFFSET(%esp) + movl %edx, LRV_EDX_OFFSET(%esp) + fstpt LRV_ST0_OFFSET(%esp) + fstpt LRV_ST1_OFFSET(%esp) pushl %esp cfi_adjust_cfa_offset (4) - leal 36(%esp), %ecx - movl 56(%esp), %eax - movl 60(%esp), %edx + # Address of La_i86_regs area. + leal (LRV_SIZE + 4)(%esp), %ecx + # PLT2 + movl (LRV_SIZE + 4 + LR_SIZE)(%esp), %eax + # PLT1 + movl (LRV_SIZE + 4 + LR_SIZE + 4)(%esp), %edx call _dl_call_pltexit - movl (%esp), %eax - movl 4(%esp), %edx - fldt 20(%esp) - fldt 8(%esp) - addl $60, %esp - cfi_adjust_cfa_offset (-60) + movl LRV_EAX_OFFSET(%esp), %eax + movl LRV_EDX_OFFSET(%esp), %edx + fldt LRV_ST1_OFFSET(%esp) + fldt LRV_ST0_OFFSET(%esp) + # Restore stack before return. + addl $(LRV_SIZE + 4 + LR_SIZE + 4), %esp + cfi_adjust_cfa_offset (-(LRV_SIZE + 4 + LR_SIZE + 4)) ret cfi_endproc .size _dl_runtime_profile, .-_dl_runtime_profile diff --git a/sysdeps/i386/link-defines.sym b/sysdeps/i386/link-defines.sym new file mode 100644 index 0000000000..a63dcb9218 --- /dev/null +++ b/sysdeps/i386/link-defines.sym @@ -0,0 +1,18 @@ +#include "link.h" +#include <stddef.h> + +-- +LONG_DOUBLE_SIZE sizeof (long double) + +LR_SIZE sizeof (struct La_i86_regs) +LR_EDX_OFFSET offsetof (struct La_i86_regs, lr_edx) +LR_ECX_OFFSET offsetof (struct La_i86_regs, lr_ecx) +LR_EAX_OFFSET offsetof (struct La_i86_regs, lr_eax) +LR_EBP_OFFSET offsetof (struct La_i86_regs, lr_ebp) +LR_ESP_OFFSET offsetof (struct La_i86_regs, lr_esp) + +LRV_SIZE sizeof (struct La_i86_retval) +LRV_EAX_OFFSET offsetof (struct La_i86_retval, lrv_eax) +LRV_EDX_OFFSET offsetof (struct La_i86_retval, lrv_edx) +LRV_ST0_OFFSET offsetof (struct La_i86_retval, lrv_st0) +LRV_ST1_OFFSET offsetof (struct La_i86_retval, lrv_st1) |