[Bug go/56171] syscall FAILs on Solaris

ro at CeBiTec dot Uni-Bielefeld.DE gcc-bugzilla@gcc.gnu.org
Tue Feb 12 14:44:00 GMT 2013


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56171

--- Comment #7 from ro at CeBiTec dot Uni-Bielefeld.DE <ro at CeBiTec dot Uni-Bielefeld.DE> 2013-02-12 14:43:41 UTC ---
> --- Comment #6 from Ian Lance Taylor <ian at airs dot com> 2013-02-11
> 19:16:41 UTC ---
[...]
> Note that this test case execs itself in a separate process, so when using
> truss you need to trace both processes to see what is happening.  The
> WriteMsgUnix failure is happening in the child process.  It indicates that
> sendmsg is returning an EBADF errno value, but I don't know why.
>
> One place to look would be the function UnixRights in syscall/sockcmsg_unix.go.
>  Is that the right format for passing a file descriptor on Solaris?

It turned out that there was a mismatch between configure.ac which
defines -D_XOPEN_SOURCE=500 for Solaris, and libcalls.go: the latter has
e.g.

//extern sendmsg

but according to <sys/socket.h>, we need

#ifdef    _XPG4_2
#ifdef    __PRAGMA_REDEFINE_EXTNAME
#pragma redefine_extname bind __xnet_bind
#pragma redefine_extname connect __xnet_connect
#pragma redefine_extname recvmsg __xnet_recvmsg
#pragma redefine_extname sendmsg __xnet_sendmsg
#pragma redefine_extname sendto __xnet_sendto
#pragma redefine_extname socket __xnet_socket
#pragma redefine_extname socketpair __xnet_socketpair
#pragma redefine_extname getsockopt __xnet_getsockopt

Depending on whether sendmsg or __xnet_sendmsg is used, the kernel
expects different variants of struct msghdr.

I hacked around this by manually adapting libcalls.go to use the __xnet_
forms, which allowed the test to pass.  I've not yet checked what's the
best way to handle this properly.

    Rainer



More information about the Gcc-bugs mailing list