This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[PATCH] Fix _dl_argv on alpha and sparc, fix tests-static


Hi!

This patch fixes two things: the test for whether run-program-prefix should
be empty cannot be done using ifeq, because that's at the parsing time while
we need to do the test at invocation time, because otherwise we call the
program through ld.so even if it is in tests-static.

The other issue is the reason why tst-mtrace is failing on alpha:
when alpha/sparc32/sparc64 copy down argv/envp/aux arrays, they don't update
_dl_argv, so it point usually somewhere into environment and mtrace is using
dladdr to print where the allocation comes from (and in the alpha case it
contained some spaces which mtrace program was confused about). I think
ia64 does it right.

I found also a bug in sparc64 dl-machine.h, where if there were some aux
entries, it looped back to copying environment, not aux data, so it could
copy more than it should.

2000-11-15  Jakub Jelinek  <jakub@redhat.com>

	* Makeconfig (run-program-prefix): Move test-static test into the
	variable.

	* sysdeps/alpha/dl-machine.h (RTLD_START): Update _dl_argv.
	* sysdeps/sparc/sparc32/dl-machine.h (RTLD_START): Likewise,
	schedule instructions.
	* sysdeps/sparc/sparc64/dl-machine.h (RTLD_START): Likewise,
	schedule instructions, fix a bug in copying auxiliary data.

--- libc/Makeconfig.jj	Thu Nov  2 17:08:05 2000
+++ libc/Makeconfig	Wed Nov 15 13:56:05 2000
@@ -495,12 +495,9 @@ sysdep-library-path = \
 $(subst $(empty) ,:,$(strip $(patsubst -Wl$(comma)-rpath-link=%, %,\
 				       $(filter -Wl$(comma)-rpath-link=%,\
 						$(sysdep-LDFLAGS)))))
-ifeq (,$(findstring $(notdir $(built-program-file)), $(tests-static)))
-run-program-prefix = $(elf-objpfx)$(rtld-installed-name) \
-		     --library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path))
-else
-run-program-prefix =
-endif
+run-program-prefix = $(if $(findstring $(notdir $(built-program-file)), $(tests-static)),, \
+			  $(elf-objpfx)$(rtld-installed-name) \
+			  --library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)))
 else
 run-program-prefix =
 endif
--- libc/sysdeps/alpha/dl-machine.h.jj	Wed Oct 25 11:14:38 2000
+++ libc/sysdeps/alpha/dl-machine.h	Wed Nov 15 11:25:49 2000
@@ -314,10 +314,14 @@ $fixup_stack:
 	   involves copying everything down, since the stack pointer must
 	   always be 16-byte aligned.  */
 	ldq	$2, 0($sp)
+	ldq	$5, _dl_argv
+	subq	$31, $1, $6
 	subq	$2, $1, $2
+	s8addq	$6, $5, $5
 	mov	$sp, $4
 	s8addq	$1, $sp, $3
 	stq	$2, 0($sp)
+	stq	$5, _dl_argv
 	/* Copy down argv.  */
 0:	ldq	$5, 8($3)
 	addq	$4, 8, $4
--- libc/sysdeps/sparc/sparc32/dl-machine.h.jj	Wed Oct 25 11:14:48 2000
+++ libc/sysdeps/sparc/sparc32/dl-machine.h	Wed Nov 15 10:57:59 2000
@@ -224,23 +224,29 @@ _dl_start_user:
 	sethi	%hi(__libc_stack_end), %g2
 	or	%g2, %lo(__libc_stack_end), %g2
 	ld	[%l7 + %g2], %l1
+	sethi	%hi(_dl_skip_args), %g2
 	add	%sp, 6*4, %l2
+	or	%g2, %lo(_dl_skip_args), %g2
 	st	%l2, [%l1]
   /* See if we were run as a command with the executable file name as an
      extra leading argument.  If so, adjust the contents of the stack.  */
-	sethi	%hi(_dl_skip_args), %g2
-	or	%g2, %lo(_dl_skip_args), %g2
 	ld	[%l7+%g2], %i0
 	ld	[%i0], %i0
 	tst	%i0
 	beq	3f
 	 ld	[%sp+22*4], %i5		/* load argc */
 	/* Find out how far to shift.  */
+	sethi	%hi(_dl_argv), %l3
+	or	%l3, %lo(_dl_argv), %l3
+	ld	[%l7+%l3], %l3
 	sub	%i5, %i0, %i5
+	ld	[%l3], %l4
 	sll	%i0, 2, %i2
 	st	%i5, [%sp+22*4]
+	sub	%l4, %i2, %l4
 	add	%sp, 23*4, %i1
 	add	%i1, %i2, %i2
+	st	%l4, [%l3]
 	/* Copy down argv */
 21:	ld	[%i2], %i3
 	add	%i2, 4, %i2
