github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/cmd/link/internal/ld/pe.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // PE (Portable Executable) file writing 6 // https://docs.microsoft.com/en-us/windows/win32/debug/pe-format 7 8 package ld 9 10 import ( 11 "github.com/shogo82148/std/cmd/link/internal/loader" 12 ) 13 14 type IMAGE_IMPORT_DESCRIPTOR struct { 15 OriginalFirstThunk uint32 16 TimeDateStamp uint32 17 ForwarderChain uint32 18 Name uint32 19 FirstThunk uint32 20 } 21 22 type IMAGE_EXPORT_DIRECTORY struct { 23 Characteristics uint32 24 TimeDateStamp uint32 25 MajorVersion uint16 26 MinorVersion uint16 27 Name uint32 28 Base uint32 29 NumberOfFunctions uint32 30 NumberOfNames uint32 31 AddressOfFunctions uint32 32 AddressOfNames uint32 33 AddressOfNameOrdinals uint32 34 } 35 36 var ( 37 // PEBASE is the base address for the executable. 38 // It is small for 32-bit and large for 64-bit. 39 PEBASE int64 40 41 // SectionAlignment must be greater than or equal to FileAlignment. 42 // The default is the page size for the architecture. 43 PESECTALIGN int64 = 0x1000 44 45 // FileAlignment should be a power of 2 between 512 and 64 K, inclusive. 46 // The default is 512. If the SectionAlignment is less than 47 // the architecture's page size, then FileAlignment must match SectionAlignment. 48 PEFILEALIGN int64 = 2 << 8 49 ) 50 51 const ( 52 IMAGE_SCN_CNT_CODE = 0x00000020 53 IMAGE_SCN_CNT_INITIALIZED_DATA = 0x00000040 54 IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080 55 IMAGE_SCN_LNK_OTHER = 0x00000100 56 IMAGE_SCN_LNK_INFO = 0x00000200 57 IMAGE_SCN_LNK_REMOVE = 0x00000800 58 IMAGE_SCN_LNK_COMDAT = 0x00001000 59 IMAGE_SCN_GPREL = 0x00008000 60 IMAGE_SCN_MEM_PURGEABLE = 0x00020000 61 IMAGE_SCN_MEM_16BIT = 0x00020000 62 IMAGE_SCN_MEM_LOCKED = 0x00040000 63 IMAGE_SCN_MEM_PRELOAD = 0x00080000 64 IMAGE_SCN_ALIGN_1BYTES = 0x00100000 65 IMAGE_SCN_ALIGN_2BYTES = 0x00200000 66 IMAGE_SCN_ALIGN_4BYTES = 0x00300000 67 IMAGE_SCN_ALIGN_8BYTES = 0x00400000 68 IMAGE_SCN_ALIGN_16BYTES = 0x00500000 69 IMAGE_SCN_ALIGN_32BYTES = 0x00600000 70 IMAGE_SCN_ALIGN_64BYTES = 0x00700000 71 IMAGE_SCN_ALIGN_128BYTES = 0x00800000 72 IMAGE_SCN_ALIGN_256BYTES = 0x00900000 73 IMAGE_SCN_ALIGN_512BYTES = 0x00A00000 74 IMAGE_SCN_ALIGN_1024BYTES = 0x00B00000 75 IMAGE_SCN_ALIGN_2048BYTES = 0x00C00000 76 IMAGE_SCN_ALIGN_4096BYTES = 0x00D00000 77 IMAGE_SCN_ALIGN_8192BYTES = 0x00E00000 78 IMAGE_SCN_LNK_NRELOC_OVFL = 0x01000000 79 IMAGE_SCN_MEM_DISCARDABLE = 0x02000000 80 IMAGE_SCN_MEM_NOT_CACHED = 0x04000000 81 IMAGE_SCN_MEM_NOT_PAGED = 0x08000000 82 IMAGE_SCN_MEM_SHARED = 0x10000000 83 IMAGE_SCN_MEM_EXECUTE = 0x20000000 84 IMAGE_SCN_MEM_READ = 0x40000000 85 IMAGE_SCN_MEM_WRITE = 0x80000000 86 ) 87 88 // See https://docs.microsoft.com/en-us/windows/win32/debug/pe-format. 89 // TODO(crawshaw): add these constants to debug/pe. 90 const ( 91 IMAGE_SYM_TYPE_NULL = 0 92 IMAGE_SYM_TYPE_STRUCT = 8 93 IMAGE_SYM_DTYPE_FUNCTION = 2 94 IMAGE_SYM_DTYPE_ARRAY = 3 95 IMAGE_SYM_CLASS_EXTERNAL = 2 96 IMAGE_SYM_CLASS_STATIC = 3 97 98 IMAGE_REL_I386_DIR32 = 0x0006 99 IMAGE_REL_I386_DIR32NB = 0x0007 100 IMAGE_REL_I386_SECREL = 0x000B 101 IMAGE_REL_I386_REL32 = 0x0014 102 103 IMAGE_REL_AMD64_ADDR64 = 0x0001 104 IMAGE_REL_AMD64_ADDR32 = 0x0002 105 IMAGE_REL_AMD64_ADDR32NB = 0x0003 106 IMAGE_REL_AMD64_REL32 = 0x0004 107 IMAGE_REL_AMD64_SECREL = 0x000B 108 109 IMAGE_REL_ARM_ABSOLUTE = 0x0000 110 IMAGE_REL_ARM_ADDR32 = 0x0001 111 IMAGE_REL_ARM_ADDR32NB = 0x0002 112 IMAGE_REL_ARM_BRANCH24 = 0x0003 113 IMAGE_REL_ARM_BRANCH11 = 0x0004 114 IMAGE_REL_ARM_SECREL = 0x000F 115 116 IMAGE_REL_ARM64_ABSOLUTE = 0x0000 117 IMAGE_REL_ARM64_ADDR32 = 0x0001 118 IMAGE_REL_ARM64_ADDR32NB = 0x0002 119 IMAGE_REL_ARM64_BRANCH26 = 0x0003 120 IMAGE_REL_ARM64_PAGEBASE_REL21 = 0x0004 121 IMAGE_REL_ARM64_REL21 = 0x0005 122 IMAGE_REL_ARM64_PAGEOFFSET_12A = 0x0006 123 IMAGE_REL_ARM64_PAGEOFFSET_12L = 0x0007 124 IMAGE_REL_ARM64_SECREL = 0x0008 125 IMAGE_REL_ARM64_SECREL_LOW12A = 0x0009 126 IMAGE_REL_ARM64_SECREL_HIGH12A = 0x000A 127 IMAGE_REL_ARM64_SECREL_LOW12L = 0x000B 128 IMAGE_REL_ARM64_TOKEN = 0x000C 129 IMAGE_REL_ARM64_SECTION = 0x000D 130 IMAGE_REL_ARM64_ADDR64 = 0x000E 131 IMAGE_REL_ARM64_BRANCH19 = 0x000F 132 IMAGE_REL_ARM64_BRANCH14 = 0x0010 133 IMAGE_REL_ARM64_REL32 = 0x0011 134 135 IMAGE_REL_BASED_HIGHLOW = 3 136 IMAGE_REL_BASED_DIR64 = 10 137 ) 138 139 const ( 140 PeMinimumTargetMajorVersion = 6 141 PeMinimumTargetMinorVersion = 1 142 ) 143 144 type Imp struct { 145 s loader.Sym 146 off uint64 147 next *Imp 148 argsize int 149 } 150 151 type Dll struct { 152 name string 153 nameoff uint64 154 thunkoff uint64 155 ms *Imp 156 next *Dll 157 } 158 159 var ( 160 PESECTHEADR int32 161 PEFILEHEADR int32 162 ) 163 164 func AddPELabelSym(ldr *loader.Loader, s loader.Sym) 165 166 func Peinit(ctxt *Link)