svn commit: r350587 - head/libexec/rtld-elf/powerpc64

Leandro Lupori luporl at FreeBSD.org
Mon Aug 5 13:22:03 UTC 2019


Author: luporl
Date: Mon Aug  5 13:22:02 2019
New Revision: 350587
URL: https://svnweb.freebsd.org/changeset/base/350587

Log:
  [PPC64] Fix rtld direct exec mode
  
  Instead of restoring the saved values of argc, argv and envp,
  these must be loaded from the stack that _rtld() modifies.
  
  This fixes rtld direct exec mode.
  E.g.: /libexec/ld-elf.so.1 /bin/ls
  
  Reviewed by:	jhibbits
  Differential Revision:	https://reviews.freebsd.org/D21131

Modified:
  head/libexec/rtld-elf/powerpc64/rtld_start.S

Modified: head/libexec/rtld-elf/powerpc64/rtld_start.S
==============================================================================
--- head/libexec/rtld-elf/powerpc64/rtld_start.S	Mon Aug  5 11:47:34 2019	(r350586)
+++ head/libexec/rtld-elf/powerpc64/rtld_start.S	Mon Aug  5 13:22:02 2019	(r350587)
@@ -38,9 +38,12 @@ _ENTRY(_rtld_start)
 	stdu    %r1,-144(%r1)	/* 16-byte aligned stack for reg saves +
 				exit_proc & obj _rtld args +
 				backchain & lrsave stack frame */
-	std     %r3,96(%r1)	/*  argc */
+
+	/* Save and restore only initial argv, because _rtld will modify
+	 * argv and envp if invoked explicitly, making it necessary to
+	 * load the (possibly) adjusted values from the stack.
+	 */
 	std     %r4,104(%r1)	/*  argv */
-	std     %r5,112(%r1)	/*  envp */
 /*	std     %r6,120(%r1)   *//*  obj (always 0) */
 /*	std     %r7,128(%r1)   *//*  cleanup (always 0) */
 	std     %r8,136(%r1)	/*  ps_strings */
@@ -94,9 +97,14 @@ _ENTRY(_rtld_start)
 	/*
 	 * Restore args, with new obj/exit proc
 	 */
-	ld      %r3,96(%r1)     /* argc */
-	ld      %r4,104(%r1)	/* argv */
-	ld      %r5,112(%r1)	/* envp */
+	ld	%r4,104(%r1)	/* argv */
+	ld	%r3,-8(%r4)	/* argc */
+
+	/* envp = argv + argc + 1 */
+	addi	%r5,%r3,1
+	sldi	%r5,%r5,3	/* x8 */
+	add	%r5,%r4,%r5
+
 	ld      %r6,120(%r1)	/* obj */
 	ld      %r7,128(%r1)	/* exit proc */
 	ld      %r8,136(%r1)	/* ps_strings */


More information about the svn-src-head mailing list