--- libc/sysdeps/sparc/sparc64/dl-machine.h.jj	Wed Oct 25 11:14:48 2000
+++ libc/sysdeps/sparc/sparc64/dl-machine.h	Wed Nov 15 11:06:14 2000
@@ -544,38 +544,43 @@ _start:
 _dl_start_user:
    /* Load the GOT register.  */
 1:	call	11f
-	sethi	%hi(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7
-11:	or	%l7,%lo(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7
-	add	%l7,%o7,%l7
-   /* Save the user entry point address in %l0.  */
-	mov	%o0,%l0
+	 sethi	%hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
+11:	or	%l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7
   /* Store the highest stack address.  */
 	sethi	%hi(__libc_stack_end), %g5
+	add	%l7, %o7, %l7
 	or	%g5, %lo(__libc_stack_end), %g5
+   /* Save the user entry point address in %l0.  */
+	mov	%o0, %l0
 	ldx	[%l7 + %g5], %l1
+	sethi	%hi(_dl_skip_args), %g5
 	add	%sp, 6*8, %l2
-	stx	%l2, [%l1]
    /* See if we were run as a command with the executable file name as an
       extra leading argument.  If so, we must shift things around since we
       must keep the stack doubleword aligned.  */
-	sethi	%hi(_dl_skip_args), %g5
 	or	%g5, %lo(_dl_skip_args), %g5
-	ldx	[%l7+%g5], %i0
+	stx	%l2, [%l1]
+	ldx	[%l7 + %g5], %i0
 	ld	[%i0], %i0
 	brz,pt	%i0, 2f
-	 ldx	[%sp+" __S(STACK_BIAS) "+22*8], %i5
+	 ldx	[%sp + " __S(STACK_BIAS) " + 22*8], %i5
 	/* Find out how far to shift.  */
+	sethi	%hi(_dl_argv), %l4
 	sub	%i5, %i0, %i5
-	sllx	%i0, 3, %i2
-	stx	%i5, [%sp+" __S(STACK_BIAS) "+22*8]
-	add	%sp, " __S(STACK_BIAS) "+23*8, %i1
-	add	%i1, %i2, %i2
+	or	%l4, %lo(_dl_argv), %l4
+	sllx	%i0, 3, %l6
+	ldx	[%l7 + %l4], %l4
+	stx	%i5, [%sp + " __S(STACK_BIAS) " + 22*8]
+	add	%sp, " __S(STACK_BIAS) " + 23*8, %i1
+	add	%i1, %l6, %i2
+	ldx	[%l4], %l5
 	/* Copy down argv.  */
 12:	ldx	[%i2], %i3
 	add	%i2, 8, %i2
 	stx	%i3, [%i1]
 	brnz,pt	%i3, 12b
 	 add	%i1, 8, %i1
+	sub	%l5, %l6, %l5
 	/* Copy down envp.  */
 13:	ldx	[%i2], %i3
 	add	%i2, 8, %i2
@@ -584,18 +589,19 @@ _dl_start_user:
 	 add	%i1, 8, %i1
 	/* Copy down auxiliary table.  */
 14:	ldx	[%i2], %i3
-	ldx	[%i2+8], %i4
+	ldx	[%i2 + 8], %i4
 	add	%i2, 16, %i2
 	stx	%i3, [%i1]
-	stx	%i4, [%i1+8]
-	brnz,pt	%i3, 13b
+	stx	%i4, [%i1 + 8]
+	brnz,pt	%i3, 14b
 	 add	%i1, 16, %i1
+	stx	%l5, [%l4]
   /* %o0 = _dl_loaded, %o1 = argc, %o2 = argv, %o3 = envp.  */
 2:	sethi	%hi(_dl_loaded), %o0
-	add	%sp, " __S(STACK_BIAS) "+23*8, %o2
+	add	%sp, " __S(STACK_BIAS) " + 23*8, %o2
 	orcc	%o0, %lo(_dl_loaded), %o0
 	sllx	%i5, 3, %o3
-	ldx	[%l7+%o0], %o0
+	ldx	[%l7 + %o0], %o0
 	add	%o3, 8, %o3
 	mov	%i5, %o1
 	add	%o2, %o3, %o3
@@ -604,7 +610,7 @@ _dl_start_user:
    /* Pass our finalizer function to the user in %g1.  */
 	sethi	%hi(_dl_fini), %g1
 	or	%g1, %lo(_dl_fini), %g1
-	ldx	[%l7+%g1], %g1
+	ldx	[%l7 + %g1], %g1
   /* Jump to the user's entry point and deallocate the extra stack we got.  */
 	jmp	%l0
 	 add	%sp, 6*8, %sp

	Jakub

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]