summaryrefslogtreecommitdiff
path: root/sysdeps/x86_64/start.S
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2012-05-14 17:50:41 -0700
committerH.J. Lu <hjl.tools@gmail.com>2012-05-14 17:50:41 -0700
commit6cdef1ab3666b1a0e9c5b3892970bd2fc8211bf8 (patch)
tree8489c0c6aac58241d1b540e63be28779b6522cac /sysdeps/x86_64/start.S
parent245a11d7bd3bc44cd2b9f8598516287393705f76 (diff)
downloadglibc-6cdef1ab3666b1a0e9c5b3892970bd2fc8211bf8.tar.gz
Update sysdeps/x86_64/start.S for x32
Diffstat (limited to 'sysdeps/x86_64/start.S')
-rw-r--r--sysdeps/x86_64/start.S37
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. */