Cross-compilation of pmm-agent for linux-ppc64le architecture on x86_64 linux [ RHEL 8 ]

Description:

Hello community.

First of all sorry for my noobieness in that matter, but as I don’t have much experience with C / GO development or compilation process and also I haven’t find much resources to help me resolve my issue with pmm-agent compilation, I would like to kindly ask for any hints or steps how to proceed.

I could successfuly compile “pmm”, “pmm-admin”, “mongodb_exporter”,… percona-tools and others packages which seem not to have many complex dependencies (my assumption). These also seem to be working when run on RHEL ppc64le machine.

I tried setting $CC or $CC_FOR_TARGET sys variables to my cross-compiler with no difference.
Many thanks for any ideas & help in advance. I really have no other clue on how to troubleshoot & proceed next.

Steps to Reproduce:

Operating System:
ORACLE_SUPPORT_PRODUCT=“Oracle Linux”
ORACLE_SUPPORT_PRODUCT_VERSION=8.7
Red Hat Enterprise Linux release 8.7 (Ootpa)

Go version:
go version go1.19.13 linux/amd64

my go environment:
go env
GO111MODULE=“”
GOARCH=“amd64”
GOBIN=“”
GOCACHE=“/root/.cache/go-build”
GOENV=“/root/.config/go/env”
GOEXE=“”
GOEXPERIMENT=“”
GOFLAGS=“”
GOHOSTARCH=“amd64”
GOHOSTOS=“linux”
GOINSECURE=“”
GOMODCACHE=“/root/go/pkg/mod”
GONOPROXY=“”
GONOSUMDB=“”
GOOS=“linux”
GOPATH=“/root/go”
GOPRIVATE=“”
GOPROXY=“https://proxy.golang.org,direct”
GOROOT=“/usr/lib/golang”
GOSUMDB=“sum.golang.org
GOTMPDIR=“”
GOTOOLDIR=“/usr/lib/golang/pkg/tool/linux_amd64”
GOVCS=“”
GOVERSION=“go1.19.13”
GCCGO=“gccgo”
GOAMD64=“v1”
AR=“ar”
CC=“gcc”
CXX=“g++”
CGO_ENABLED=“1”
GOMOD=“/root/pmm/go.mod”
GOWORK=“”
CGO_CFLAGS=“-g -O2”
CGO_CPPFLAGS=“”
CGO_CXXFLAGS=“-g -O2”
CGO_FFLAGS=“-g -O2”
CGO_LDFLAGS=“-g -O2”
PKG_CONFIG=“pkg-config”
GOGCCFLAGS=“-fPIC -m64 -pthread -Wl,–no-gc-sections -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build2482233786=/tmp/go-build -gno-record-gcc-switches”

env CGO_ENABLED=1 GOARCH=ppc64le GOOS=linux go build -v -x -ldflags “-ldflags=”-extld=$CC"" -tags ‘osusergo netgo static_build’ -o …/bin/pmm-agent

Logs:

