diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2012-05-14 17:50:41 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2012-05-14 17:50:41 -0700 |
commit | 6cdef1ab3666b1a0e9c5b3892970bd2fc8211bf8 (patch) | |
tree | 8489c0c6aac58241d1b540e63be28779b6522cac /sysdeps | |
parent | 245a11d7bd3bc44cd2b9f8598516287393705f76 (diff) | |
download | glibc-6cdef1ab3666b1a0e9c5b3892970bd2fc8211bf8.tar.gz glibc-6cdef1ab3666b1a0e9c5b3892970bd2fc8211bf8.tar.xz glibc-6cdef1ab3666b1a0e9c5b3892970bd2fc8211bf8.zip |
Update sysdeps/x86_64/start.S for x32
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/x86_64/start.S | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/sysdeps/x86_64/start.S b/sysdeps/x86_64/start.S index 5e01d21179..e603463044 100644 --- a/sysdeps/x86_64/start.S +++ b/sysdeps/x86_64/start.S @@ -44,13 +44,13 @@ before this code runs. %rsp The stack contains the arguments and environment: - 0(%rsp) argc - 8(%rsp) argv[0] + 0(%rsp) argc + LP_SIZE(%rsp) argv[0] ... - (8*argc)(%rsp) NULL - (8*(argc+1))(%rsp) envp[0] + (LP_SIZE*argc)(%rsp) NULL + (LP_SIZE*(argc+1))(%rsp) envp[0] ... - NULL + NULL */ #include <sysdep.h> @@ -81,14 +81,21 @@ _start: rtld_fini: %r9 stack_end: stack. */ - movq %rdx, %r9 /* Address of the shared library termination + mov %RDX_LP, %R9_LP /* Address of the shared library termination function. */ +#ifdef __ILP32__ + mov (%rsp), %esi /* Simulate popping 4-byte argument count. */ + add $4, %esp +#else popq %rsi /* Pop the argument count. */ - movq %rsp, %rdx /* argv starts just at the current stack top. */ +#endif + /* argv starts just at the current stack top. */ + mov %RSP_LP, %RDX_LP /* Align the stack to a 16 byte boundary to follow the ABI. */ - andq $~15, %rsp + and $~15, %RSP_LP - pushq %rax /* Push garbage because we push 8 more bytes. */ + /* Push garbage because we push 8 more bytes. */ + pushq %rax /* Provide the highest stack address to the user code (for stacks which grow downwards). */ @@ -96,20 +103,20 @@ _start: #ifdef SHARED /* Pass address of our own entry points to .fini and .init. */ - movq __libc_csu_fini@GOTPCREL(%rip), %r8 - movq __libc_csu_init@GOTPCREL(%rip), %rcx + mov __libc_csu_fini@GOTPCREL(%rip), %R8_LP + mov __libc_csu_init@GOTPCREL(%rip), %RCX_LP - movq BP_SYM (main)@GOTPCREL(%rip), %rdi + mov BP_SYM (main)@GOTPCREL(%rip), %RDI_LP /* Call the user's main function, and exit with its value. But let the libc call main. */ call BP_SYM (__libc_start_main)@PLT #else /* Pass address of our own entry points to .fini and .init. */ - movq $__libc_csu_fini, %r8 - movq $__libc_csu_init, %rcx + mov $__libc_csu_fini, %R8_LP + mov $__libc_csu_init, %RCX_LP - movq $BP_SYM (main), %rdi + mov $BP_SYM (main), %RDI_LP /* Call the user's main function, and exit with its value. But let the libc call main. */ |