pantsbuild / pants

The Pants Build System
https://www.pantsbuild.org
Apache License 2.0
3.19k stars 613 forks source link

Cross-platform Go build fails using `pants package` #21113

Open agoblet opened 1 week ago

agoblet commented 1 week ago

Describe the bug When running pants package on a go_binary target with the GOOS or GOARCH environment set to a different OS or arch, the command fails. Running go build directly with these environment variables works fine. The environment variables have been configured in pants.toml as follows:

[golang]
subprocess_env_vars = [
  "LANG",
  "LC_CTYPE",
  "LC_ALL",
  "PATH",
  "GOOS",
  "GOARCH"
]

Below are the outputs for running with a different GOOS and different GOARCH, respectively:

different GOARCH (amd64 running on an arm64 device):

❯ GOARCH=amd64 pants package ::
13:22:31.18 [ERROR] Completed: Compile with Go - runtime - runtime failed (exit code 1).
/usr/local/go/src/runtime/asm_amd64.s:262: unrecognized instruction "get_tls"
/usr/local/go/src/runtime/asm_amd64.s:263: expected end of operand, found (
/usr/local/go/src/runtime/asm_amd64.s:270: unrecognized instruction "get_tls"
/usr/local/go/src/runtime/asm_amd64.s:272: expected end of operand, found (
/usr/local/go/src/runtime/asm_amd64.s:410: unrecognized instruction "get_tls"
/usr/local/go/src/runtime/asm_amd64.s:411: expected end of operand, found (
/usr/local/go/src/runtime/asm_amd64.s:453: unrecognized instruction "get_tls"
/usr/local/go/src/runtime/asm_amd64.s:454: expected end of operand, found (
/usr/local/go/src/runtime/asm_amd64.s:480: unrecognized instruction "get_tls"
/usr/local/go/src/runtime/asm_amd64.s:481: expected end of operand, found (
/usr/local/go/src/runtime/asm_amd64.s:502: expected end of operand, found (
asm: too many errors

/usr/local/go/src/runtime/sys_darwin_amd64.s:177: unrecognized instruction "get_tls"
/usr/local/go/src/runtime/sys_darwin_amd64.s:178: expected end of operand, found (
/usr/local/go/src/runtime/sys_darwin_amd64.s:229: unrecognized instruction "get_tls"
/usr/local/go/src/runtime/sys_darwin_amd64.s:230: expected end of operand, found (
asm: assembly of /usr/local/go/src/runtime/sys_darwin_amd64.s failed

13:22:31.18 [ERROR] 1 Exception encountered:

Engine traceback:
  in `package` goal

Exception: Failed to compile main:

/usr/local/go/src/runtime/asm_amd64.s:262: unrecognized instruction "get_tls"
/usr/local/go/src/runtime/asm_amd64.s:263: expected end of operand, found (
/usr/local/go/src/runtime/asm_amd64.s:270: unrecognized instruction "get_tls"
/usr/local/go/src/runtime/asm_amd64.s:272: expected end of operand, found (
/usr/local/go/src/runtime/asm_amd64.s:410: unrecognized instruction "get_tls"
/usr/local/go/src/runtime/asm_amd64.s:411: expected end of operand, found (
/usr/local/go/src/runtime/asm_amd64.s:453: unrecognized instruction "get_tls"
/usr/local/go/src/runtime/asm_amd64.s:454: expected end of operand, found (
/usr/local/go/src/runtime/asm_amd64.s:480: unrecognized instruction "get_tls"
/usr/local/go/src/runtime/asm_amd64.s:481: expected end of operand, found (
/usr/local/go/src/runtime/asm_amd64.s:502: expected end of operand, found (
asm: too many errors

/usr/local/go/src/runtime/sys_darwin_amd64.s:177: unrecognized instruction "get_tls"
/usr/local/go/src/runtime/sys_darwin_amd64.s:178: expected end of operand, found (
/usr/local/go/src/runtime/sys_darwin_amd64.s:229: unrecognized instruction "get_tls"
/usr/local/go/src/runtime/sys_darwin_amd64.s:230: expected end of operand, found (
asm: assembly of /usr/local/go/src/runtime/sys_darwin_amd64.s failed

different GOOS (linux running on a darwin device):

❯ GOOS=linux pants package ::
13:15:39.88 [ERROR] 1 Exception encountered:

Engine traceback:
  in `package` goal

ProcessExecutionFailure: Process 'Link Go binary: ./package_analyzer' failed with exit code 1.
stdout:

stderr:
runtime.rt0_go: relocation target runtime.tlsinit not defined

Use `--keep-sandboxes=on_failure` to preserve the process chroot for inspection.

Pants version 2.21.0 (+ Go version 1.22.3)

OS MacOS (M3), did not test on Linux

agoblet commented 3 days ago

Created a minimal example repository highlighting this issue here: https://github.com/agoblet/pants-go-cross-platform