runtime: call execname and getpagesize on Solaris
authorIan Lance Taylor <ian@gcc.gnu.org>
Fri, 1 Mar 2019 14:21:24 +0000 (14:21 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 1 Mar 2019 14:21:24 +0000 (14:21 +0000)
    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.

    Reviewed-on: https://go-review.googlesource.com/c/164739

From-SVN: r269315

gcc/go/gofrontend/MERGE
libgo/go/runtime/os3_solaris.go

index 4fffb516ddda9d7f7a2aaad757820e20d77e9678..43c8b6bf1eb1dda461f655f78872a23998a1e8af 100644 (file)
@@ -1,4 +1,4 @@
-d5e4595784fb744f5fa0e0f90e77de9b5448b793
+805c82cc141c593ea2f27d8614ecd204e2b5e76e
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index c19f797f5e0a89196dd5a4730336229d545c5657..e67d32c8054710b420b754fb08644bdebd2c9c30 100644 (file)
@@ -4,45 +4,19 @@
 
 package runtime
 
-import (
-       "runtime/internal/sys"
-       "unsafe"
-)
+import _ "unsafe"
 
 var executablePath string
 
-func sysargs(argc int32, argv **byte) {
-       n := argc + 1
-
-       // skip over argv, envp to get to auxv
-       for argv_index(argv, n) != nil {
-               n++
-       }
+//extern getexecname
+func getexecname() *byte
 
-       // skip NULL separator
-       n++
+//extern getpagesize
+func getpagesize() int32
 
-       // 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)))
-               }
-       }
+func sysargs(argc int32, argv **byte) {
+       physPageSize = uintptr(getpagesize())
+       executablePath = gostringnocopy(getexecname())
 }
 
 //go:linkname solarisExecutablePath os.solarisExecutablePath