mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/link: recognize ARM64 PE files and relocations
For now, this only add a single relocation type, which is sufficient for Windows resources. Later we'll see if we need more for cgo. In order to ensure these code paths are actually tested, this expands the rsrc tests to include all the architectures of PE objects that we need to be recognizing, and splits things more clearly between binutils and llvm objects, which have a slightly different layout, so that we test both. This CL is part of a stack adding windows/arm64 support (#36439), intended to land in the Go 1.17 cycle. Change-Id: Ia1ee840265e9d12c0b12dd1c5d0810f8b300e557 Reviewed-on: https://go-review.googlesource.com/c/go/+/289429 Trust: Jason A. Donenfeld <Jason@zx2c4.com> Run-TryBot: Jason A. Donenfeld <Jason@zx2c4.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com>
This commit is contained in:
parent
a655208c9e
commit
f41460145e
11 changed files with 67 additions and 17 deletions
|
|
@ -753,23 +753,24 @@ func TestIndexMismatch(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestPErsrc(t *testing.T) {
|
||||
func TestPErsrcBinutils(t *testing.T) {
|
||||
// Test that PE rsrc section is handled correctly (issue 39658).
|
||||
testenv.MustHaveGoBuild(t)
|
||||
|
||||
if runtime.GOARCH != "amd64" || runtime.GOOS != "windows" {
|
||||
t.Skipf("this is a windows/amd64-only test")
|
||||
if (runtime.GOARCH != "386" && runtime.GOARCH != "amd64") || runtime.GOOS != "windows" {
|
||||
// This test is limited to amd64 and 386, because binutils is limited as such
|
||||
t.Skipf("this is only for windows/amd64 and windows/386")
|
||||
}
|
||||
|
||||
t.Parallel()
|
||||
|
||||
tmpdir, err := ioutil.TempDir("", "TestPErsrc")
|
||||
tmpdir, err := ioutil.TempDir("", "TestPErsrcBinutils")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer os.RemoveAll(tmpdir)
|
||||
|
||||
pkgdir := filepath.Join("testdata", "testPErsrc")
|
||||
pkgdir := filepath.Join("testdata", "pe-binutils")
|
||||
exe := filepath.Join(tmpdir, "a.exe")
|
||||
cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", exe)
|
||||
cmd.Dir = pkgdir
|
||||
|
|
@ -787,19 +788,36 @@ func TestPErsrc(t *testing.T) {
|
|||
if !bytes.Contains(b, []byte("Hello Gophers!")) {
|
||||
t.Fatalf("binary does not contain expected content")
|
||||
}
|
||||
}
|
||||
|
||||
pkgdir = filepath.Join("testdata", "testPErsrc-complex")
|
||||
exe = filepath.Join(tmpdir, "a.exe")
|
||||
cmd = exec.Command(testenv.GoToolPath(t), "build", "-o", exe)
|
||||
func TestPErsrcLLVM(t *testing.T) {
|
||||
// Test that PE rsrc section is handled correctly (issue 39658).
|
||||
testenv.MustHaveGoBuild(t)
|
||||
|
||||
if runtime.GOOS != "windows" {
|
||||
t.Skipf("this is a windows-only test")
|
||||
}
|
||||
|
||||
t.Parallel()
|
||||
|
||||
tmpdir, err := ioutil.TempDir("", "TestPErsrcLLVM")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer os.RemoveAll(tmpdir)
|
||||
|
||||
pkgdir := filepath.Join("testdata", "pe-llvm")
|
||||
exe := filepath.Join(tmpdir, "a.exe")
|
||||
cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", exe)
|
||||
cmd.Dir = pkgdir
|
||||
// cmd.Env = append(os.Environ(), "GOOS=windows", "GOARCH=amd64") // uncomment if debugging in a cross-compiling environment
|
||||
out, err = cmd.CombinedOutput()
|
||||
out, err := cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
t.Fatalf("building failed: %v, output:\n%s", err, out)
|
||||
}
|
||||
|
||||
// Check that the binary contains the rsrc data
|
||||
b, err = ioutil.ReadFile(exe)
|
||||
b, err := ioutil.ReadFile(exe)
|
||||
if err != nil {
|
||||
t.Fatalf("reading output failed: %v", err)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue