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)