]> Cypherpunks repositories - gostls13.git/commitdiff
debug/pe: copy some consts from cmd/link/internal/ld
authorAlex Brainman <alex.brainman@gmail.com>
Mon, 9 Mar 2020 06:49:13 +0000 (17:49 +1100)
committerAlex Brainman <alex.brainman@gmail.com>
Tue, 10 Mar 2020 08:18:53 +0000 (08:18 +0000)
This CL copies IMAGE_FILE_*, IMAGE_SUBSYSTEM_* and
IMAGE_DLLCHARACTERISTICS_* consts from cmd/link/internal/ld package.

The consts are also used in cmd/go and debug/pe tests. So avoid the
duplication.

The consts are defined in

https://docs.microsoft.com/en-us/windows/win32/debug/pe-format

and might be useful to other Go users.

The CL also adds some related consts.

RELNOTE=yes

Change-Id: Iaa868deaffc7c61051f2273397f3e7e101880a5b
Reviewed-on: https://go-review.googlesource.com/c/go/+/222637
Run-TryBot: Alex Brainman <alex.brainman@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/go/go_test.go
src/cmd/link/internal/ld/pe.go
src/debug/pe/file_test.go
src/debug/pe/pe.go

index a5b0f0898b4de2c051d79e18bac2964ea767e2f2..66354f7ff5c44e0c6f296632ac94fe7c15407731 100644 (file)
@@ -2208,15 +2208,10 @@ func testBuildmodePIE(t *testing.T, useCgo bool) {
                        t.Fatal(err)
                }
                defer f.Close()
-               const (
-                       IMAGE_FILE_RELOCS_STRIPPED               = 0x0001
-                       IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA = 0x0020
-                       IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE    = 0x0040
-               )
                if f.Section(".reloc") == nil {
                        t.Error(".reloc section is not present")
                }
