]> Cypherpunks repositories - gostls13.git/commitdiff
ld: mark PE executables as terminal services aware
authorJason A. Donenfeld <Jason@zx2c4.com>
Mon, 26 Aug 2019 13:08:51 +0000 (07:08 -0600)
committerJason A. Donenfeld <Jason@zx2c4.com>
Sat, 31 Aug 2019 14:54:31 +0000 (14:54 +0000)
This has been the default in MSVC for a very long time, and it's hard to
imagine modern programs actually wanting the old legacy behavior. For
example, no modern programs try to install their junk into C:\windows
and therefore need to have an emulated writable windows directory.
That's not really even allowed by ACLs on modern systems.

Change-Id: Iadaca6815e39ea5c6b05c1cac5a95cfc35e5b48a
Reviewed-on: https://go-review.googlesource.com/c/go/+/191840
Run-TryBot: Jason A. Donenfeld <Jason@zx2c4.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
src/cmd/link/internal/ld/lib.go
src/cmd/link/internal/ld/pe.go

index 3fa258d275543dac0e2cc952b974b564bea4d8ff..0564501b459da3adca24906281308ec2f858b960 100644 (file)
@@ -1172,6 +1172,9 @@ func (ctxt *Link) hostlink() {
                } else {
                        argv = append(argv, "-mconsole")
                }
+               // Mark as having awareness of terminal services, to avoid
+               // ancient compatibility hacks.
+               argv = append(argv, "-Wl,--tsaware")
        case objabi.Haix:
                argv = append(argv, "-pthread")
                // prevent ld to reorder .text functions to keep the same
index 497a20b548210c43ff26d3e5e72c10652f389cfa..e3fe2f9ce509cc86b307a1fa06ad2865c6b1e391 100644 (file)
@@ -57,45 +57,46 @@ 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_DYNAMIC_BASE = 0x0040
-       IMAGE_DLLCHARACTERISTICS_NX_COMPAT    = 0x0100
+       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_DYNAMIC_BASE          = 0x0040
+       IMAGE_DLLCHARACTERISTICS_NX_COMPAT             = 0x0100
+       IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE = 0x8000
 )
 
 // TODO(crawshaw): add these constants to debug/pe.
@@ -859,6 +860,10 @@ func (f *peFile) writeOptionalHeader(ctxt *Link) {
                oh.DllCharacteristics = IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE | IMAGE_DLLCHARACTERISTICS_NX_COMPAT
        }
 
+       // 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
+
        // Disable stack growth as we don't want Windows to
        // fiddle with the thread stack limits, which we set
        // ourselves to circumvent the stack checks in the