cd /root/pmm
git status --porcelain
cd /root/pmm
git -c log.showsignature=false show -s --format=%H:%ct
runtime/cgo
mkdir -p $WORK/b061/
cd /usr/lib/golang/src/runtime/cgo
TERM=‘dumb’ CGO_LDFLAGS=‘“-g” “-O2” “-lpthread”’ /usr/lib/golang/pkg/tool/linux_amd64/cgo -objdir $WORK/b061/ -importpath runtime/cgo -import_runtime_cgo=false -import_syscall=false – -I $WORK/b061/ -g -O2 -Wall -Werror -fno-stack-protector ./cgo.go
cd $WORK
gcc -fno-caret-diagnostics -c -x c - -o /dev/null || true
gcc -Qunused-arguments -c -x c - -o /dev/null || true
gcc -Wl,–no-gc-sections -x c - -o /dev/null || true
gcc -fdebug-prefix-map=a=b -c -x c - -o /dev/null || true
gcc -gno-record-gcc-switches -c -x c - -o /dev/null || true
cd $WORK/b061
TERM=‘dumb’ gcc -I /usr/lib/golang/src/runtime/cgo -fPIC -pthread -Wl,–no-gc-sections -fmessage-length=0 -fdebug-prefix-map=$WORK/b061=/tmp/go-build -gno-record-gcc-switches -I ./ -g -O2 -Wall -Werror -fno-stack-protector -fdebug-prefix-map=/usr/lib/golang/src/runtime/cgo=/_/runtime/cgo -o ./_x001.o -c cgo_export.c
TERM=‘dumb’ gcc -I /usr/lib/golang/src/runtime/cgo -fPIC -pthread -Wl,–no-gc-sections -fmessage-length=0 -fdebug-prefix-map=$WORK/b061=/tmp/go-build -gno-record-gcc-switches -I ./ -g -O2 -Wall -Werror -fno-stack-protector -fdebug-prefix-map=/usr/lib/golang/src/runtime/cgo=/
/runtime/cgo -o ./x002.o -c cgo.cgo2.c
cd /usr/lib/golang/src/runtime/cgo
TERM=‘dumb’ gcc -I . -fPIC -pthread -Wl,–no-gc-sections -fmessage-length=0 -fdebug-prefix-map=$WORK/b061=/tmp/go-build -gno-record-gcc-switches -I $WORK/b061/ -g -O2 -Wall -Werror -fno-stack-protector -fdebug-prefix-map=/usr/lib/golang/src/runtime/cgo=/
/runtime/cgo -o $WORK/b061/x003.o -c gcc_context.c
TERM=‘dumb’ gcc -I . -fPIC -pthread -Wl,–no-gc-sections -fmessage-length=0 -fdebug-prefix-map=$WORK/b061=/tmp/go-build -gno-record-gcc-switches -I $WORK/b061/ -g -O2 -Wall -Werror -fno-stack-protector -fdebug-prefix-map=/usr/lib/golang/src/runtime/cgo=/
/runtime/cgo -o $WORK/b061/x004.o -c gcc_fatalf.c
TERM=‘dumb’ gcc -I . -fPIC -pthread -Wl,–no-gc-sections -fmessage-length=0 -fdebug-prefix-map=$WORK/b061=/tmp/go-build -gno-record-gcc-switches -I $WORK/b061/ -g -O2 -Wall -Werror -fno-stack-protector -fdebug-prefix-map=/usr/lib/golang/src/runtime/cgo=/
/runtime/cgo -o $WORK/b061/x005.o -c gcc_libinit.c
TERM=‘dumb’ gcc -I . -fPIC -pthread -Wl,–no-gc-sections -fmessage-length=0 -fdebug-prefix-map=$WORK/b061=/tmp/go-build -gno-record-gcc-switches -I $WORK/b061/ -g -O2 -Wall -Werror -fno-stack-protector -fdebug-prefix-map=/usr/lib/golang/src/runtime/cgo=/
/runtime/cgo -o $WORK/b061/x006.o -c gcc_mmap.c
TERM=‘dumb’ gcc -I . -fPIC -pthread -Wl,–no-gc-sections -fmessage-length=0 -fdebug-prefix-map=$WORK/b061=/tmp/go-build -gno-record-gcc-switches -I $WORK/b061/ -g -O2 -Wall -Werror -fno-stack-protector -fdebug-prefix-map=/usr/lib/golang/src/runtime/cgo=/
/runtime/cgo -o $WORK/b061/x007.o -c gcc_ppc64x.c
TERM=‘dumb’ gcc -I . -fPIC -pthread -Wl,–no-gc-sections -fmessage-length=0 -fdebug-prefix-map=$WORK/b061=/tmp/go-build -gno-record-gcc-switches -I $WORK/b061/ -g -O2 -Wall -Werror -fno-stack-protector -fdebug-prefix-map=/usr/lib/golang/src/runtime/cgo=/
/runtime/cgo -o $WORK/b061/x008.o -c gcc_setenv.c
TERM=‘dumb’ gcc -I . -fPIC -pthread -Wl,–no-gc-sections -fmessage-length=0 -fdebug-prefix-map=$WORK/b061=/tmp/go-build -gno-record-gcc-switches -I $WORK/b061/ -g -O2 -Wall -Werror -fno-stack-protector -fdebug-prefix-map=/usr/lib/golang/src/runtime/cgo=/
/runtime/cgo -o $WORK/b061/x009.o -c gcc_sigaction.c
TERM=‘dumb’ gcc -I . -fPIC -pthread -Wl,–no-gc-sections -fmessage-length=0 -fdebug-prefix-map=$WORK/b061=/tmp/go-build -gno-record-gcc-switches -I $WORK/b061/ -g -O2 -Wall -Werror -fno-stack-protector -fdebug-prefix-map=/usr/lib/golang/src/runtime/cgo=/
/runtime/cgo -o $WORK/b061/x010.o -c gcc_traceback.c
TERM=‘dumb’ gcc -I . -fPIC -pthread -Wl,–no-gc-sections -fmessage-length=0 -fdebug-prefix-map=$WORK/b061=/tmp/go-build -gno-record-gcc-switches -I $WORK/b061/ -g -O2 -Wall -Werror -fno-stack-protector -fdebug-prefix-map=/usr/lib/golang/src/runtime/cgo=/
/runtime/cgo -o $WORK/b061/x011.o -c gcc_util.c
TERM=‘dumb’ gcc -I . -fPIC -pthread -Wl,–no-gc-sections -fmessage-length=0 -fdebug-prefix-map=$WORK/b061=/tmp/go-build -gno-record-gcc-switches -I $WORK/b061/ -g -O2 -Wall -Werror -fno-stack-protector -fdebug-prefix-map=/usr/lib/golang/src/runtime/cgo=/
/runtime/cgo -o $WORK/b061/x012.o -c linux_syscall.c
TERM=‘dumb’ gcc -I . -fPIC -pthread -Wl,–no-gc-sections -fmessage-length=0 -fdebug-prefix-map=$WORK/b061=/tmp/go-build -gno-record-gcc-switches -I $WORK/b061/ -g -O2 -Wall -Werror -fno-stack-protector -fdebug-prefix-map=/usr/lib/golang/src/runtime/cgo=/
/runtime/cgo -o $WORK/b061/_x013.o -c gcc_linux_ppc64x.S

