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