github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/cmd/link/internal/ld/macho.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  package ld
     6  
     7  import (
     8  	"github.com/shogo82148/std/cmd/link/internal/loader"
     9  )
    10  
    11  type MachoHdr struct {
    12  	cpu    uint32
    13  	subcpu uint32
    14  }
    15  
    16  type MachoSect struct {
    17  	name    string
    18  	segname string
    19  	addr    uint64
    20  	size    uint64
    21  	off     uint32
    22  	align   uint32
    23  	reloc   uint32
    24  	nreloc  uint32
    25  	flag    uint32
    26  	res1    uint32
    27  	res2    uint32
    28  }
    29  
    30  type MachoSeg struct {
    31  	name       string
    32  	vsize      uint64
    33  	vaddr      uint64
    34  	fileoffset uint64
    35  	filesize   uint64
    36  	prot1      uint32
    37  	prot2      uint32
    38  	nsect      uint32
    39  	msect      uint32
    40  	sect       []MachoSect
    41  	flag       uint32
    42  }
    43  
    44  // MachoPlatformLoad represents a LC_VERSION_MIN_* or
    45  // LC_BUILD_VERSION load command.
    46  type MachoPlatformLoad struct {
    47  	platform MachoPlatform
    48  	cmd      MachoLoad
    49  }
    50  
    51  type MachoLoad struct {
    52  	type_ uint32
    53  	data  []uint32
    54  }
    55  
    56  type MachoPlatform int
    57  
    58  /*
    59   * Total amount of space to reserve at the start of the file
    60   * for Header, PHeaders, and SHeaders.
    61   * May waste some.
    62   */
    63  const (
    64  	INITIAL_MACHO_HEADR = 4 * 1024
    65  )
    66  
    67  const (
    68  	MACHO_CPU_AMD64                      = 1<<24 | 7
    69  	MACHO_CPU_386                        = 7
    70  	MACHO_SUBCPU_X86                     = 3
    71  	MACHO_CPU_ARM                        = 12
    72  	MACHO_SUBCPU_ARM                     = 0
    73  	MACHO_SUBCPU_ARMV7                   = 9
    74  	MACHO_CPU_ARM64                      = 1<<24 | 12
    75  	MACHO_SUBCPU_ARM64_ALL               = 0
    76  	MACHO_SUBCPU_ARM64_V8                = 1
    77  	MACHO_SUBCPU_ARM64E                  = 2
    78  	MACHO32SYMSIZE                       = 12
    79  	MACHO64SYMSIZE                       = 16
    80  	MACHO_X86_64_RELOC_UNSIGNED          = 0
    81  	MACHO_X86_64_RELOC_SIGNED            = 1
    82  	MACHO_X86_64_RELOC_BRANCH            = 2
    83  	MACHO_X86_64_RELOC_GOT_LOAD          = 3
    84  	MACHO_X86_64_RELOC_GOT               = 4
    85  	MACHO_X86_64_RELOC_SUBTRACTOR        = 5
    86  	MACHO_X86_64_RELOC_SIGNED_1          = 6
    87  	MACHO_X86_64_RELOC_SIGNED_2          = 7
    88  	MACHO_X86_64_RELOC_SIGNED_4          = 8
    89  	MACHO_ARM_RELOC_VANILLA              = 0
    90  	MACHO_ARM_RELOC_PAIR                 = 1
    91  	MACHO_ARM_RELOC_SECTDIFF             = 2
    92  	MACHO_ARM_RELOC_BR24                 = 5
    93  	MACHO_ARM64_RELOC_UNSIGNED           = 0
    94  	MACHO_ARM64_RELOC_BRANCH26           = 2
    95  	MACHO_ARM64_RELOC_PAGE21             = 3
    96  	MACHO_ARM64_RELOC_PAGEOFF12          = 4
    97  	MACHO_ARM64_RELOC_GOT_LOAD_PAGE21    = 5
    98  	MACHO_ARM64_RELOC_GOT_LOAD_PAGEOFF12 = 6
    99  	MACHO_ARM64_RELOC_ADDEND             = 10
   100  	MACHO_GENERIC_RELOC_VANILLA          = 0
   101  	MACHO_FAKE_GOTPCREL                  = 100
   102  )
   103  
   104  const (
   105  	MH_MAGIC    = 0xfeedface
   106  	MH_MAGIC_64 = 0xfeedfacf
   107  
   108  	MH_OBJECT  = 0x1
   109  	MH_EXECUTE = 0x2
   110  
   111  	MH_NOUNDEFS = 0x1
   112  	MH_DYLDLINK = 0x4
   113  	MH_PIE      = 0x200000
   114  )
   115  
   116  const (
   117  	LC_SEGMENT                  = 0x1
   118  	LC_SYMTAB                   = 0x2
   119  	LC_SYMSEG                   = 0x3
   120  	LC_THREAD                   = 0x4
   121  	LC_UNIXTHREAD               = 0x5
   122  	LC_LOADFVMLIB               = 0x6
   123  	LC_IDFVMLIB                 = 0x7
   124  	LC_IDENT                    = 0x8
   125  	LC_FVMFILE                  = 0x9
   126  	LC_PREPAGE                  = 0xa
   127  	LC_DYSYMTAB                 = 0xb
   128  	LC_LOAD_DYLIB               = 0xc
   129  	LC_ID_DYLIB                 = 0xd
   130  	LC_LOAD_DYLINKER            = 0xe
   131  	LC_ID_DYLINKER              = 0xf
   132  	LC_PREBOUND_DYLIB           = 0x10
   133  	LC_ROUTINES                 = 0x11
   134  	LC_SUB_FRAMEWORK            = 0x12
   135  	LC_SUB_UMBRELLA             = 0x13
   136  	LC_SUB_CLIENT               = 0x14
   137  	LC_SUB_LIBRARY              = 0x15
   138  	LC_TWOLEVEL_HINTS           = 0x16
   139  	LC_PREBIND_CKSUM            = 0x17
   140  	LC_LOAD_WEAK_DYLIB          = 0x80000018
   141  	LC_SEGMENT_64               = 0x19
   142  	LC_ROUTINES_64              = 0x1a
   143  	LC_UUID                     = 0x1b
   144  	LC_RPATH                    = 0x8000001c
   145  	LC_CODE_SIGNATURE           = 0x1d
   146  	LC_SEGMENT_SPLIT_INFO       = 0x1e
   147  	LC_REEXPORT_DYLIB           = 0x8000001f
   148  	LC_LAZY_LOAD_DYLIB          = 0x20
   149  	LC_ENCRYPTION_INFO          = 0x21
   150  	LC_DYLD_INFO                = 0x22
   151  	LC_DYLD_INFO_ONLY           = 0x80000022
   152  	LC_LOAD_UPWARD_DYLIB        = 0x80000023
   153  	LC_VERSION_MIN_MACOSX       = 0x24
   154  	LC_VERSION_MIN_IPHONEOS     = 0x25
   155  	LC_FUNCTION_STARTS          = 0x26
   156  	LC_DYLD_ENVIRONMENT         = 0x27
   157  	LC_MAIN                     = 0x80000028
   158  	LC_DATA_IN_CODE             = 0x29
   159  	LC_SOURCE_VERSION           = 0x2A
   160  	LC_DYLIB_CODE_SIGN_DRS      = 0x2B
   161  	LC_ENCRYPTION_INFO_64       = 0x2C
   162  	LC_LINKER_OPTION            = 0x2D
   163  	LC_LINKER_OPTIMIZATION_HINT = 0x2E
   164  	LC_VERSION_MIN_TVOS         = 0x2F
   165  	LC_VERSION_MIN_WATCHOS      = 0x30
   166  	LC_VERSION_NOTE             = 0x31
   167  	LC_BUILD_VERSION            = 0x32
   168  	LC_DYLD_EXPORTS_TRIE        = 0x80000033
   169  	LC_DYLD_CHAINED_FIXUPS      = 0x80000034
   170  )
   171  
   172  const (
   173  	S_REGULAR                  = 0x0
   174  	S_ZEROFILL                 = 0x1
   175  	S_NON_LAZY_SYMBOL_POINTERS = 0x6
   176  	S_SYMBOL_STUBS             = 0x8
   177  	S_MOD_INIT_FUNC_POINTERS   = 0x9
   178  	S_ATTR_PURE_INSTRUCTIONS   = 0x80000000
   179  	S_ATTR_DEBUG               = 0x02000000
   180  	S_ATTR_SOME_INSTRUCTIONS   = 0x00000400
   181  )
   182  
   183  const (
   184  	PLATFORM_MACOS    MachoPlatform = 1
   185  	PLATFORM_IOS      MachoPlatform = 2
   186  	PLATFORM_TVOS     MachoPlatform = 3
   187  	PLATFORM_WATCHOS  MachoPlatform = 4
   188  	PLATFORM_BRIDGEOS MachoPlatform = 5
   189  )
   190  
   191  // rebase table opcode
   192  const (
   193  	REBASE_TYPE_POINTER         = 1
   194  	REBASE_TYPE_TEXT_ABSOLUTE32 = 2
   195  	REBASE_TYPE_TEXT_PCREL32    = 3
   196  
   197  	REBASE_OPCODE_MASK                               = 0xF0
   198  	REBASE_IMMEDIATE_MASK                            = 0x0F
   199  	REBASE_OPCODE_DONE                               = 0x00
   200  	REBASE_OPCODE_SET_TYPE_IMM                       = 0x10
   201  	REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB        = 0x20
   202  	REBASE_OPCODE_ADD_ADDR_ULEB                      = 0x30
   203  	REBASE_OPCODE_ADD_ADDR_IMM_SCALED                = 0x40
   204  	REBASE_OPCODE_DO_REBASE_IMM_TIMES                = 0x50
   205  	REBASE_OPCODE_DO_REBASE_ULEB_TIMES               = 0x60
   206  	REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB            = 0x70
   207  	REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB = 0x80
   208  )
   209  
   210  // bind table opcode
   211  const (
   212  	BIND_TYPE_POINTER         = 1
   213  	BIND_TYPE_TEXT_ABSOLUTE32 = 2
   214  	BIND_TYPE_TEXT_PCREL32    = 3
   215  
   216  	BIND_SPECIAL_DYLIB_SELF            = 0
   217  	BIND_SPECIAL_DYLIB_MAIN_EXECUTABLE = -1
   218  	BIND_SPECIAL_DYLIB_FLAT_LOOKUP     = -2
   219  	BIND_SPECIAL_DYLIB_WEAK_LOOKUP     = -3
   220  
   221  	BIND_OPCODE_MASK                                         = 0xF0
   222  	BIND_IMMEDIATE_MASK                                      = 0x0F
   223  	BIND_OPCODE_DONE                                         = 0x00
   224  	BIND_OPCODE_SET_DYLIB_ORDINAL_IMM                        = 0x10
   225  	BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB                       = 0x20
   226  	BIND_OPCODE_SET_DYLIB_SPECIAL_IMM                        = 0x30
   227  	BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM                = 0x40
   228  	BIND_OPCODE_SET_TYPE_IMM                                 = 0x50
   229  	BIND_OPCODE_SET_ADDEND_SLEB                              = 0x60
   230  	BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB                  = 0x70
   231  	BIND_OPCODE_ADD_ADDR_ULEB                                = 0x80
   232  	BIND_OPCODE_DO_BIND                                      = 0x90
   233  	BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB                        = 0xA0
   234  	BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED                  = 0xB0
   235  	BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB             = 0xC0
   236  	BIND_OPCODE_THREADED                                     = 0xD0
   237  	BIND_SUBOPCODE_THREADED_SET_BIND_ORDINAL_TABLE_SIZE_ULEB = 0x00
   238  	BIND_SUBOPCODE_THREADED_APPLY                            = 0x01
   239  )
   240  
   241  const (
   242  	SymKindLocal = 0 + iota
   243  	SymKindExtdef
   244  	SymKindUndef
   245  	NumSymKind
   246  )
   247  
   248  // AddMachoSym adds s to Mach-O symbol table, used in GenSymLate.
   249  // Currently only used on ARM64 when external linking.
   250  func AddMachoSym(ldr *loader.Loader, s loader.Sym)
   251  
   252  func MachoAddRebase(s loader.Sym, off int64)
   253  
   254  func MachoAddBind(off int64, targ loader.Sym)