go: cmd/cgo: missing references to symbols in .syso
What version of Go are you using (go version
)?
$ go version go version devel go1.19-2bea43b0e7 Thu May 12 04:47:29 2022 +0000 linux/amd64
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 GO111MODULE="" GOARCH="amd64" GOBIN="" GOCACHE="/home/binet/.cache/go-build" GOENV="/home/binet/.config/go/env" GOEXE="" GOEXPERIMENT="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="linux" GOINSECURE="" GOMODCACHE="/home/binet/dev/go/gocode/pkg/mod" GONOPROXY="gitlab.cern.ch/tile-in-one/tio-go" GONOSUMDB="gitlab.cern.ch/tile-in-one/tio-go" GOOS="linux" GOPATH="/home/binet/dev/go/gocode" GOPRIVATE="gitlab.cern.ch/tile-in-one/tio-go" GOPROXY="https://proxy.golang.org,direct" GOROOT="/home/binet/sdk/go" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/home/binet/sdk/go/pkg/tool/linux_amd64" GOVCS="" GOVERSION="devel go1.19-2bea43b0e7 Thu May 12 04:47:29 2022 +0000" GCCGO="gccgo" GOAMD64="v1" AR="ar" CC="gcc" CXX="g++" CGO_ENABLED="1" GOMOD="/dev/null" 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 -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build3696923155=/tmp/go-build -gno-record-gcc-switches"
What did you do?
$> cd somewhere
$> git clone git@github.com:gioui/gio gio && cd gio
$> go build ./...
[...]
gioui.org/widget/material
gioui.org/gpu/internal/vulkan
gioui.org/gpu
gioui.org/internal/egl
# gioui.org/internal/egl
/usr/bin/ld: /home/binet/work/gio/pkg/mod/gioui.org/shader@v1.0.6/piet/backdrop_linux_amd64.syso: in function `backdrop_coroutine_begin':
:(.text+0x2b): undefined reference to `coroutine_alloc_frame'
/usr/bin/ld: /home/binet/work/gio/pkg/mod/gioui.org/shader@v1.0.6/piet/backdrop_linux_amd64.syso: in function `backdrop_coroutine_begin.destroy':
:(.text+0x2a42): undefined reference to `coroutine_free_frame'
/usr/bin/ld: /home/binet/work/gio/pkg/mod/gioui.org/shader@v1.0.6/piet/backdrop_linux_amd64.syso: in function `backdrop_coroutine_begin.cleanup':
:(.text+0x2a54): undefined reference to `coroutine_free_frame'
/usr/bin/ld: /home/binet/work/gio/pkg/mod/gioui.org/shader@v1.0.6/piet/binning_linux_amd64.syso: in function `binning_coroutine_begin':
:(.text+0x24): undefined reference to `coroutine_alloc_frame'
/usr/bin/ld: /home/binet/work/gio/pkg/mod/gioui.org/shader@v1.0.6/piet/binning_linux_amd64.syso: in function `binning_coroutine_begin.resume':
:(.text+0x13fe): undefined reference to `floorf'
/usr/bin/ld: :(.text+0x140f): undefined reference to `floorf'
/usr/bin/ld: :(.text+0x1421): undefined reference to `floorf'
/usr/bin/ld: :(.text+0x1434): undefined reference to `floorf'
/usr/bin/ld: :(.text+0x1464): undefined reference to `floorf'
everything works fine w/ Go-1.18.x
What did you expect to see?
a valid build.
About this issue
- Original URL
- State: closed
- Created 2 years ago
- Comments: 16 (14 by maintainers)
I think I have a relatively simple solution: if cgo fails when generating
_cgo_import.go
, let’s silently hide the failure, and mark the object (somehow) as requiring external linking. Then we can fail at link time if we are internally linking and the object says we can’t do that.Thanks @dominikh for the information. It seems the error comes from this command
which is the cgo tool building _cgo_main.c, instead of the final linking of the binary.
CL https://go-review.googlesource.com/c/go/+/402596 may be related, which makes the cgo tool pass syso files. It appears that when compiling the
egl
package the cgo tool passes the syso from thepiet
package (per CL description, it includes transitive dependencies). The Go and C files from thepiet
package (https://git.sr.ht/~eliasnaur/gio-shader/tree/main/item/piet/backdrop_abi.go#L13 , https://git.sr.ht/~eliasnaur/gio-shader/tree/main/item/piet/support.c#L20) provides the-lm
flag and the missing symbols, but they are not included by the cgo tool.cc @ianlancetaylor @rsc