-               if (f.FileHeader.Characteristics & IMAGE_FILE_RELOCS_STRIPPED) != 0 {
+               if (f.FileHeader.Characteristics & pe.IMAGE_FILE_RELOCS_STRIPPED) != 0 {
                        t.Error("IMAGE_FILE_RELOCS_STRIPPED flag is set")
                }
                var dc uint16
@@ -2225,13 +2220,13 @@ func testBuildmodePIE(t *testing.T, useCgo bool) {
                        dc = oh.DllCharacteristics
                case *pe.OptionalHeader64:
                        dc = oh.DllCharacteristics
-                       if (dc & IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA) == 0 {
+                       if (dc & pe.IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA) == 0 {
                                t.Error("IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA flag is not set")
                        }
                default:
                        t.Fatalf("unexpected optional header type of %T", f.OptionalHeader)
                }
-               if (dc & IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE) == 0 {
+               if (dc & pe.IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE) == 0 {
                        t.Error("IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE flag is not set")
                }
        default:
index 2c6be2d6f39a4fd9a7de59b677e4be3c1fcbd058..f77513239311b77108e1f66ec01c0c85b7af0bf5 100644 (file)
@@ -57,47 +57,15 @@ var (
 )
 
 const (
-       IMAGE_FILE_MACHINE_I386                        = 0x14c
-       IMAGE_FILE_MACHINE_AMD64                       = 0x8664
-       IMAGE_FILE_MACHINE_ARM                         = 0x1c0
-       IMAGE_FILE_MACHINE_ARMNT                       = 0x1c4
-       IMAGE_FILE_RELOCS_STRIPPED                     = 0x0001
-       IMAGE_FILE_EXECUTABLE_IMAGE                    = 0x0002
-       IMAGE_FILE_LINE_NUMS_STRIPPED                  = 0x0004
-       IMAGE_FILE_LARGE_ADDRESS_AWARE                 = 0x0020
-       IMAGE_FILE_32BIT_MACHINE                       = 0x0100
-       IMAGE_FILE_DEBUG_STRIPPED                      = 0x0200
-       IMAGE_SCN_CNT_CODE                             = 0x00000020
-       IMAGE_SCN_CNT_INITIALIZED_DATA                 = 0x00000040
-       IMAGE_SCN_CNT_UNINITIALIZED_DATA               = 0x00000080
-       IMAGE_SCN_MEM_EXECUTE                          = 0x20000000
-       IMAGE_SCN_MEM_READ                             = 0x40000000
-       IMAGE_SCN_MEM_WRITE                            = 0x80000000
-       IMAGE_SCN_MEM_DISCARDABLE                      = 0x2000000
-       IMAGE_SCN_LNK_NRELOC_OVFL                      = 0x1000000
-       IMAGE_SCN_ALIGN_32BYTES                        = 0x600000
-       IMAGE_DIRECTORY_ENTRY_EXPORT                   = 0
-       IMAGE_DIRECTORY_ENTRY_IMPORT                   = 1
-       IMAGE_DIRECTORY_ENTRY_RESOURCE                 = 2
-       IMAGE_DIRECTORY_ENTRY_EXCEPTION                = 3
-       IMAGE_DIRECTORY_ENTRY_SECURITY                 = 4
-       IMAGE_DIRECTORY_ENTRY_BASERELOC                = 5
-       IMAGE_DIRECTORY_ENTRY_DEBUG                    = 6
-       IMAGE_DIRECTORY_ENTRY_COPYRIGHT                = 7
-       IMAGE_DIRECTORY_ENTRY_ARCHITECTURE             = 7
-       IMAGE_DIRECTORY_ENTRY_GLOBALPTR                = 8
-       IMAGE_DIRECTORY_ENTRY_TLS                      = 9
-       IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG              = 10
-       IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT             = 11
-       IMAGE_DIRECTORY_ENTRY_IAT                      = 12
-       IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT             = 13
-       IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR           = 14
-       IMAGE_SUBSYSTEM_WINDOWS_GUI                    = 2
-       IMAGE_SUBSYSTEM_WINDOWS_CUI                    = 3
-       IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA       = 0x0020
-       IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE          = 0x0040
-       IMAGE_DLLCHARACTERISTICS_NX_COMPAT             = 0x0100
-       IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE = 0x8000
+       IMAGE_SCN_CNT_CODE               = 0x00000020
+       IMAGE_SCN_CNT_INITIALIZED_DATA   = 0x00000040
+       IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080
+       IMAGE_SCN_MEM_EXECUTE            = 0x20000000
+       IMAGE_SCN_MEM_READ               = 0x40000000
+       IMAGE_SCN_MEM_WRITE              = 0x80000000
+       IMAGE_SCN_MEM_DISCARDABLE        = 0x2000000
+       IMAGE_SCN_LNK_NRELOC_OVFL        = 0x1000000
+       IMAGE_SCN_ALIGN_32BYTES          = 0x600000
 )
 
 // TODO(crawshaw): add these constants to debug/pe.
@@ -761,11 +729,11 @@ func (f *peFile) writeFileHeader(ctxt *Link) {
        default:
                Exitf("unknown PE architecture: %v", ctxt.Arch.Family)
        case sys.AMD64:
-               fh.Machine = IMAGE_FILE_MACHINE_AMD64
+               fh.Machine = pe.IMAGE_FILE_MACHINE_AMD64
        case sys.I386:
-               fh.Machine = IMAGE_FILE_MACHINE_I386
+               fh.Machine = pe.IMAGE_FILE_MACHINE_I386
        case sys.ARM:
-               fh.Machine = IMAGE_FILE_MACHINE_ARMNT
+               fh.Machine = pe.IMAGE_FILE_MACHINE_ARMNT
        }
 
        fh.NumberOfSections = uint16(len(f.sections))
@@ -775,24 +743,24 @@ func (f *peFile) writeFileHeader(ctxt *Link) {
        fh.TimeDateStamp = 0
 
        if ctxt.LinkMode == LinkExternal {
-               fh.Characteristics = IMAGE_FILE_LINE_NUMS_STRIPPED
+               fh.Characteristics = pe.IMAGE_FILE_LINE_NUMS_STRIPPED
        } else {
-               fh.Characteristics = IMAGE_FILE_EXECUTABLE_IMAGE | IMAGE_FILE_DEBUG_STRIPPED
+               fh.Characteristics = pe.IMAGE_FILE_EXECUTABLE_IMAGE | pe.IMAGE_FILE_DEBUG_STRIPPED
                switch ctxt.Arch.Family {
                case sys.AMD64, sys.I386:
                        if ctxt.BuildMode != BuildModePIE {
-                               fh.Characteristics |= IMAGE_FILE_RELOCS_STRIPPED
+                               fh.Characteristics |= pe.IMAGE_FILE_RELOCS_STRIPPED
                        }
                }
        }
        if pe64 != 0 {
                var oh64 pe.OptionalHeader64
                fh.SizeOfOptionalHeader = uint16(binary.Size(&oh64))
-               fh.Characteristics |= IMAGE_FILE_LARGE_ADDRESS_AWARE
+               fh.Characteristics |= pe.IMAGE_FILE_LARGE_ADDRESS_AWARE
        } else {
                var oh pe.OptionalHeader32
                fh.SizeOfOptionalHeader = uint16(binary.Size(&oh))
-               fh.Characteristics |= IMAGE_FILE_32BIT_MACHINE
+               fh.Characteristics |= pe.IMAGE_FILE_32BIT_MACHINE
        }
 
        fh.PointerToSymbolTable = uint32(f.symtabOffset)
@@ -853,36 +821,36 @@ func (f *peFile) writeOptionalHeader(ctxt *Link) {
        oh64.SizeOfHeaders = uint32(PEFILEHEADR)
        oh.SizeOfHeaders = uint32(PEFILEHEADR)
        if windowsgui {
-               oh64.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_GUI
-               oh.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_GUI
+               oh64.Subsystem = pe.IMAGE_SUBSYSTEM_WINDOWS_GUI
+               oh.Subsystem = pe.IMAGE_SUBSYSTEM_WINDOWS_GUI
        } else {
-               oh64.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_CUI
-               oh.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_CUI
+               oh64.Subsystem = pe.IMAGE_SUBSYSTEM_WINDOWS_CUI
+               oh.Subsystem = pe.IMAGE_SUBSYSTEM_WINDOWS_CUI
        }
 
        // Mark as having awareness of terminal services, to avoid ancient compatibility hacks.
-       oh64.DllCharacteristics |= IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE
-       oh.DllCharacteristics |= IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE
+       oh64.DllCharacteristics |= pe.IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE
+       oh.DllCharacteristics |= pe.IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE
 
        // Enable DEP
-       oh64.DllCharacteristics |= IMAGE_DLLCHARACTERISTICS_NX_COMPAT
-       oh.DllCharacteristics |= IMAGE_DLLCHARACTERISTICS_NX_COMPAT
+       oh64.DllCharacteristics |= pe.IMAGE_DLLCHARACTERISTICS_NX_COMPAT
+       oh.DllCharacteristics |= pe.IMAGE_DLLCHARACTERISTICS_NX_COMPAT
 
        // The DLL can be relocated at load time.
        switch ctxt.Arch.Family {
        case sys.AMD64, sys.I386:
                if ctxt.BuildMode == BuildModePIE {
-                       oh64.DllCharacteristics |= IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
-                       oh.DllCharacteristics |= IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
+                       oh64.DllCharacteristics |= pe.IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
+                       oh.DllCharacteristics |= pe.IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
                }
        case sys.ARM:
-               oh64.DllCharacteristics |= IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
-               oh.DllCharacteristics |= IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
+               oh64.DllCharacteristics |= pe.IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
+               oh.DllCharacteristics |= pe.IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
        }
 
        // Image can handle a high entropy 64-bit virtual address space.
        if ctxt.BuildMode == BuildModePIE {
-               oh64.DllCharacteristics |= IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA
+               oh64.DllCharacteristics |= pe.IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA
        }
 
        // Disable stack growth as we don't want Windows to
@@ -1222,10 +1190,10 @@ func addimports(ctxt *Link, datsect *peSection) {
        out.Write32(0)
 
        // update data directory
-       pefile.dataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress = isect.virtualAddress
-       pefile.dataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size = isect.virtualSize
-       pefile.dataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress = uint32(dynamic.Value - PEBASE)
-       pefile.dataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].Size = uint32(dynamic.Size)
+       pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress = isect.virtualAddress
+       pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_IMPORT].Size = isect.virtualSize
+       pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress = uint32(dynamic.Value - PEBASE)
+       pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_IAT].Size = uint32(dynamic.Size)
 
        out.SeekSet(endoff)
 }
@@ -1270,8 +1238,8 @@ func addexports(ctxt *Link) {
        sect.characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
        sect.checkOffset(ctxt.Out.Offset())
        va := int(sect.virtualAddress)
-       pefile.dataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress = uint32(va)
-       pefile.dataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size = sect.virtualSize
+       pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress = uint32(va)
+       pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_EXPORT].Size = sect.virtualSize
 
        vaName := va + binary.Size(&e) + nexport*4
        vaAddr := va + binary.Size(&e)
@@ -1478,8 +1446,8 @@ func addPEBaseReloc(ctxt *Link) {
        rsect.checkOffset(startoff)
        rsect.pad(ctxt.Out, uint32(size))
 
-       pefile.dataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = rsect.virtualAddress
-       pefile.dataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size = rsect.virtualSize
+       pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = rsect.virtualAddress
+       pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_BASERELOC].Size = rsect.virtualSize
 }
 
 func (ctxt *Link) dope() {
@@ -1522,9 +1490,9 @@ func addpersrc(ctxt *Link) {
        h.pad(ctxt.Out, uint32(rsrcsym.Size))
 
        // update data directory
-       pefile.dataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = h.virtualAddress
+       pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = h.virtualAddress
 
-       pefile.dataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = h.virtualSize
+       pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = h.virtualSize
 }
 
 func Asmbpe(ctxt *Link) {
index bc41be266910a950e711204fa5a33e347ed27e56..26a65941e14cf63feea721bab9cb4219cea45c96 100644 (file)
@@ -621,16 +621,14 @@ func TestBuildingWindowsGUI(t *testing.T) {
        }
        defer f.Close()
 
-       const _IMAGE_SUBSYSTEM_WINDOWS_GUI = 2
-
        switch oh := f.OptionalHeader.(type) {
        case *OptionalHeader32:
-               if oh.Subsystem != _IMAGE_SUBSYSTEM_WINDOWS_GUI {
-                       t.Errorf("unexpected Subsystem value: have %d, but want %d", oh.Subsystem, _IMAGE_SUBSYSTEM_WINDOWS_GUI)
+               if oh.Subsystem != IMAGE_SUBSYSTEM_WINDOWS_GUI {
+                       t.Errorf("unexpected Subsystem value: have %d, but want %d", oh.Subsystem, IMAGE_SUBSYSTEM_WINDOWS_GUI)
                }
        case *OptionalHeader64:
-               if oh.Subsystem != _IMAGE_SUBSYSTEM_WINDOWS_GUI {
-                       t.Errorf("unexpected Subsystem value: have %d, but want %d", oh.Subsystem, _IMAGE_SUBSYSTEM_WINDOWS_GUI)
+               if oh.Subsystem != IMAGE_SUBSYSTEM_WINDOWS_GUI {
+                       t.Errorf("unexpected Subsystem value: have %d, but want %d", oh.Subsystem, IMAGE_SUBSYSTEM_WINDOWS_GUI)
                }
        default:
                t.Fatalf("unexpected OptionalHeader type: have %T, but want *pe.OptionalHeader32 or *pe.OptionalHeader64", oh)
index 3f8099dfab18c30c3e1e4444c2185d155283fdf6..db112fe7ad650ab19cc9ee53be7e82f3c2bb8b7c 100644 (file)
@@ -129,3 +129,56 @@ const (
        IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT   = 13
        IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR = 14
 )
+
+// Values of IMAGE_FILE_HEADER.Characteristics. These can be combined together.
+const (
+       IMAGE_FILE_RELOCS_STRIPPED         = 0x0001
+       IMAGE_FILE_EXECUTABLE_IMAGE        = 0x0002
+       IMAGE_FILE_LINE_NUMS_STRIPPED      = 0x0004
+       IMAGE_FILE_LOCAL_SYMS_STRIPPED     = 0x0008
+       IMAGE_FILE_AGGRESIVE_WS_TRIM       = 0x0010
+       IMAGE_FILE_LARGE_ADDRESS_AWARE     = 0x0020
+       IMAGE_FILE_BYTES_REVERSED_LO       = 0x0080
+       IMAGE_FILE_32BIT_MACHINE           = 0x0100
+       IMAGE_FILE_DEBUG_STRIPPED          = 0x0200
+       IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = 0x0400
+       IMAGE_FILE_NET_RUN_FROM_SWAP       = 0x0800
+       IMAGE_FILE_SYSTEM                  = 0x1000
+       IMAGE_FILE_DLL                     = 0x2000
+       IMAGE_FILE_UP_SYSTEM_ONLY          = 0x4000
+       IMAGE_FILE_BYTES_REVERSED_HI       = 0x8000
+)
+
+// OptionalHeader64.Subsystem and OptionalHeader32.Subsystem values.
+const (
+       IMAGE_SUBSYSTEM_UNKNOWN                  = 0
+       IMAGE_SUBSYSTEM_NATIVE                   = 1
+       IMAGE_SUBSYSTEM_WINDOWS_GUI              = 2
+       IMAGE_SUBSYSTEM_WINDOWS_CUI              = 3
+       IMAGE_SUBSYSTEM_OS2_CUI                  = 5
+       IMAGE_SUBSYSTEM_POSIX_CUI                = 7
+       IMAGE_SUBSYSTEM_NATIVE_WINDOWS           = 8
+       IMAGE_SUBSYSTEM_WINDOWS_CE_GUI           = 9
+       IMAGE_SUBSYSTEM_EFI_APPLICATION          = 10
+       IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER  = 11
+       IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER       = 12
+       IMAGE_SUBSYSTEM_EFI_ROM                  = 13
+       IMAGE_SUBSYSTEM_XBOX                     = 14
+       IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION = 16
+)
+
+// OptionalHeader64.DllCharacteristics and OptionalHeader32.DllCharacteristics
+// values. These can be combined together.
+const (
+       IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA       = 0x0020
+       IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE          = 0x0040
+       IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY       = 0x0080
+       IMAGE_DLLCHARACTERISTICS_NX_COMPAT             = 0x0100
+       IMAGE_DLLCHARACTERISTICS_NO_ISOLATION          = 0x0200
+       IMAGE_DLLCHARACTERISTICS_NO_SEH                = 0x0400
+       IMAGE_DLLCHARACTERISTICS_NO_BIND               = 0x0800
+       IMAGE_DLLCHARACTERISTICS_APPCONTAINER          = 0x1000
+       IMAGE_DLLCHARACTERISTICS_WDM_DRIVER            = 0x2000
+       IMAGE_DLLCHARACTERISTICS_GUARD_CF              = 0x4000
+       IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE = 0x8000
+)