[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