hurd: Pass the data pointer to _hurd_stack_setup explicitly

Instead of relying on the stack frame layout to figure out where the stack
pointer was prior to the _hurd_stack_setup () call, just pass the pointer
as an argument explicitly. This is less brittle and much more portable.

Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
Message-ID: <20240103171502.1358371-8-bugaevc@gmail.com>
This commit is contained in:
Sergey Bugaev 2024-01-03 20:14:40 +03:00 committed by Samuel Thibault
parent 35694d3416
commit 24b707c166
3 changed files with 11 additions and 9 deletions

View File

@ -19,7 +19,10 @@
.text
.globl _start
_start:
pushl %esp
call _hurd_stack_setup
/* No need to "addl %4, %esp", since _hurd_stack_setup
* returns with an already adjusted stack pointer. */
xorl %edx, %edx
jmp _start1

View File

@ -197,7 +197,7 @@ strong_alias (posixland_init, __libc_init_first);
which should not exist at all. */
void
inhibit_stack_protector
_hurd_stack_setup (void)
_hurd_stack_setup (void **argptr)
{
/* This is the very first C code that runs in a statically linked
executable -- calling this function is the first thing that _start in
@ -206,14 +206,12 @@ _hurd_stack_setup (void)
_start1 expects the arguments, environment, and a Hurd data block to be
located at the top of the stack. The data may already be located there,
or we may need to receive it from the exec server. */
void *caller = __builtin_extract_return_addr (__builtin_return_address (0));
/* If the arguments and environment are already located on the stack, this is
where they are, just above our call frame. Note that this may not be a
valid pointer in case we're supposed to receive the arguments from the exec
server, so we can not dereference it yet. */
void **p = (void **) __builtin_frame_address (0) + 2;
or we may need to receive it from the exec server. If the data is located
on the stack (just above our call frame), argptr points to it. Note that
this may not be a valid pointer in case we're supposed to receive the
arguments from the exec server, so we can not dereference it yet. */
void *caller = __builtin_extract_return_addr (__builtin_return_address (0));
/* Init the essential things. */
first_init ();
@ -245,7 +243,7 @@ _hurd_stack_setup (void)
the stack pointer to the data (which is somewhere on the current stack
anyway). This way, _start1 find the data on the top of the stack, just as
it expects to. */
_hurd_startup (p, &doinit);
_hurd_startup (argptr, &doinit);
__builtin_unreachable ();
}
#endif

View File

@ -25,6 +25,7 @@ _start:
leaq __strlen_sse2(%rip), %rax
movq %rax, strlen@GOTPCREL(%rip)
movq %rsp, %rdi
call _hurd_stack_setup
xorq %rdx, %rdx
jmp _start1