You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
$ go version
go version devel +0f47c12a29 Wed May 6 04:34:54 2020 +0000 linux/ppc64le (latest)
Does this issue reproduce with the latest release?
yes
What operating system and processor architecture are you using (go env)?
go env Output
$ go env
linux/ppc64le
Ubuntu 18.04
What did you do?
Build and test of Openshift on linux/ppc64le
mkdir -p ~/openshift/src/github.com/openshift
cd ~/openshift/src/github.com/openshift
git clone https://github.com/openshift/origin
cd origin; export GOPATH=~/openshift
export PERMISSIVE_GO=y
make build-all
To run all the tests:
GOTEST_FLAGS='-p 8 -gcflags=all=-d=checkptr=0' TIMEOUT=360s TEST_KUBE=true KUBERNETES_SERVICE_HOST= hack/test-go.sh
Building one test that fails with SIGILL:
GOTEST_FLAGS='-c -p 8 -gcflags=all=-d=checkptr=0' TIMEOUT=360s TEST_KUBE=true KUBERNETES_SERVICE_HOST= hack/test-go.sh vendor/k8s.io/kubernetes/pkg/cloudprovider/providers
What did you expect to see?
Mostly correct run of testcases. There are some that fail due to other reasons, but no SIGILLs until recently.
What did you see instead?
Some tests fail with SIGILL. Further investigation shows that the binaries are built incorrectly, some have portions that should contain valid instructions but do not. It appears that these are cases where the text sections are excessively large where special handling is supposed to happen on ppc64le.
The SIGILL happens due to a corrupt binary. At one point the program tries to jump to an address which is not a valid instruction stream. Likely due to size issues.
For example, if I do objdump -D on the providers.test built as shown above:
I was able to avoid the SIGILL failures by using the options to enable the old linker as @cherrymui requested (-gcflags=all=-go115newobj=false -asmflags=all=-go115newobj=false -ldflags=all=-go115newobj=false).
The text was updated successfully, but these errors were encountered:
Thanks for the report. And thanks for trying the old linker.
It seems there is some issue with trampoline generation, which is not surprising. This is the part that I'm not really confident with, as I couldn't test it on some very large binaries.
What version of Go are you using (
go version
)?Does this issue reproduce with the latest release?
yes
What operating system and processor architecture are you using (
go env
)?go env
OutputWhat did you do?
Build and test of Openshift on linux/ppc64le
What did you expect to see?
Mostly correct run of testcases. There are some that fail due to other reasons, but no SIGILLs until recently.
What did you see instead?
Some tests fail with SIGILL. Further investigation shows that the binaries are built incorrectly, some have portions that should contain valid instructions but do not. It appears that these are cases where the text sections are excessively large where special handling is supposed to happen on ppc64le.
The SIGILL happens due to a corrupt binary. At one point the program tries to jump to an address which is not a valid instruction stream. Likely due to size issues.
For example, if I do objdump -D on the providers.test built as shown above:
Using gdb on this program:
I was able to avoid the SIGILL failures by using the options to enable the old linker as @cherrymui requested (-gcflags=all=-go115newobj=false -asmflags=all=-go115newobj=false -ldflags=all=-go115newobj=false).
The text was updated successfully, but these errors were encountered: