[go-nuts] Re: Cross-compile macOS binary with cgo DNS resolver enabled

2018-09-10 Thread Julien Gricourt
I reported this issue as a potential go1.10 regression 
in https://github.com/golang/go/issues/27506.

On Thursday, August 30, 2018 at 10:54:08 PM UTC-7, Julien Gricourt wrote:
>
> I'm trying to cross-compile a macOS binary in Docker with the cgo DNS 
> resolver enabled. My understanding is that this is doable without setting 
> up a full macOS SDK toolchain, and by using the package from the macOS 
> distribution. However, I'm unable to make it work. Somehow the compiler 
> always rebuilds the net package from sources and the netgo DNS resolver 
> becomes the de facto. 
>
> Very short implementation I'm using for testing:
>
> package main
>
> import "net"
>
> func main() {
>net.LookupIP("google.com")
> }
>
> The build output shows that net.a is built from sources instead of picking 
> up /usr/local/go/pkg/darwin_amd64/net.a:
>
> $ ls -la /usr/local/go/pkg/darwin_amd64/net.a
> -rw-r--r-- 1 root root 1241304 Jun  6 23:51 
> /usr/local/go/pkg/darwin_amd64/net.a
>
> $ go clean -cache
>
> $ go build -x -o dns-test ./dns
> WORK=/tmp/go-build098597944
> mkdir -p $WORK/b002/
> cat >$WORK/b002/importcfg << 'EOF' # internal
> # import config
> importmap golang_org/x/net/route=vendor/golang_org/x/net/route
> packagefile context=/usr/local/go/pkg/darwin_amd64/context.a
> packagefile errors=/usr/local/go/pkg/darwin_amd64/errors.a
> packagefile 
> vendor/golang_org/x/net/route=/usr/local/go/pkg/darwin_amd64/vendor/golang_org/x/net/route.a
> packagefile 
> internal/nettrace=/usr/local/go/pkg/darwin_amd64/internal/nettrace.a
> packagefile internal/poll=/usr/local/go/pkg/darwin_amd64/internal/poll.a
> packagefile 
> internal/singleflight=/usr/local/go/pkg/darwin_amd64/internal/singleflight.a
> packagefile io=/usr/local/go/pkg/darwin_amd64/io.a
> packagefile math/rand=/usr/local/go/pkg/darwin_amd64/math/rand.a
> packagefile os=/usr/local/go/pkg/darwin_amd64/os.a
> packagefile runtime=/usr/local/go/pkg/darwin_amd64/runtime.a
> packagefile sort=/usr/local/go/pkg/darwin_amd64/sort.a
> packagefile sync=/usr/local/go/pkg/darwin_amd64/sync.a
> packagefile sync/atomic=/usr/local/go/pkg/darwin_amd64/sync/atomic.a
> packagefile syscall=/usr/local/go/pkg/darwin_amd64/syscall.a
> packagefile time=/usr/local/go/pkg/darwin_amd64/time.a
> EOF
> cd /usr/local/go/src/net
> /usr/local/go/pkg/tool/linux_amd64/compile -o $WORK/b002/_pkg_.a -trimpath 
> $WORK/b002 -p net -std -buildid _tpOUnWlUki4sCfaeRYL/_tpOUnWlUki4sCfaeRYL 
> -goversion go1.10.3 -D "" -importcfg $WORK/b002/importcfg -pack -c=4 
> ./addrselect.go ./cgo_stub.go ./conf.go ./dial.go ./dnsclient.go 
> ./dnsclient_unix.go ./dnsconfig_unix.go ./dnsmsg.go ./error_posix.go 
> ./fd_unix.go ./file.go ./file_unix.go ./hook.go ./hook_unix.go ./hosts.go 
> ./interface.go ./interface_bsd.go ./interface_darwin.go ./ip.go 
> ./iprawsock.go ./iprawsock_posix.go ./ipsock.go ./ipsock_posix.go 
> ./lookup.go ./lookup_unix.go ./mac.go ./net.go ./nss.go ./parse.go 
> ./pipe.go ./port.go ./port_unix.go ./rawconn.go ./sendfile_stub.go 
> ./sock_bsd.go ./sock_posix.go ./sockopt_bsd.go ./sockopt_posix.go 
> ./sockoptip_bsdvar.go ./sockoptip_posix.go ./sys_cloexec.go ./tcpsock.go 
> ./tcpsock_posix.go ./tcpsockopt_darwin.go ./tcpsockopt_posix.go 
> ./udpsock.go ./udpsock_posix.go ./unixsock.go ./unixsock_posix.go 
> ./writev_unix.go
> /usr/local/go/pkg/tool/linux_amd64/buildid -w $WORK/b002/_pkg_.a # internal
> cp $WORK/b002/_pkg_.a 
> /root/.cache/go-build/71/71d5652836fbf72132d2864101b08cfb7dc5657beaa4cd0804e7d893646a3d60-d
>  
> # internal
> mkdir -p $WORK/b001/
> cat >$WORK/b001/importcfg << 'EOF' # internal
> # import config
> packagefile net=$WORK/b002/_pkg_.a
> packagefile runtime=/usr/local/go/pkg/darwin_amd64/runtime.a
> EOF
> cd /workspace/src/go.example.com/dns
> /usr/local/go/pkg/tool/linux_amd64/compile -o $WORK/b001/_pkg_.a -trimpath 
> $WORK/b001 -p main -complete -buildid 
> t_6XipuZQQ3V_Rlugib8/t_6XipuZQQ3V_Rlugib8 -goversion go1.10.3 -D "" 
> -importcfg $WORK/b001/importcfg -pack -c=4 ./main.go
> /usr/local/go/pkg/tool/linux_amd64/buildid -w $WORK/b001/_pkg_.a # internal
> cp $WORK/b001/_pkg_.a 
> /root/.cache/go-build/35/35e87cb5622549aaa8a434a32334706a5b3862ff7d49ce9daf3b29ba88094f41-d
>  
> # internal
> cat >$WORK/b001/importcfg.link << 'EOF' # internal
> packagefile go.example.com/dns=$WORK/b001/_pkg_.a
> packagefile net=$WORK/b002/_pkg_.a
> packagefile runtime=/usr/local/go/pkg/darwin_amd64/runtime.a
> packagefile context=/usr/local/go/pkg/darwin_amd64/context.a
> packagefile errors=/usr/local/go/pkg/darwin_amd64/errors.a
> packagefile 
> vendor/golang_org/x/net/route=/usr/local/go/pkg/darwin_amd64/vendor/golang_org/x/net

