Hi Gerrit,

If I understand correctly, I believe you try to cross-compile Go
applications to the PowerPC e500 architecture and as a first step you are
porting Go to this architecture.

We recently ported Go applications such as Docker and its tools to
architectures not supported by upstream Go, but with an approach quite
different from yours (if I understood well).

The procedure we follow, is:

1. Build the gccgo cross-toolchain with Buildroot: Buildroot currently
builds a toolchain by first building a gcc-initial, then proceeding to
build a gcc-final.  We had to insert a new gcc compilation stage before
gcc-final can build the gccgo cross-compiler.  This additional gcc
compilation stage makes go-tools available in the native environment that
are required for building the gccgo cross-compiler tools when gcc-final is
built.  If I understand well this may be an important part of the solution
to your problem.

2. Patch the Buildroot environment to invoke gccgo as the compiler, rather
than gc, for compiling Go applications.  We are planning to upstream this
and the previous step to Buildroot in the coming months.

3. Implement Go system call bindings: The sys package of the Go runtime
implements system call bindings as part of gccgo (so part of gcc-final),
the golang-sys/unix package is (can be) shipped in the folder
golang-sys/unix of the application you want to build (this is Docker and
tools in our case).  The golang-sys package needs to be patched in each
application to produce correct system call bindings for your target
environment (so the PowerPC e500 in your case).  Most of our development
time was spent in this last step (it is tricky).

Using this procedure we have ported Docker and its dependencies and tools
to several ppc 32 bit architectures.

I hope this helps.

Hugo



On Tue, Oct 20, 2020 at 6:20 AM gerritbinnenmars <gerritbinnenm...@gmail.com>
wrote:

