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)