Hello, Hugo thanks for sharing your repo, I cloned the repo. Set the environment variables GOOS and GOARCH and called mkall.sh in the unix directory. The result is a generate:linux docker image and an _obj/_cgo_.o file in the unix directory next to a number of go files. So far this is as expected? Are there any plans to get it in the official golang/sys package?
I copied the resulting unix directory to the mender client directory and called the go build command of mender. This yielded: + env CGO_ENABLED=1 /home/maintain/crosstool-ng/crosstool-ng/.build/src/gcc-10.2.0/libgo/go/xgo build -work -p 1 -x -compiler gccgo -o mender_client_ppc ./src/github.com/mendersoftware/mender/client + tee log.txt GOARCH ppc compiler gc /* extra printf from xgo tool */ WORK=/tmp/go-build666945780 GOARCH ppc compiler gccgo /* extra printf from xgo tool */ src/github.com/mendersoftware/mender/vendor/github.com/sirupsen/logrus/terminal_check_unix.go:6:8: found packages unix (affinity_linux.go) and runtime (zsocket_definitions1_linux_ppc.go) in /home/maintain/mender/src/src/github.com/mendersoftware/mender/vendor/golang.org/x/sys/unix There is no error message but also no build result and it seems like go build stops. I have no idea how to continue. Any ideas? The mender client had a go.mod with: golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e With regards, Gerrit On Wednesday, October 28, 2020 at 11:12:18 AM UTC+1 hugo.c...@essensium.com wrote: > > > Hi all, > > I have set up a github repository with the system call bindings for > powerpc that we developed over the last months. > > https://github.com/hcornelis/golang-sys > > Branch 'ppc-system-calls-v1'. > > I compared the system call bindings that are available from > https://github.com/golang/go/issues/37443 and the system call bindings > that we developed for running Docker on powerpc 32 bit based systems. > > The status and differences can be summarized as: > > 1. We mapped a few system call bindings to call the 64 bit variant of the > system call (eg. fstat). This was necessary for our applications (Docker) > to work. > > 2. Our generated system call binding set is larger. I assume because of > differences in the used kernel header files and used options to generate > the system call bindings. > > 3. I also implemented changes in the scripts that generate the structs of > the bindings. For instance the epoll event struct had wrong alignment for > some of its members in our first version of the bindings, so this was > corrected by specific updates in the generator scripts (in > unix/mkpost.go). There was also a problem with Statfs_t struct. > > 4. I am not an expert wrt cgo, but if I understand correctly, through the > use of the cgo tool that is distributed with gccgo and knows ppc, we > avoided small problems with cgo invocation. > > 5. I believe (all) the patches we did to the generator script 'mkall.go' > are superseded by the upstream patches. > > Regards, > > Hugo > > > > On Fri, Oct 23, 2020 at 10:10 AM Hugo Cornelis <hugo.c...@essensium.com> > wrote: > >> >> Hi Gerrit, >> >> Yes, that was the plan, but it looks like powerpc support was already >> added to the sys/unix package last week. >> >> When we were working on this package we first had several subtle and >> difficult to debug problems. As part of debugging, we developed unit tests >> for validation of some of the system call bindings on powerpc using Qemu >> and a physical device. >> >> I still plan to check the differences between our version of these >> bindings and the upstream version and check if this could result in >> problems (from quickly looking at the commits I can say that our bindings >> should differ from the upstream version, but I have no idea about the >> impact). >> >> I will get back to this next week and post here what I find. >> >> Hugo >> >> >> On Thu, Oct 22, 2020 at 5:40 PM Gerrit Binnenmars <gerritbi...@gmail.com> >> wrote: >> >>> >>> >>> Hello Hugo, >>> >>> I did not succeed in getting crosstool-ng produce a go tool. Instead I >>> adapted the source of the "normal" go tool and simply removed the check and >>> added a fmt.Fprintf instead. It shows that even with go build -compiler >>> gccgo the test is first called with the gc compiler and then with the gccgo >>> compiler. So the test will always fail. I assume I still am doing something >>> wrong but don't understand what. >>> >>> Meanwhile with the adapted go tool I can build the mender client >>> application with the ppc gccgo compiler. Next problem is the missing >>> support for ppc in golang.org/x/sys/unix. >>> I also noticed that the community is interested in this: >>> https://github.com/golang/go/issues/37443 >>> Are you willing to share your unix package for ppc 32 bit architectures? >>> >>> With regards, Gerrit >>> On Tuesday, October 20, 2020 at 9:52:17 AM UTC+2 hugo.c...@essensium.com >>> wrote: >>> >>>> >>>> >>>> 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 <gerritbi...@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 <ia...@golang.org> >>>>> Datum: 20-10-20 04:25 (GMT+01:00) >>>>> Aan: Gerrit Binnenmars <gerritbi...@gmail.com> >>>>> Cc: golang-nuts <golan...@googlegroups.com> >>>>> Onderwerp: Re: [go-nuts] gccgo problem compiling go from source >>>>> >>>>> On Mon, Oct 19, 2020 at 2:06 PM Gerrit Binnenmars >>>>> <gerritbi...@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...@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...@googlegroups.com. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/golang-nuts/ee3608cf-b4e8-4d6e-b7bf-c2c3c0422feen%40googlegroups.com >>> >>> <https://groups.google.com/d/msgid/golang-nuts/ee3608cf-b4e8-4d6e-b7bf-c2c3c0422feen%40googlegroups.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/cab0ff1d-ed10-41bc-b7e3-1082e98eb8c7n%40googlegroups.com.