runtime: call execname and getpagesize on Solaris

Interpreting auxv as []uintptr is incorrect on 64-bit big-endian,
as auxv alternates a 32-bit int with a 64-bit pointer.

Patch from Rainer Orth.

Change-Id: I4edfb7bee85de397aa2ef1296976d3ca9b177066
Reviewed-on: https://go-review.googlesource.com/c/164739
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/libgo/go/runtime/os3_solaris.go b/libgo/go/runtime/os3_solaris.go
index c19f797..e67d32c 100644
--- a/libgo/go/runtime/os3_solaris.go
+++ b/libgo/go/runtime/os3_solaris.go
@@ -4,45 +4,19 @@
 
 package runtime
 
-import (
-	"runtime/internal/sys"
-	"unsafe"
-)
+import _ "unsafe"
 
 var executablePath string
 
+//extern getexecname
+func getexecname() *byte
+
+//extern getpagesize
+func getpagesize() int32
+
 func sysargs(argc int32, argv **byte) {
-	n := argc + 1
-
-	// skip over argv, envp to get to auxv
-	for argv_index(argv, n) != nil {
-		n++
-	}
-
-	// skip NULL separator
-	n++
-
-	// now argv+n is auxv
-	auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*sys.PtrSize))
-	sysauxv(auxv[:])
-}
-
-const (
-	_AT_NULL         = 0    // Terminates the vector
-	_AT_PAGESZ       = 6    // Page size in bytes
-	_AT_SUN_EXECNAME = 2014 // exec() path name
-)
-
-func sysauxv(auxv []uintptr) {
-	for i := 0; auxv[i] != _AT_NULL; i += 2 {
-		tag, val := auxv[i], auxv[i+1]
-		switch tag {
-		case _AT_PAGESZ:
-			physPageSize = val
-		case _AT_SUN_EXECNAME:
-			executablePath = gostringnocopy((*byte)(unsafe.Pointer(val)))
-		}
-	}
+	physPageSize = uintptr(getpagesize())
+	executablePath = gostringnocopy(getexecname())
 }
 
 //go:linkname solarisExecutablePath os.solarisExecutablePath