[go-nuts] Cross-compile macOS binary with cgo DNS resolver enabled

2018-08-30 Thread Julien Gricourt
I'm trying to cross-compile a macOS binary in Docker with the cgo DNS 
resolver enabled. My understanding is that this is doable without setting 
up a full macOS SDK toolchain, and by using the package from the macOS 
distribution. However, I'm unable to make it work. Somehow the compiler 
always rebuilds the net package from sources and the netgo DNS resolver 
becomes the de facto. 

Very short implementation I'm using for testing:

package main

import "net"

func main() {
   net.LookupIP("google.com")
}

The build output shows that net.a is built from sources instead of picking 
up /usr/local/go/pkg/darwin_amd64/net.a:

$ ls -la /usr/local/go/pkg/darwin_amd64/net.a
-rw-r--r-- 1 root root 1241304 Jun  6 23:51 
/usr/local/go/pkg/darwin_amd64/net.a

$ go clean -cache

$ go build -x -o dns-test ./dns
WORK=/tmp/go-build098597944
mkdir -p $WORK/b002/
cat >$WORK/b002/importcfg << 'EOF' # internal
# import config
importmap golang_org/x/net/route=vendor/golang_org/x/net/route
packagefile context=/usr/local/go/pkg/darwin_amd64/context.a
packagefile errors=/usr/local/go/pkg/darwin_amd64/errors.a
packagefile 
vendor/golang_org/x/net/route=/usr/local/go/pkg/darwin_amd64/vendor/golang_org/x/net/route.a
packagefile 
internal/nettrace=/usr/local/go/pkg/darwin_amd64/internal/nettrace.a
packagefile internal/poll=/usr/local/go/pkg/darwin_amd64/internal/poll.a
packagefile 
internal/singleflight=/usr/local/go/pkg/darwin_amd64/internal/singleflight.a
packagefile io=/usr/local/go/pkg/darwin_amd64/io.a
packagefile math/rand=/usr/local/go/pkg/darwin_amd64/math/rand.a
packagefile os=/usr/local/go/pkg/darwin_amd64/os.a
packagefile runtime=/usr/local/go/pkg/darwin_amd64/runtime.a
packagefile sort=/usr/local/go/pkg/darwin_amd64/sort.a
packagefile sync=/usr/local/go/pkg/darwin_amd64/sync.a
packagefile sync/atomic=/usr/local/go/pkg/darwin_amd64/sync/atomic.a
packagefile syscall=/usr/local/go/pkg/darwin_amd64/syscall.a
packagefile time=/usr/local/go/pkg/darwin_amd64/time.a
EOF
cd /usr/local/go/src/net
/usr/local/go/pkg/tool/linux_amd64/compile -o $WORK/b002/_pkg_.a -trimpath 
$WORK/b002 -p net -std -buildid _tpOUnWlUki4sCfaeRYL/_tpOUnWlUki4sCfaeRYL 
-goversion go1.10.3 -D "" -importcfg $WORK/b002/importcfg -pack -c=4 
./addrselect.go ./cgo_stub.go ./conf.go ./dial.go ./dnsclient.go 
./dnsclient_unix.go ./dnsconfig_unix.go ./dnsmsg.go ./error_posix.go 
./fd_unix.go ./file.go ./file_unix.go ./hook.go ./hook_unix.go ./hosts.go 
./interface.go ./interface_bsd.go ./interface_darwin.go ./ip.go 
./iprawsock.go ./iprawsock_posix.go ./ipsock.go ./ipsock_posix.go 
./lookup.go ./lookup_unix.go ./mac.go ./net.go ./nss.go ./parse.go 
./pipe.go ./port.go ./port_unix.go ./rawconn.go ./sendfile_stub.go 
./sock_bsd.go ./sock_posix.go ./sockopt_bsd.go ./sockopt_posix.go 
./sockoptip_bsdvar.go ./sockoptip_posix.go ./sys_cloexec.go ./tcpsock.go 
./tcpsock_posix.go ./tcpsockopt_darwin.go ./tcpsockopt_posix.go 
./udpsock.go ./udpsock_posix.go ./unixsock.go ./unixsock_posix.go 
./writev_unix.go
/usr/local/go/pkg/tool/linux_amd64/buildid -w $WORK/b002/_pkg_.a # internal
cp $WORK/b002/_pkg_.a 
/root/.cache/go-build/71/71d5652836fbf72132d2864101b08cfb7dc5657beaa4cd0804e7d893646a3d60-d
 
