[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: glibc on kfreebsd-amd64 (was: Re: segfaults on amd64, one more update)

Changes for 2nd variant are really small, could you please test them.



> The definition of argument passing into _startup is in ABI
> since draft 0.94 (January 2005).
> %rsp - 16-byte aligned pointer to stack, on top of stack is argc
> %rdx - destructor function or zero for none
> It was probably too late for FreeBSD to conform :-(
> It uses 8-byte aligned %rdi for argc, %rsp is aligned %rdi.
> All other registers are cleared, but without PCB_FULLCTX,
> some are used internally for context switch.
> Other solution without changing FreeBSD sources is to use %rsi 
> instead of %rdx. It is cleared also without PCB_FULLCTX.
> It might be better - non-threaded application will work also on stock 
> FreeBSD.
Index: sysdeps/kfreebsd/x86_64/dl-machine.h
--- sysdeps/kfreebsd/x86_64/dl-machine.h	(revision 1272)
+++ sysdeps/kfreebsd/x86_64/dl-machine.h	(working copy)
@@ -70,6 +70,8 @@
 	leaq _dl_fini(%rip), %rdx\n\
 	# And make sure %rdi points to argc stored on the stack.\n\
 	movq %r13, %rdi\n\
+	# put finalizer function also to %rsi\n\
+	movq %rdx, %rsi\n\
 	# Jump to the user's entry point.\n\
 	jmp *%r12\n\
Index: sysdeps/kfreebsd/x86_64/elf/start.S
--- sysdeps/kfreebsd/x86_64/elf/start.S	(revision 1272)
+++ sysdeps/kfreebsd/x86_64/elf/start.S	(working copy)
@@ -59,6 +59,9 @@
    FreeBSD decided to use %edi as pointer to stack and align %rsp,
    therefore on entry from system, %rsp=%rdi or %rsp=%rdi-8.
    on entry from ld.so glibc might set up it slightly differently 
+   %rdx is sometimes not cleared from kernel, we use %rsi instead
+   on entry from ld.so glibc sets both %rsi and %rdx   
 #include "bp-sym.h"
@@ -85,7 +88,7 @@
 	rtld_fini:	%r9
 	stack_end:	stack.	*/
-	movq %rdx, %r9		/* Address of the shared library termination
+	movq %rsi, %r9		/* Address of the shared library termination
 				   function.  */
 	movq 0(%rdi), %rsi	/* argument count.  */
 	leaq 8(%rdi), %rdx      /* argv starts just at above argc.  */

Reply to: