1
0
mirror of https://github.com/golang/go synced 2024-11-26 11:08:38 -07:00

debug/pe: recognize arm64 executables

We still need to add test data, but as yet we haven't identified
a good Windows arm64 compiler to produce small binaries.

This CL is part of a stack adding windows/arm64
support (#36439), intended to land in the Go 1.17 cycle.

Change-Id: Ifbecb9a6e25f7af38e20b7d7830df7f5efe2798a
Reviewed-on: https://go-review.googlesource.com/c/go/+/288820
Trust: Russ Cox <rsc@golang.org>
Trust: Jason A. Donenfeld <Jason@zx2c4.com>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
Reviewed-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
Russ Cox 2021-01-22 09:32:38 -05:00
parent 0c633125f2
commit 0ca0551f02

View File

@ -75,7 +75,7 @@ func NewFile(r io.ReaderAt) (*File, error) {
var sign [4]byte var sign [4]byte
r.ReadAt(sign[:], signoff) r.ReadAt(sign[:], signoff)
if !(sign[0] == 'P' && sign[1] == 'E' && sign[2] == 0 && sign[3] == 0) { if !(sign[0] == 'P' && sign[1] == 'E' && sign[2] == 0 && sign[3] == 0) {
return nil, fmt.Errorf("Invalid PE COFF file signature of %v.", sign) return nil, fmt.Errorf("invalid PE file signature: % x", sign)
} }
base = signoff + 4 base = signoff + 4
} else { } else {
@ -86,9 +86,14 @@ func NewFile(r io.ReaderAt) (*File, error) {
return nil, err return nil, err
} }
switch f.FileHeader.Machine { switch f.FileHeader.Machine {
case IMAGE_FILE_MACHINE_UNKNOWN, IMAGE_FILE_MACHINE_ARMNT, IMAGE_FILE_MACHINE_AMD64, IMAGE_FILE_MACHINE_I386: case IMAGE_FILE_MACHINE_AMD64,
IMAGE_FILE_MACHINE_ARM64,
IMAGE_FILE_MACHINE_ARMNT,
IMAGE_FILE_MACHINE_I386,
IMAGE_FILE_MACHINE_UNKNOWN:
// ok
default: default:
return nil, fmt.Errorf("Unrecognised COFF file header machine value of 0x%x.", f.FileHeader.Machine) return nil, fmt.Errorf("unrecognized PE machine: %#x", f.FileHeader.Machine)
} }
var err error var err error
@ -112,7 +117,7 @@ func NewFile(r io.ReaderAt) (*File, error) {
// Seek past file header. // Seek past file header.
_, err = sr.Seek(base+int64(binary.Size(f.FileHeader)), seekStart) _, err = sr.Seek(base+int64(binary.Size(f.FileHeader)), seekStart)
if err != nil { if err != nil {
return nil, fmt.Errorf("failure to seek past the file header: %v", err) return nil, err
} }
// Read optional header. // Read optional header.
@ -309,7 +314,7 @@ func (f *File) ImportedSymbols() ([]string, error) {
return nil, nil return nil, nil
} }
pe64 := f.Machine == IMAGE_FILE_MACHINE_AMD64 pe64 := f.Machine == IMAGE_FILE_MACHINE_AMD64 || f.Machine == IMAGE_FILE_MACHINE_ARM64
// grab the number of data directory entries // grab the number of data directory entries
var dd_length uint32 var dd_length uint32