Hi Ian,

> Sorry about that.  I've committed this patch.

thanks.

unfortunately, things are considerably worse: syscall.lo fails to build
and go1 even ICEs:

/vol/gcc/src/hg/master/local/libgo/go/syscall/libcall_posix_utimesnano.go:13:1: 
error: redefinition of ‘UtimesNano’
   13 | func UtimesNano(path string, ts []Timespec) error {
      | ^
/vol/gcc/src/hg/master/local/libgo/go/syscall/libcall_linux_utimesnano.go:13:1: 
note: previous definition of ‘UtimesNano’ was here
   13 | func UtimesNano(path string, ts []Timespec) (err error) {
      | ^

The second file is Linux-only and needs a corresponding build guard.

/vol/gcc/src/hg/master/local/libgo/go/syscall/exec_unix.go:193:16: error: use 
of undefined type ‘SysProcAttr’
  193 |         Sys   *SysProcAttr
      |                ^
/vol/gcc/src/hg/master/local/libgo/go/syscall/exec_unix.go:235:15: error: 
reference to field ‘Chroot’ in object which has no fields or methods
  235 |         if sys.Chroot != "" {
      |               ^
/vol/gcc/src/hg/master/local/libgo/go/syscall/exec_unix.go:236:52: error: 
reference to field ‘Chroot’ in object which has no fields or methods
  236 |                 chroot, err = BytePtrFromString(sys.Chroot)
      |                                                    ^
/vol/gcc/src/hg/master/local/libgo/go/syscall/exec_unix.go:251:15: error: 
reference to field ‘Setctty’ in object which has no fields or methods
  251 |         if sys.Setctty && sys.Foreground {
      |               ^
/vol/gcc/src/hg/master/local/libgo/go/syscall/exec_unix.go:251:30: error: 
reference to field ‘Foreground’ in object which has no fields or methods
  251 |         if sys.Setctty && sys.Foreground {
      |                              ^
/vol/gcc/src/hg/master/local/libgo/go/syscall/exec_unix.go:254:15: error: 
reference to field ‘Setctty’ in object which has no fields or methods
  254 |         if sys.Setctty && sys.Ctty >= len(attr.Files) {
      |               ^
/vol/gcc/src/hg/master/local/libgo/go/syscall/exec_unix.go:254:30: error: 
reference to field ‘Ctty’ in object which has no fields or methods
  254 |         if sys.Setctty && sys.Ctty >= len(attr.Files) {
      |                              ^
/vol/gcc/src/hg/master/local/libgo/go/syscall/exec_unix.go:269:21: error: 
reference to undefined name ‘forkAndExecInChild’
  269 |         pid, err1 = forkAndExecInChild(argv0p, argvp, envvp, chroot, 
dir, attr, sys, p[1])
      |                     ^

I found that upstream has exec_libc.go for AIX and Solaris with the
missing SysProcAttr and forkAndExecInChild definitions.  It doesn't work
out of the box, though:

/vol/gcc/src/hg/master/local/libgo/go/syscall/exec_libc.go:63:9: error: 
reference to undefined name ‘execveLibc’
   63 |         execveLibc = execve
      |         ^
/vol/gcc/src/hg/master/local/libgo/go/syscall/exec_libc.go:137:25: error: 
reference to undefined name ‘_Pid_t’
  137 |                 pgrp := _Pid_t(sys.Pgid)
      |                         ^
/vol/gcc/src/hg/master/local/libgo/go/syscall/exec_libc.go:144:32: error: 
reference to undefined name ‘_Pid_t’
  144 |                         pgrp = _Pid_t(r1)
      |                                ^

For one, switching to Pid_t is needed:

--- /vol/gcc/src/go/go/dist-1.17/src/syscall/exec_libc.go	2021-08-13 22:10:42.000000000 +0000
+++ go/syscall/exec_libc.go	2021-08-13 22:41:34.028618677 +0000
@@ -134,14 +134,14 @@ func forkAndExecInChild(argv0 *byte, arg
 	}
 
 	if sys.Foreground {
-		pgrp := _Pid_t(sys.Pgid)
+		pgrp := Pid_t(sys.Pgid)
 		if pgrp == 0 {
 			r1, err1 = getpid()
 			if err1 != 0 {
 				goto childerror
 			}
 
-			pgrp = _Pid_t(r1)
+			pgrp = Pid_t(r1)
 		}
 
 		// Place process group in foreground.
Besides, support for execveLibc has been dropped in exec_unix.go
compared to upstream.

terminate called after throwing an instance of 'std::out_of_range'
  what():  vector::_M_range_check: __n (which is 1) >= this->size() (which is 1)
go1: internal compiler error: Abort
0xce1abf crash_signal
        /vol/gcc/src/hg/master/local/gcc/toplev.c:328

This went away after the fixes above.

Next, I get

/vol/gcc/src/hg/master/local/libgo/go/internal/syscall/unix/getrandom_solaris.go:10:15:
 error: imported and not used: unsafe
   10 |         "unsafe"
      |               ^
/vol/gcc/src/hg/master/local/libgo/go/internal/syscall/unix/getrandom_solaris.go:32:30:
 error: reference to undefined name 'getrandomUnsupported'
   32 |         if atomic.LoadInt32(&getrandomUnsupported) != 0 {
      |                              ^
/vol/gcc/src/hg/master/local/libgo/go/internal/syscall/unix/getrandom_solaris.go:41:44:
 error: reference to undefined name 'getrandomUnsupported'
   41 |                         atomic.StoreInt32(&getrandomUnsupported, 1)
      |                                            ^
make[4]: *** [Makefile:3008: internal/syscall/unix.lo] Error 1

The definition dropped compared to upstream.

/vol/gcc/src/hg/master/local/libgo/go/os/user/listgroups_unix.go:39:15: error: 
reference to undefined name ‘libc_getgrouplist’
   39 |         rv := libc_getgrouplist(nameC, userGID, &gidsC[0], &n)
      |               ^
/vol/gcc/src/hg/master/local/libgo/go/os/user/listgroups_unix.go:49:23: error: 
reference to undefined name ‘libc_getgrouplist’
   49 |                 rv := libc_getgrouplist(nameC, userGID, &gidsC[0], &n)
      |                       ^
make[6]: *** [Makefile:3008: os/user.lo] Error 1

I've added it to decls_solaris.go.

With those changes, libgo compiles and links.  Unfortunately, every
executable fails to link now:

Undefined                       first referenced
 symbol                             in file
syscall.setpgid                     ../i386-pc-solaris2.11/libgo/.libs/libgo.so
syscall.chroot1                     ../i386-pc-solaris2.11/libgo/.libs/libgo.so
syscall.getpid                      ../i386-pc-solaris2.11/libgo/.libs/libgo.so
syscall.fcntl1                      ../i386-pc-solaris2.11/libgo/.libs/libgo.so
syscall.execve                      ../i386-pc-solaris2.11/libgo/.libs/libgo.so
syscall.setgid                      ../i386-pc-solaris2.11/libgo/.libs/libgo.so
syscall.setsid                      ../i386-pc-solaris2.11/libgo/.libs/libgo.so
syscall.setuid                      ../i386-pc-solaris2.11/libgo/.libs/libgo.so
syscall.exit                        ../i386-pc-solaris2.11/libgo/.libs/libgo.so
syscall.write1                      ../i386-pc-solaris2.11/libgo/.libs/libgo.so
syscall.chdir                       ../i386-pc-solaris2.11/libgo/.libs/libgo.so
syscall.close                       ../i386-pc-solaris2.11/libgo/.libs/libgo.so
syscall.forkx                       ../i386-pc-solaris2.11/libgo/.libs/libgo.so
syscall.ioctl                       ../i386-pc-solaris2.11/libgo/.libs/libgo.so
syscall.dup2child                   ../i386-pc-solaris2.11/libgo/.libs/libgo.so
syscall.setgroups1                  ../i386-pc-solaris2.11/libgo/.libs/libgo.so
ld: fatal: symbol referencing errors
collect2: error: ld returned 1 exit status

They are declared in go/syscall/exec_libc.go, but I don't see the best
way to handle this.  I'm calling it a night now.

        Rainer

-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University


diff --git a/libgo/go/internal/syscall/unix/getrandom_solaris.go b/libgo/go/internal/syscall/unix/getrandom_solaris.go
--- a/libgo/go/internal/syscall/unix/getrandom_solaris.go
+++ b/libgo/go/internal/syscall/unix/getrandom_solaris.go
@@ -7,12 +7,13 @@ package unix
 import (
 	"sync/atomic"
 	"syscall"
-	"unsafe"
 )
 
 //extern getrandom
 func libc_getrandom(*byte, uintptr, uint32) uintptr
 
+var getrandomUnsupported int32 // atomic
+
 // GetRandomFlag is a flag supported by the getrandom system call.
 type GetRandomFlag uintptr
 
diff --git a/libgo/go/os/user/decls_solaris.go b/libgo/go/os/user/decls_solaris.go
--- a/libgo/go/os/user/decls_solaris.go
+++ b/libgo/go/os/user/decls_solaris.go
@@ -22,3 +22,6 @@ func libc_getgrnam_r(name *byte, grp *sy
 
 //extern __posix_getgrgid_r
 func libc_getgrgid_r(gid syscall.Gid_t, grp *syscall.Group, buf *byte, buflen syscall.Size_t, result **syscall.Group) int
+
+//extern getgrouplist
+func libc_getgrouplist(user *byte, group syscall.Gid_t, groups *syscall.Gid_t, ngroups *int32) int
diff --git a/libgo/go/syscall/exec_unix.go b/libgo/go/syscall/exec_unix.go
--- a/libgo/go/syscall/exec_unix.go
+++ b/libgo/go/syscall/exec_unix.go
@@ -328,6 +328,7 @@ func runtime_AfterExec()
 
 // execveLibc is non-nil on OS using libc syscall, set to execve in exec_libc.go; this
 // avoids a build dependency for other platforms.
+var execveLibc func(path uintptr, argv uintptr, envp uintptr) Errno
 var execveDarwin func(path *byte, argv **byte, envp **byte) error
 var execveOpenBSD func(path *byte, argv **byte, envp **byte) error
 
@@ -350,7 +351,10 @@ func Exec(argv0 string, argv []string, e
 	var err1 error
 	if runtime.GOOS == "solaris" || runtime.GOOS == "illumos" || runtime.GOOS == "aix" || runtime.GOOS == "hurd" {
 		// RawSyscall should never be used on Solaris, illumos, or AIX.
-		err1 = raw_execve(argv0p, &argvp[0], &envvp[0])
+		err1 = execveLibc(
+			uintptr(unsafe.Pointer(argv0p)),
+			uintptr(unsafe.Pointer(&argvp[0])),
+			uintptr(unsafe.Pointer(&envvp[0])))
 	} else if runtime.GOOS == "darwin" || runtime.GOOS == "ios" {
 		// Similarly on Darwin.
 		err1 = execveDarwin(argv0p, &argvp[0], &envvp[0])
diff --git a/libgo/go/syscall/libcall_linux_utimesnano.go b/libgo/go/syscall/libcall_linux_utimesnano.go
--- a/libgo/go/syscall/libcall_linux_utimesnano.go
+++ b/libgo/go/syscall/libcall_linux_utimesnano.go
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+// +build linux
+
 // GNU/Linux version of UtimesNano.
 
 package syscall

Reply via email to