go: runtime/cgo: unrecognized relocation with binaries shipped in go1.12.2
What version of Go are you using (go version
)?
go1.12.2
This specifically affects the binary distribution downloaded from golang.org. Bootstrapping 1.12.2 using 1.12.1 did not have this problem.
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 GOARCH="amd64" GOBIN="" GOCACHE="/home/bazel/.cache/go-build" GOEXE="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="linux" GOOS="linux" GOPATH="/home/bazel/go" GOPROXY="" GORACE="" GOROOT="/home/bazel/go1.12.2" GOTMPDIR="" GOTOOLDIR="/home/bazel/go1.12.2/pkg/tool/linux_amd64" GCCGO="gccgo" CC="gcc" CXX="g++" CGO_ENABLED="1" GOMOD="" 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 -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build845022667=/tmp/go-build -gno-record-gcc-switches"
This error is most easily reproduced with the gcr.io/bazel-untrusted/ubuntu1404:java8
docker image that Bazel uses for testing. Sorry, it’s pretty big.
The important part of this is that it’s on ubuntu14.04, which has an older linker.
bazel@269f5850547f:~$ /usr/bin/ld -v
GNU ld (GNU Binutils for Ubuntu) 2.24
bazel@269f5850547f:~$ /usr/bin/ld.gold -v
GNU gold (GNU Binutils for Ubuntu 2.24) 1.11
bazel@269f5850547f:~$ /usr/bin/gcc -v
Using built-in specs.
COLLECT_GCC=/usr/bin/gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04.4' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.4)
What did you do?
Download go1.12.2
Try to build the program below:
package main
// const int x = 42;
import "C"
import "fmt"
func main() {
fmt.Println(int(C.x))
}
~/go1.12.2/bin/go build hello.go
What did you expect to see?
Successful build.
What did you see instead?
# command-line-arguments
/home/bazel/go1.12.2/pkg/tool/linux_amd64/link: running gcc failed: exit status 1
/usr/bin/ld: /tmp/go-link-648962525/000005.o: unrecognized relocation (0x2a) in section `.text'
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
I’m seeing similar error when Bazel links binaries with cgo code.
external/go_sdk/pkg/tool/linux_amd64/link: running /usr/bin/gcc failed: exit status /usr/bin/ld.gold: error: /tmp/go-link-028957856/000005.o: unsupported reloc 42 against global symbol stderr
/usr/bin/ld.gold: error: /tmp/go-link-028957856/000006.o: unsupported reloc 42 against global symbol stderr
/usr/bin/ld.gold: error: /tmp/go-link-028957856/000007.o: unsupported reloc 42 against global symbol x_cgo_threadentry
/usr/bin/ld.gold: error: /tmp/go-link-028957856/000007.o: unsupported reloc 42 against global symbol x_cgo_inittls
/usr/bin/ld.gold: error: /tmp/go-link-028957856/000012.o: unsupported reloc 42 against global symbol stderr
gcc_fatalf.c:17: error: unsupported reloc 42
gcc_libinit.c:29: error: unsupported reloc 42
gcc_linux_amd64.c:86: error: unsupported reloc 42
gcc_linux_amd64.c:52: error: unsupported reloc 42
gcc_util.c:18: error: unsupported reloc 42
collect2: error: ld returned 1 exit status
Other thoughts
@ianlancetaylor told me that reloc 42 is R_X86_64_REX_GOTPCRELX. Support for this was added to gold in 2015, so it’s presumably not supported by ubuntu14.04. Support was added to the Go linker for #13114. The Go toolchain should not be emitting these relocs. We may be incorporating .o files produced by a C compiler that emits these on the system that produces the binary distribution.
I was able to work around this by bootstrapping the Go 1.12.2 toolchain locally. I think the C compiler installed on this image does not emit these relocs.
About this issue
- Original URL
- State: closed
- Created 5 years ago
- Reactions: 1
- Comments: 27 (16 by maintainers)
Commits related to this issue
- Workaround for https://github.com/golang/go/issues/31293 — committed to dcos/dcos-diagnostics by deleted user 5 years ago
- ci: update to xenial Migrate to xenial to workaround golang/go#31293 — committed to sbinet-hep/hep by sbinet 5 years ago
- dashboard, cmd/release: use Jessie for release builds Drop linux-amd64-stretch (which is redundant with linux-amd64, which is now Stretch since CL 170282) and add linux-amd64-jessie, and use Jessie i... — committed to golang/build by bradfitz 5 years ago
- cmd/release: use Jessie for release builds, take 2 Fix of CL 171121. :( Updates golang/go#31293 Change-Id: I7029a2158312043e6fbfaa24ec36a99c3ea1ffa7 Reviewed-on: https://go-review.googlesource.com/... — committed to golang/build by bradfitz 5 years ago
- Pin to Go 1.12.1 Due to https://github.com/golang/go/issues/31293 — committed to cloudflare/cfssl by cbroglie 5 years ago
- Pin to Go 1.12.1 Due to https://github.com/golang/go/issues/31293 — committed to cloudflare/cfssl by cbroglie 5 years ago
- travis: Pin to Go 1.12.1 This is a workaround for https://github.com/golang/go/issues/31293. — committed to skroutz/downloader by agis 5 years ago
- [travis] Update dist to xenial According to https://github.com/golang/go/issues/31293 there seems to be an incompatibility with the newest gcc and cgo. Current fix is to bump to xenial but there sho... — committed to DataDog/zstd by Viq111 5 years ago
- Bump Golang 1.11.8 go1.11.8 (released 2019/04/08) fixes an issue where using the prebuilt binary releases on older versions of GNU/Linux led to failures when linking programs that used cgo. Only Linu... — committed to thaJeztah/golang-cross by thaJeztah 5 years ago
- Bump Golang 1.12.3 go1.12.3 (released 2019/04/08) fixes an issue where using the prebuilt binary releases on older versions of GNU/Linux led to failures when linking programs that used cgo. Only Linu... — committed to thaJeztah/golang-cross by thaJeztah 5 years ago
- use xenial instead golang/go#31293 — committed to honeytrap/honeytrap by nl5887 5 years ago
- cmd/release: sanity check relocations before release Updates golang/go#31293 Change-Id: I001e1f1518c302a9e8c49716d44860603fd5c28b Reviewed-on: https://go-review.googlesource.com/c/build/+/171317 Run... — committed to golang/build by bradfitz 5 years ago
- doc: document Go 1.12.4 and Go 1.11.9 Updates #31293 Change-Id: I3d72f732be7b28059310ea6fc134c3bfac81492d Reviewed-on: https://go-review.googlesource.com/c/go/+/171578 Reviewed-by: Dmitri Shuralyov ... — committed to golang/go by bradfitz 5 years ago
- [release-branch.go1.12] doc: document Go 1.12.4 and Go 1.11.9 Updates #31293 Change-Id: I3d72f732be7b28059310ea6fc134c3bfac81492d Reviewed-on: https://go-review.googlesource.com/c/go/+/171578 Review... — committed to golang/go by bradfitz 5 years ago
- [release-branch.go1.11] doc: document Go 1.11.9 Updates #31293 Change-Id: I3d72f732be7b28059310ea6fc134c3bfac81492d Reviewed-on: https://go-review.googlesource.com/c/go/+/171578 Reviewed-by: Dmitri ... — committed to golang/go by bradfitz 5 years ago
- travis: Use Go 1.12.4 This fixes https://github.com/golang/go/issues/31293. — committed to skroutz/downloader by agis 5 years ago
- travis: Use Go 1.12.4 This fixes https://github.com/golang/go/issues/31293. — committed to skroutz/downloader by agis 5 years ago
- Bump Golang 1.11.9 go1.11.9 (released 2019/04/11) fixes an issue where using the prebuilt binary releases on older versions of GNU/Linux led to failures when linking programs that used cgo. Only Linu... — committed to thaJeztah/golang-cross by thaJeztah 5 years ago
- Bump Golang 1.12.4 go1.12.4 (released 2019/04/11) fixes an issue where using the prebuilt binary releases on older versions of GNU/Linux led to failures when linking programs that used cgo. Only Linu... — committed to thaJeztah/golang-cross by thaJeztah 5 years ago
For Travis CI errors, if you’re willing to upgrade to Ubuntu 16.04, you can do so by changing
dist: trusty
todist: xenial
in your .travis.yml file.@dbaroncelli, we didn’t get a new release out today, but we should tomorrow.
I’ve confirmed with 1.12.4 and 1.11.9 that the relocations are back to their intended state:
These have been released on golang.org/dl. Apologies for the churn and thanks for everyone’s patience. Hopefully we can close this for good now.
@aronatkins, new binaries are forthcoming. @andybons is on it. We’re working on a test first, though.
Yep, this still seems to be happening. Same error with the original repro instructions.
Sorry to be the bearer of bad news, but I think we need to reopen this.
We updated our linux-amd64 builder image from Debian Jessie to Stretch. That’s surely the cause. We obviously didn’t consider that it’d have any effect on release binaries. We also don’t version our builder images and our release automation doesn’t use different builders as a function of branch either. Maybe it should. We never thought about it.
FWIW, this particular issue can be mitigated by passing “-Wa,-mrelax-relocations=no” when compiling. But if you do that, unless you set CGO_FLAGS to this every time you build, the new (ish) code in the go tool considers the distributed runtime/cgo.a stale and doesn’t use it. In fact, given the build cache I’m not sure there is any real need to distribute runtime/cgo.a at all – I stopped for my snap and as far as I can tell noone has noticed…
1.12.3 and 1.11.8 have been built using Jessie and released. This should resolve the issue. Please let us know if there are any other problems and sorry for the trouble.
Thanks.
just to note this is also the case for the
go1.11.7
builds:The relocation appears in runtime/cgo for C code that refers to global variables.
The 1.12.2 binary distribution must have been built with a newer version of GCC than the 1.12.1 binary distribution. The only reasonable fix is to build it with an older version of GCC.
I’m not sure whether we should do anything about this. As a general rule, if you want the binary distribution to run on release N, you need to build it on release N, not a later release. This is one example of that, but there are many others. I don’t remember whether we’ve ever documented anything about what systems the binary distributions run on.
CC @bradfitz @andybons