# internal
mkdir -p $WORK/b001/
cat >$WORK/b001/importcfg << 'EOF' # internal
# import config
packagefile net=$WORK/b002/_pkg_.a
packagefile runtime=/usr/local/go/pkg/darwin_amd64/runtime.a
EOF
cd /workspace/src/go.example.com/dns
/usr/local/go/pkg/tool/linux_amd64/compile -o $WORK/b001/_pkg_.a -trimpath 
$WORK/b001 -p main -complete -buildid 
t_6XipuZQQ3V_Rlugib8/t_6XipuZQQ3V_Rlugib8 -goversion go1.10.3 -D "" 
-importcfg $WORK/b001/importcfg -pack -c=4 ./main.go
/usr/local/go/pkg/tool/linux_amd64/buildid -w $WORK/b001/_pkg_.a # internal
cp $WORK/b001/_pkg_.a 
/root/.cache/go-build/35/35e87cb5622549aaa8a434a32334706a5b3862ff7d49ce9daf3b29ba88094f41-d
 
# internal
cat >$WORK/b001/importcfg.link << 'EOF' # internal
packagefile go.example.com/dns=$WORK/b001/_pkg_.a
packagefile net=$WORK/b002/_pkg_.a
packagefile runtime=/usr/local/go/pkg/darwin_amd64/runtime.a
packagefile context=/usr/local/go/pkg/darwin_amd64/context.a
packagefile errors=/usr/local/go/pkg/darwin_amd64/errors.a
packagefile 
vendor/golang_org/x/net/route=/usr/local/go/pkg/darwin_amd64/vendor/golang_org/x/net/route.a
packagefile 
internal/nettrace=/usr/local/go/pkg/darwin_amd64/internal/nettrace.a
packagefile internal/poll=/usr/local/go/pkg/darwin_amd64/internal/poll.a
packagefile 
internal/singleflight=/usr/local/go/pkg/darwin_amd64/internal/singleflight.a
packagefile io=/usr/local/go/pkg/darwin_amd64/io.a
packagefile math/rand=/usr/local/go/pkg/darwin_amd64/math/rand.a
packagefile os=/usr/local/go/pkg/darwin_amd64/os.a
packagefile sort=/usr/local/go/pkg/darwin_amd64/sort.a
packagefile sync=/usr/local/go/pkg/darwin_amd64/sync.a
packagefile sync/atomic=/usr/local/go/pkg/darwin_amd64/sync/atomic.a
packagefile syscall=/usr/local/go/pkg/darwin_amd64/syscall.a
packagefile time=/usr/local/go/pkg/darwin_amd64/time.a