> Hello Ian,
> Thanks for the quick reaction. It seems my request was not clear.
> What I am doing is the other way around: using gccgo to build the "go" cmd.
> So clone the "go" source from github and then go build -compiler gccgo
> ./cmd/go
>
> Gerrit
>
> -------- Oorspronkelijk bericht --------
> Van: Ian Lance Taylor <i...@golang.org>
> Datum: 20-10-20 04:25 (GMT+01:00)
> Aan: Gerrit Binnenmars <gerritbinnenm...@gmail.com>
> Cc: golang-nuts <golang-nuts@googlegroups.com>
> Onderwerp: Re: [go-nuts] gccgo problem compiling go from source
>
> On Mon, Oct 19, 2020 at 2:06 PM Gerrit Binnenmars
> <gerritbinnenm...@gmail.com> wrote:
> >
> > I used crosstool-ng successfully to build a go compiler for ppc e500.
> > Unfortunately go build does not support ppc therefore go needs to be
> > build from source using the amd64 gccgo compiler that I also build
> > with crosstool-ng.
> >
> > Compiling go from source fails:
> > Problem: undefined name stdpkg in internal/goroot/gccgo.go
> >
> > I included the output of my build script below. Any help or tips are
> welcome.
> >
> > With kind regards,
> >
> > Gerrit Binnenmars
> >
> > Info:
> > This is crosstool-NG version 1.24.0.191_364ed7a
> > GO111MODULE=""
> > GOARCH="amd64"
> > GOBIN=""
> > GOCACHE="/home/maintain/.cache/go-build"
> > GOENV="/home/maintain/.config/go/env"
> > GOEXE=""
> > GOFLAGS=""
> > GOHOSTARCH="amd64"
> > GOHOSTOS="linux"
> > GOINSECURE=""
> > GOMODCACHE="/home/maintain/gonew/pkg/mod"
> > GONOPROXY=""
> > GONOSUMDB=""
> > GOOS="linux"
> > GOPATH="/home/maintain/gonew"
> > GOPRIVATE=""
> > GOPROXY="https://proxy.golang.org,direct";
> >
> GOROOT="/home/maintain/x-tools/x86_64-e500-linux-gnu/x86_64-e500-linux-gnu/sysroot/lib"
> > GOSUMDB="sum.golang.org"
> > GOTMPDIR=""
> >
> GOTOOLDIR="/home/maintain/x-tools/x86_64-e500-linux-gnu/x86_64-e500-linux-gnu/sysroot/lib/pkg/tool/linux_amd64"
> > GCCGO="/home/maintain/x-tools/x86_64-e500-linux-gnu/bin/gccgo"
> > AR="ar"
> > CC="/home/maintain/x-tools/x86_64-e500-linux-gnu/bin/gcc"
> > CXX="/home/maintain/x-tools/x86_64-e500-linux-gnu/bin/g++"
> > CGO_ENABLED="1"
> > GOMOD=""
> >
> CGO_CFLAGS="--with-sysroot=/home/maintain/x-tools/x86_64-e500-linux-gnu/x86_64-e500-linux-gnu/sysroot"
> > CGO_CPPFLAGS=""
> > CGO_CXXFLAGS="-g -O2"
> > CGO_FFLAGS="-g -O2"
> > CGO_LDFLAGS="-g -O2"
> > PKG_CONFIG="pkg-config"
> > GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0
> > -fdebug-prefix-map=/tmp/go-build355977706=/tmp/go-build
> > -gno-record-gcc-switches"
> > go version go1.15.2 linux/amd64
> > gccgo (GCC) 10.2.0
> > Copyright (C) 2020 Free Software Foundation, Inc.
> > This is free software; see the source for copying conditions.  There is
> NO
> > warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
> PURPOSE.
> >
> > WORK=/tmp/go-build273889551
> > mkdir -p $WORK/b100/
> > cd $WORK
> > /home/maintain/x-tools/x86_64-e500-linux-gnu/bin/gccgo
> > -fgo-importcfg=/dev/null -c -x c - -o /dev/null || true
> > cd /home/maintain/gonew/src/internal/goroot
> > /home/maintain/x-tools/x86_64-e500-linux-gnu/bin/gccgo -c -g -m64
> > -fdebug-prefix-map=$WORK=/tmp/go-build -gno-record-gcc-switches
> > -fgo-pkgpath=internal/goroot -o $WORK/b100/_go_.o -I
> > $WORK/b100/_importcfgroot_ ./gccgo.go
> > mkdir -p $WORK/b027/
> > mkdir -p $WORK/b027/_importcfgroot_/cmd/go/internal
> > ln -s
> /home/maintain/.cache/go-build/ad/ade44815e7af8b7305b2db4099ec5b08aafcbd6e374a2c13d8e99c2986ca93c6-d
> > $WORK/b027/_importcfgroot_/cmd/go/internal/libauth.a
> > ln -s
> /home/maintain/.cache/go-build/d2/d26f05f163d86aecfadfbb952dfef9a314aa1c84c23fddd39bce127ccc85d101-d
> > $WORK/b027/_importcfgroot_/cmd/go/internal/libcfg.a
> > mkdir -p $WORK/b027/_importcfgroot_/cmd/internal
> > ln -s
> /home/maintain/.cache/go-build/2f/2f6811b0804c481edbfd9952d1aac22414f84ee1aec229218b03956bf3f9aa7a-d
> > $WORK/b027/_importcfgroot_/cmd/internal/libbrowser.a
> > cd /home/maintain/gonew/src/cmd/go/internal/web
> > /home/maintain/x-tools/x86_64-e500-linux-gnu/bin/gccgo -c -g -m64
> > -fdebug-prefix-map=$WORK=/tmp/go-build -gno-record-gcc-switches
> > -fgo-pkgpath=cmd/go/internal/web -o $WORK/b027/_go_.o -I
> > $WORK/b027/_importcfgroot_ ./api.go ./http.go ./url.go ./url_other.go
> > # internal/goroot
> > src/internal/goroot/gccgo.go:24:10: error: reference to undefined name
> 'stdpkg'
> >    24 |   return stdpkg[path]
> >       |          ^
> > # cmd/go/internal/web
> > src/cmd/go/internal/web/api.go:92:45: error: reference to undefined
> > field or method 'Redacted'
> >    92 |   return nil, fmt.Errorf("reading %s: %v", u.Redacted(), err)
>
> It looks like you are using the "go" program to build the gccgo
> standard library.  That doesn't work.  The gccgo standard library must
> be built as part of GCC, using the usual configure/make commands used
> to build GCC itself.  When configuring GCC, use --enable-languages=go.
>
> Ian
>
> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/5f8e657e.1c69fb81.3e6dc.0cf4%40mx.google.com
> <https://groups.google.com/d/msgid/golang-nuts/5f8e657e.1c69fb81.3e6dc.0cf4%40mx.google.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAARrXCQjWG_eg94v7V8Eqo1_iKkC6PYLqpqy%2BwAk4gJ3ErCY0w%40mail.gmail.com.

Reply via email to