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