runtime/cgo

gcc_linux_ppc64x.S: Assembler messages:
gcc_linux_ppc64x.S:27: Error: no such instruction: mflr %r0' gcc_linux_ppc64x.S:28: Error: bad register name %r0’
gcc_linux_ppc64x.S:29: Error: bad register name %r2' gcc_linux_ppc64x.S:30: Error: no such instruction: bl saveregs’
gcc_linux_ppc64x.S:31: Error: no such instruction: stdu %r1,-296(%r1)' gcc_linux_ppc64x.S:34: Error: no such instruction: bl _cgo_reginit’
gcc_linux_ppc64x.S:38: Error: no such instruction: mr %r30,%r4' gcc_linux_ppc64x.S:41: Error: no such instruction: mr %r12,%r3’
gcc_linux_ppc64x.S:42: Error: no such instruction: mtctr %r3' gcc_linux_ppc64x.S:43: Error: no such instruction: bctrl’
gcc_linux_ppc64x.S:45: Error: no such instruction: addi %r1,%r1,296' gcc_linux_ppc64x.S:46: Error: no such instruction: bl restoreregs’
gcc_linux_ppc64x.S:47: Error: no such instruction: ld %r2,24(%r1)' gcc_linux_ppc64x.S:48: Error: no such instruction: ld %r0,16(%r1)’
gcc_linux_ppc64x.S:49: Error: no such instruction: mtlr %r0' gcc_linux_ppc64x.S:50: Error: no such instruction: blr’
gcc_linux_ppc64x.S:55: Error: bad register name %r1)' gcc_linux_ppc64x.S:56: Error: bad register name %r1)’
gcc_linux_ppc64x.S:57: Error: bad register name %r16' gcc_linux_ppc64x.S:58: Error: bad register name %r17’
gcc_linux_ppc64x.S:59: Error: bad register name %r18' gcc_linux_ppc64x.S:60: Error: bad register name %r19’
gcc_linux_ppc64x.S:61: Error: bad register name %r20' gcc_linux_ppc64x.S:62: Error: bad register name %r21’
gcc_linux_ppc64x.S:63: Error: bad register name %r22' gcc_linux_ppc64x.S:64: Error: bad register name %r23’
gcc_linux_ppc64x.S:65: Error: bad register name %r24' gcc_linux_ppc64x.S:66: Error: bad register name %r25’
gcc_linux_ppc64x.S:67: Error: bad register name %r26' gcc_linux_ppc64x.S:68: Error: bad register name %r27’
gcc_linux_ppc64x.S:69: Error: bad register name %r28' gcc_linux_ppc64x.S:70: Error: bad register name %r29’
gcc_linux_ppc64x.S:71: Error: bad register name %r30' gcc_linux_ppc64x.S:72: Error: bad register name %r31’
gcc_linux_ppc64x.S:73: Error: no such instruction: stfd %f14,-144(%r1)' gcc_linux_ppc64x.S:74: Error: no such instruction: stfd %f15,-136(%r1)’
gcc_linux_ppc64x.S:75: Error: no such instruction: stfd %f16,-128(%r1)' gcc_linux_ppc64x.S:76: Error: no such instruction: stfd %f17,-120(%r1)’
gcc_linux_ppc64x.S:77: Error: no such instruction: stfd %f18,-112(%r1)' gcc_linux_ppc64x.S:78: Error: no such instruction: stfd %f19,-104(%r1)’
gcc_linux_ppc64x.S:79: Error: no such instruction: stfd %f20,-96(%r1)' gcc_linux_ppc64x.S:80: Error: no such instruction: stfd %f21,-88(%r1)’
gcc_linux_ppc64x.S:81: Error: no such instruction: stfd %f22,-80(%r1)' gcc_linux_ppc64x.S:82: Error: no such instruction: stfd %f23,-72(%r1)’
gcc_linux_ppc64x.S:83: Error: no such instruction: stfd %f24,-64(%r1)' gcc_linux_ppc64x.S:84: Error: no such instruction: stfd %f25,-56(%r1)’
gcc_linux_ppc64x.S:85: Error: no such instruction: stfd %f26,-48(%r1)' gcc_linux_ppc64x.S:86: Error: no such instruction: stfd %f27,-40(%r1)’
gcc_linux_ppc64x.S:87: Error: no such instruction: stfd %f28,-32(%r1)' gcc_linux_ppc64x.S:88: Error: no such instruction: stfd %f29,-24(%r1)’
gcc_linux_ppc64x.S:89: Error: no such instruction: stfd %f30,-16(%r1)' gcc_linux_ppc64x.S:90: Error: no such instruction: stfd %f31,-8(%r1)’
gcc_linux_ppc64x.S:92: Error: no such instruction: blr' gcc_linux_ppc64x.S:96: Error: no such instruction: ld %r14,-288(%r1)’
gcc_linux_ppc64x.S:97: Error: no such instruction: ld %r15,-280(%r1)' gcc_linux_ppc64x.S:98: Error: no such instruction: ld %r16,-272(%r1)’
gcc_linux_ppc64x.S:99: Error: no such instruction: ld %r17,-264(%r1)' gcc_linux_ppc64x.S:100: Error: no such instruction: ld %r18,-256(%r1)’
gcc_linux_ppc64x.S:101: Error: no such instruction: ld %r19,-248(%r1)' gcc_linux_ppc64x.S:102: Error: no such instruction: ld %r20,-240(%r1)’
gcc_linux_ppc64x.S:103: Error: no such instruction: ld %r21,-232(%r1)' gcc_linux_ppc64x.S:104: Error: no such instruction: ld %r22,-224(%r1)’
gcc_linux_ppc64x.S:105: Error: no such instruction: ld %r23,-216(%r1)' gcc_linux_ppc64x.S:106: Error: no such instruction: ld %r24,-208(%r1)’
gcc_linux_ppc64x.S:107: Error: no such instruction: ld %r25,-200(%r1)' gcc_linux_ppc64x.S:108: Error: no such instruction: ld %r26,-192(%r1)’
gcc_linux_ppc64x.S:109: Error: no such instruction: ld %r27,-184(%r1)' gcc_linux_ppc64x.S:110: Error: no such instruction: ld %r28,-176(%r1)’
gcc_linux_ppc64x.S:111: Error: no such instruction: ld %r29,-168(%r1)' gcc_linux_ppc64x.S:112: Error: no such instruction: ld %r30,-160(%r1)’
gcc_linux_ppc64x.S:113: Error: no such instruction: ld %r31,-152(%r1)' gcc_linux_ppc64x.S:114: Error: no such instruction: lfd %f14,-144(%r1)’
gcc_linux_ppc64x.S:115: Error: no such instruction: lfd %f15,-136(%r1)' gcc_linux_ppc64x.S:116: Error: no such instruction: lfd %f16,-128(%r1)’
gcc_linux_ppc64x.S:117: Error: no such instruction: lfd %f17,-120(%r1)' gcc_linux_ppc64x.S:118: Error: no such instruction: lfd %f18,-112(%r1)’
gcc_linux_ppc64x.S:119: Error: no such instruction: lfd %f19,-104(%r1)' gcc_linux_ppc64x.S:120: Error: no such instruction: lfd %f20,-96(%r1)’
gcc_linux_ppc64x.S:121: Error: no such instruction: lfd %f21,-88(%r1)' gcc_linux_ppc64x.S:122: Error: no such instruction: lfd %f22,-80(%r1)’
gcc_linux_ppc64x.S:123: Error: no such instruction: lfd %f23,-72(%r1)' gcc_linux_ppc64x.S:124: Error: no such instruction: lfd %f24,-64(%r1)’
gcc_linux_ppc64x.S:125: Error: no such instruction: lfd %f25,-56(%r1)' gcc_linux_ppc64x.S:126: Error: no such instruction: lfd %f26,-48(%r1)’
gcc_linux_ppc64x.S:127: Error: no such instruction: lfd %f27,-40(%r1)' gcc_linux_ppc64x.S:128: Error: no such instruction: lfd %f28,-32(%r1)’
gcc_linux_ppc64x.S:129: Error: no such instruction: lfd %f29,-24(%r1)' gcc_linux_ppc64x.S:130: Error: no such instruction: lfd %f30,-16(%r1)’
gcc_linux_ppc64x.S:131: Error: no such instruction: lfd %f31,-8(%r1)' gcc_linux_ppc64x.S:133: Error: no such instruction: blr’

Expected Result:

compiled binary file pf pmm-agent for ppc64le arch.

Actual Result:

assembler fails

Hi @Henryx.
We are planing some arm builds, but not ppc64le.
May I ask what DB you are running on ppc64le and planing to monitor with PMM?

Hello @Roma_Novikov ,

Thank you for your reply, much appreciated.

We attempt to monitor MongoDB only which runs on Powerlinux arch (ppc64le). I was able to compile all client-side binaries (like exporters,etc…) except for pmm-agent. I assume, it’s failing to build one dependency only but I’m not sure at all on how fix that.