1*a9fa9459Szrj /* Mach-O support for BFD. 2*a9fa9459Szrj Copyright (C) 2011-2016 Free Software Foundation, Inc. 3*a9fa9459Szrj 4*a9fa9459Szrj This file is part of BFD, the Binary File Descriptor library. 5*a9fa9459Szrj 6*a9fa9459Szrj This program is free software; you can redistribute it and/or modify 7*a9fa9459Szrj it under the terms of the GNU General Public License as published by 8*a9fa9459Szrj the Free Software Foundation; either version 3 of the License, or 9*a9fa9459Szrj (at your option) any later version. 10*a9fa9459Szrj 11*a9fa9459Szrj This program is distributed in the hope that it will be useful, 12*a9fa9459Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of 13*a9fa9459Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*a9fa9459Szrj GNU General Public License for more details. 15*a9fa9459Szrj 16*a9fa9459Szrj You should have received a copy of the GNU General Public License 17*a9fa9459Szrj along with this program; if not, write to the Free Software 18*a9fa9459Szrj Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 19*a9fa9459Szrj MA 02110-1301, USA. */ 20*a9fa9459Szrj 21*a9fa9459Szrj #ifndef _MACH_O_LOADER_H 22*a9fa9459Szrj #define _MACH_O_LOADER_H 23*a9fa9459Szrj 24*a9fa9459Szrj /* Constants for header. */ 25*a9fa9459Szrj 26*a9fa9459Szrj typedef enum bfd_mach_o_mach_header_magic 27*a9fa9459Szrj { 28*a9fa9459Szrj BFD_MACH_O_MH_MAGIC = 0xfeedface, 29*a9fa9459Szrj BFD_MACH_O_MH_CIGAM = 0xcefaedfe, 30*a9fa9459Szrj BFD_MACH_O_MH_MAGIC_64 = 0xfeedfacf, 31*a9fa9459Szrj BFD_MACH_O_MH_CIGAM_64 = 0xcffaedfe 32*a9fa9459Szrj } 33*a9fa9459Szrj bfd_mach_o_mach_header_magic; 34*a9fa9459Szrj 35*a9fa9459Szrj /* Capability bits in cpu type. */ 36*a9fa9459Szrj #define BFD_MACH_O_CPU_ARCH_MASK 0xff000000 37*a9fa9459Szrj #define BFD_MACH_O_CPU_ARCH_ABI64 0x01000000 38*a9fa9459Szrj #define BFD_MACH_O_CPU_IS64BIT 0x01000000 39*a9fa9459Szrj 40*a9fa9459Szrj typedef enum bfd_mach_o_cpu_type 41*a9fa9459Szrj { 42*a9fa9459Szrj BFD_MACH_O_CPU_TYPE_VAX = 1, 43*a9fa9459Szrj BFD_MACH_O_CPU_TYPE_MC680x0 = 6, 44*a9fa9459Szrj BFD_MACH_O_CPU_TYPE_I386 = 7, 45*a9fa9459Szrj BFD_MACH_O_CPU_TYPE_MIPS = 8, 46*a9fa9459Szrj BFD_MACH_O_CPU_TYPE_MC98000 = 10, 47*a9fa9459Szrj BFD_MACH_O_CPU_TYPE_HPPA = 11, 48*a9fa9459Szrj BFD_MACH_O_CPU_TYPE_ARM = 12, 49*a9fa9459Szrj BFD_MACH_O_CPU_TYPE_MC88000 = 13, 50*a9fa9459Szrj BFD_MACH_O_CPU_TYPE_SPARC = 14, 51*a9fa9459Szrj BFD_MACH_O_CPU_TYPE_I860 = 15, 52*a9fa9459Szrj BFD_MACH_O_CPU_TYPE_ALPHA = 16, 53*a9fa9459Szrj BFD_MACH_O_CPU_TYPE_POWERPC = 18, 54*a9fa9459Szrj BFD_MACH_O_CPU_TYPE_POWERPC_64 = 55*a9fa9459Szrj (BFD_MACH_O_CPU_TYPE_POWERPC | BFD_MACH_O_CPU_IS64BIT), 56*a9fa9459Szrj BFD_MACH_O_CPU_TYPE_X86_64 = 57*a9fa9459Szrj (BFD_MACH_O_CPU_TYPE_I386 | BFD_MACH_O_CPU_IS64BIT), 58*a9fa9459Szrj BFD_MACH_O_CPU_TYPE_ARM64 = 59*a9fa9459Szrj (BFD_MACH_O_CPU_TYPE_ARM | BFD_MACH_O_CPU_IS64BIT) 60*a9fa9459Szrj } 61*a9fa9459Szrj bfd_mach_o_cpu_type; 62*a9fa9459Szrj 63*a9fa9459Szrj /* Capability bits in cpu subtype. */ 64*a9fa9459Szrj #define BFD_MACH_O_CPU_SUBTYPE_MASK 0xff000000 65*a9fa9459Szrj #define BFD_MACH_O_CPU_SUBTYPE_LIB64 0x80000000 66*a9fa9459Szrj 67*a9fa9459Szrj typedef enum bfd_mach_o_cpu_subtype 68*a9fa9459Szrj { 69*a9fa9459Szrj /* i386. */ 70*a9fa9459Szrj BFD_MACH_O_CPU_SUBTYPE_X86_ALL = 3, 71*a9fa9459Szrj 72*a9fa9459Szrj /* arm. */ 73*a9fa9459Szrj BFD_MACH_O_CPU_SUBTYPE_ARM_ALL = 0, 74*a9fa9459Szrj BFD_MACH_O_CPU_SUBTYPE_ARM_V4T = 5, 75*a9fa9459Szrj BFD_MACH_O_CPU_SUBTYPE_ARM_V6 = 6, 76*a9fa9459Szrj BFD_MACH_O_CPU_SUBTYPE_ARM_V5TEJ = 7, 77*a9fa9459Szrj BFD_MACH_O_CPU_SUBTYPE_ARM_XSCALE = 8, 78*a9fa9459Szrj BFD_MACH_O_CPU_SUBTYPE_ARM_V7 = 9, 79*a9fa9459Szrj 80*a9fa9459Szrj /* arm64. */ 81*a9fa9459Szrj BFD_MACH_O_CPU_SUBTYPE_ARM64_ALL = 0, 82*a9fa9459Szrj BFD_MACH_O_CPU_SUBTYPE_ARM64_V8 = 1 83*a9fa9459Szrj } 84*a9fa9459Szrj bfd_mach_o_cpu_subtype; 85*a9fa9459Szrj 86*a9fa9459Szrj typedef enum bfd_mach_o_filetype 87*a9fa9459Szrj { 88*a9fa9459Szrj BFD_MACH_O_MH_OBJECT = 0x01, 89*a9fa9459Szrj BFD_MACH_O_MH_EXECUTE = 0x02, 90*a9fa9459Szrj BFD_MACH_O_MH_FVMLIB = 0x03, 91*a9fa9459Szrj BFD_MACH_O_MH_CORE = 0x04, 92*a9fa9459Szrj BFD_MACH_O_MH_PRELOAD = 0x05, 93*a9fa9459Szrj BFD_MACH_O_MH_DYLIB = 0x06, 94*a9fa9459Szrj BFD_MACH_O_MH_DYLINKER = 0x07, 95*a9fa9459Szrj BFD_MACH_O_MH_BUNDLE = 0x08, 96*a9fa9459Szrj BFD_MACH_O_MH_DYLIB_STUB = 0x09, 97*a9fa9459Szrj BFD_MACH_O_MH_DSYM = 0x0a, 98*a9fa9459Szrj BFD_MACH_O_MH_KEXT_BUNDLE = 0x0b 99*a9fa9459Szrj } 100*a9fa9459Szrj bfd_mach_o_filetype; 101*a9fa9459Szrj 102*a9fa9459Szrj typedef enum bfd_mach_o_header_flags 103*a9fa9459Szrj { 104*a9fa9459Szrj BFD_MACH_O_MH_NOUNDEFS = 0x0000001, 105*a9fa9459Szrj BFD_MACH_O_MH_INCRLINK = 0x0000002, 106*a9fa9459Szrj BFD_MACH_O_MH_DYLDLINK = 0x0000004, 107*a9fa9459Szrj BFD_MACH_O_MH_BINDATLOAD = 0x0000008, 108*a9fa9459Szrj BFD_MACH_O_MH_PREBOUND = 0x0000010, 109*a9fa9459Szrj BFD_MACH_O_MH_SPLIT_SEGS = 0x0000020, 110*a9fa9459Szrj BFD_MACH_O_MH_LAZY_INIT = 0x0000040, 111*a9fa9459Szrj BFD_MACH_O_MH_TWOLEVEL = 0x0000080, 112*a9fa9459Szrj BFD_MACH_O_MH_FORCE_FLAT = 0x0000100, 113*a9fa9459Szrj BFD_MACH_O_MH_NOMULTIDEFS = 0x0000200, 114*a9fa9459Szrj BFD_MACH_O_MH_NOFIXPREBINDING = 0x0000400, 115*a9fa9459Szrj BFD_MACH_O_MH_PREBINDABLE = 0x0000800, 116*a9fa9459Szrj BFD_MACH_O_MH_ALLMODSBOUND = 0x0001000, 117*a9fa9459Szrj BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS = 0x0002000, 118*a9fa9459Szrj BFD_MACH_O_MH_CANONICAL = 0x0004000, 119*a9fa9459Szrj BFD_MACH_O_MH_WEAK_DEFINES = 0x0008000, 120*a9fa9459Szrj BFD_MACH_O_MH_BINDS_TO_WEAK = 0x0010000, 121*a9fa9459Szrj BFD_MACH_O_MH_ALLOW_STACK_EXECUTION = 0x0020000, 122*a9fa9459Szrj BFD_MACH_O_MH_ROOT_SAFE = 0x0040000, 123*a9fa9459Szrj BFD_MACH_O_MH_SETUID_SAFE = 0x0080000, 124*a9fa9459Szrj BFD_MACH_O_MH_NO_REEXPORTED_DYLIBS = 0x0100000, 125*a9fa9459Szrj BFD_MACH_O_MH_PIE = 0x0200000, 126*a9fa9459Szrj BFD_MACH_O_MH_DEAD_STRIPPABLE_DYLIB = 0x0400000, 127*a9fa9459Szrj BFD_MACH_O_MH_HAS_TLV_DESCRIPTORS = 0x0800000, 128*a9fa9459Szrj BFD_MACH_O_MH_NO_HEAP_EXECUTION = 0x1000000, 129*a9fa9459Szrj BFD_MACH_O_MH_APP_EXTENSION_SAFE = 0x2000000 130*a9fa9459Szrj } 131*a9fa9459Szrj bfd_mach_o_header_flags; 132*a9fa9459Szrj 133*a9fa9459Szrj /* Load command constants. */ 134*a9fa9459Szrj #define BFD_MACH_O_LC_REQ_DYLD 0x80000000 135*a9fa9459Szrj 136*a9fa9459Szrj typedef enum bfd_mach_o_load_command_type 137*a9fa9459Szrj { 138*a9fa9459Szrj BFD_MACH_O_LC_SEGMENT = 0x1, /* File segment to be mapped. */ 139*a9fa9459Szrj BFD_MACH_O_LC_SYMTAB = 0x2, /* Link-edit stab symbol table info (obsolete). */ 140*a9fa9459Szrj BFD_MACH_O_LC_SYMSEG = 0x3, /* Link-edit gdb symbol table info. */ 141*a9fa9459Szrj BFD_MACH_O_LC_THREAD = 0x4, /* Thread. */ 142*a9fa9459Szrj BFD_MACH_O_LC_UNIXTHREAD = 0x5, /* UNIX thread (includes a stack). */ 143*a9fa9459Szrj BFD_MACH_O_LC_LOADFVMLIB = 0x6, /* Load a fixed VM shared library. */ 144*a9fa9459Szrj BFD_MACH_O_LC_IDFVMLIB = 0x7, /* Fixed VM shared library id. */ 145*a9fa9459Szrj BFD_MACH_O_LC_IDENT = 0x8, /* Object identification information (obsolete). */ 146*a9fa9459Szrj BFD_MACH_O_LC_FVMFILE = 0x9, /* Fixed VM file inclusion. */ 147*a9fa9459Szrj BFD_MACH_O_LC_PREPAGE = 0xa, /* Prepage command (internal use). */ 148*a9fa9459Szrj BFD_MACH_O_LC_DYSYMTAB = 0xb, /* Dynamic link-edit symbol table info. */ 149*a9fa9459Szrj BFD_MACH_O_LC_LOAD_DYLIB = 0xc, /* Load a dynamically linked shared library. */ 150*a9fa9459Szrj BFD_MACH_O_LC_ID_DYLIB = 0xd, /* Dynamically linked shared lib identification. */ 151*a9fa9459Szrj BFD_MACH_O_LC_LOAD_DYLINKER = 0xe, /* Load a dynamic linker. */ 152*a9fa9459Szrj BFD_MACH_O_LC_ID_DYLINKER = 0xf, /* Dynamic linker identification. */ 153*a9fa9459Szrj BFD_MACH_O_LC_PREBOUND_DYLIB = 0x10, /* Modules prebound for a dynamically. */ 154*a9fa9459Szrj BFD_MACH_O_LC_ROUTINES = 0x11, /* Image routines. */ 155*a9fa9459Szrj BFD_MACH_O_LC_SUB_FRAMEWORK = 0x12, /* Sub framework. */ 156*a9fa9459Szrj BFD_MACH_O_LC_SUB_UMBRELLA = 0x13, /* Sub umbrella. */ 157*a9fa9459Szrj BFD_MACH_O_LC_SUB_CLIENT = 0x14, /* Sub client. */ 158*a9fa9459Szrj BFD_MACH_O_LC_SUB_LIBRARY = 0x15, /* Sub library. */ 159*a9fa9459Szrj BFD_MACH_O_LC_TWOLEVEL_HINTS = 0x16, /* Two-level namespace lookup hints. */ 160*a9fa9459Szrj BFD_MACH_O_LC_PREBIND_CKSUM = 0x17, /* Prebind checksum. */ 161*a9fa9459Szrj /* Load a dynamically linked shared library that is allowed to be 162*a9fa9459Szrj missing (weak). */ 163*a9fa9459Szrj BFD_MACH_O_LC_LOAD_WEAK_DYLIB = 0x18, 164*a9fa9459Szrj BFD_MACH_O_LC_SEGMENT_64 = 0x19, /* 64-bit segment of this file to be 165*a9fa9459Szrj mapped. */ 166*a9fa9459Szrj BFD_MACH_O_LC_ROUTINES_64 = 0x1a, /* Address of the dyld init routine 167*a9fa9459Szrj in a dylib. */ 168*a9fa9459Szrj BFD_MACH_O_LC_UUID = 0x1b, /* 128-bit UUID of the executable. */ 169*a9fa9459Szrj BFD_MACH_O_LC_RPATH = 0x1c, /* Run path addiions. */ 170*a9fa9459Szrj BFD_MACH_O_LC_CODE_SIGNATURE = 0x1d, /* Local of code signature. */ 171*a9fa9459Szrj BFD_MACH_O_LC_SEGMENT_SPLIT_INFO = 0x1e, /* Local of info to split seg. */ 172*a9fa9459Szrj BFD_MACH_O_LC_REEXPORT_DYLIB = 0x1f, /* Load and re-export lib. */ 173*a9fa9459Szrj BFD_MACH_O_LC_LAZY_LOAD_DYLIB = 0x20, /* Delay load of lib until use. */ 174*a9fa9459Szrj BFD_MACH_O_LC_ENCRYPTION_INFO = 0x21, /* Encrypted segment info. */ 175*a9fa9459Szrj BFD_MACH_O_LC_DYLD_INFO = 0x22, /* Compressed dyld information. */ 176*a9fa9459Szrj BFD_MACH_O_LC_LOAD_UPWARD_DYLIB = 0x23, /* Load upward dylib. */ 177*a9fa9459Szrj BFD_MACH_O_LC_VERSION_MIN_MACOSX = 0x24, /* Minimal MacOSX version. */ 178*a9fa9459Szrj BFD_MACH_O_LC_VERSION_MIN_IPHONEOS = 0x25, /* Minimal IOS version. */ 179*a9fa9459Szrj BFD_MACH_O_LC_FUNCTION_STARTS = 0x26, /* Compressed table of func start. */ 180*a9fa9459Szrj BFD_MACH_O_LC_DYLD_ENVIRONMENT = 0x27, /* Env variable string for dyld. */ 181*a9fa9459Szrj BFD_MACH_O_LC_MAIN = 0x28, /* Entry point. */ 182*a9fa9459Szrj BFD_MACH_O_LC_DATA_IN_CODE = 0x29, /* Table of non-instructions. */ 183*a9fa9459Szrj BFD_MACH_O_LC_SOURCE_VERSION = 0x2a, /* Source version. */ 184*a9fa9459Szrj BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS = 0x2b, /* DRs from dylibs. */ 185*a9fa9459Szrj BFD_MACH_O_LC_ENCRYPTION_INFO_64 = 0x2c, /* Encrypted 64 bit seg info. */ 186*a9fa9459Szrj BFD_MACH_O_LC_LINKER_OPTIONS = 0x2d, /* Linker options. */ 187*a9fa9459Szrj BFD_MACH_O_LC_LINKER_OPTIMIZATION_HINT = 0x2e, /* Optimization hints. */ 188*a9fa9459Szrj BFD_MACH_O_LC_VERSION_MIN_WATCHOS = 0x30 /* Minimal WatchOS version. */ 189*a9fa9459Szrj } 190*a9fa9459Szrj bfd_mach_o_load_command_type; 191*a9fa9459Szrj 192*a9fa9459Szrj /* Section constants. */ 193*a9fa9459Szrj /* Constants for the type of a section. */ 194*a9fa9459Szrj 195*a9fa9459Szrj typedef enum bfd_mach_o_section_type 196*a9fa9459Szrj { 197*a9fa9459Szrj /* Regular section. */ 198*a9fa9459Szrj BFD_MACH_O_S_REGULAR = 0x0, 199*a9fa9459Szrj 200*a9fa9459Szrj /* Zero fill on demand section. */ 201*a9fa9459Szrj BFD_MACH_O_S_ZEROFILL = 0x1, 202*a9fa9459Szrj 203*a9fa9459Szrj /* Section with only literal C strings. */ 204*a9fa9459Szrj BFD_MACH_O_S_CSTRING_LITERALS = 0x2, 205*a9fa9459Szrj 206*a9fa9459Szrj /* Section with only 4 byte literals. */ 207*a9fa9459Szrj BFD_MACH_O_S_4BYTE_LITERALS = 0x3, 208*a9fa9459Szrj 209*a9fa9459Szrj /* Section with only 8 byte literals. */ 210*a9fa9459Szrj BFD_MACH_O_S_8BYTE_LITERALS = 0x4, 211*a9fa9459Szrj 212*a9fa9459Szrj /* Section with only pointers to literals. */ 213*a9fa9459Szrj BFD_MACH_O_S_LITERAL_POINTERS = 0x5, 214*a9fa9459Szrj 215*a9fa9459Szrj /* For the two types of symbol pointers sections and the symbol stubs 216*a9fa9459Szrj section they have indirect symbol table entries. For each of the 217*a9fa9459Szrj entries in the section the indirect symbol table entries, in 218*a9fa9459Szrj corresponding order in the indirect symbol table, start at the index 219*a9fa9459Szrj stored in the reserved1 field of the section structure. Since the 220*a9fa9459Szrj indirect symbol table entries correspond to the entries in the 221*a9fa9459Szrj section the number of indirect symbol table entries is inferred from 222*a9fa9459Szrj the size of the section divided by the size of the entries in the 223*a9fa9459Szrj section. For symbol pointers sections the size of the entries in 224*a9fa9459Szrj the section is 4 bytes and for symbol stubs sections the byte size 225*a9fa9459Szrj of the stubs is stored in the reserved2 field of the section 226*a9fa9459Szrj structure. */ 227*a9fa9459Szrj 228*a9fa9459Szrj /* Section with only non-lazy symbol pointers. */ 229*a9fa9459Szrj BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS = 0x6, 230*a9fa9459Szrj 231*a9fa9459Szrj /* Section with only lazy symbol pointers. */ 232*a9fa9459Szrj BFD_MACH_O_S_LAZY_SYMBOL_POINTERS = 0x7, 233*a9fa9459Szrj 234*a9fa9459Szrj /* Section with only symbol stubs, byte size of stub in the reserved2 235*a9fa9459Szrj field. */ 236*a9fa9459Szrj BFD_MACH_O_S_SYMBOL_STUBS = 0x8, 237*a9fa9459Szrj 238*a9fa9459Szrj /* Section with only function pointers for initialization. */ 239*a9fa9459Szrj BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS = 0x9, 240*a9fa9459Szrj 241*a9fa9459Szrj /* Section with only function pointers for termination. */ 242*a9fa9459Szrj BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS = 0xa, 243*a9fa9459Szrj 244*a9fa9459Szrj /* Section contains symbols that are coalesced by the linkers. */ 245*a9fa9459Szrj BFD_MACH_O_S_COALESCED = 0xb, 246*a9fa9459Szrj 247*a9fa9459Szrj /* Zero fill on demand section (possibly larger than 4 GB). */ 248*a9fa9459Szrj BFD_MACH_O_S_GB_ZEROFILL = 0xc, 249*a9fa9459Szrj 250*a9fa9459Szrj /* Section with only pairs of function pointers for interposing. */ 251*a9fa9459Szrj BFD_MACH_O_S_INTERPOSING = 0xd, 252*a9fa9459Szrj 253*a9fa9459Szrj /* Section with only 16 byte literals. */ 254*a9fa9459Szrj BFD_MACH_O_S_16BYTE_LITERALS = 0xe, 255*a9fa9459Szrj 256*a9fa9459Szrj /* Section contains DTrace Object Format. */ 257*a9fa9459Szrj BFD_MACH_O_S_DTRACE_DOF = 0xf, 258*a9fa9459Szrj 259*a9fa9459Szrj /* Section with only lazy symbol pointers to lazy loaded dylibs. */ 260*a9fa9459Szrj BFD_MACH_O_S_LAZY_DYLIB_SYMBOL_POINTERS = 0x10 261*a9fa9459Szrj } 262*a9fa9459Szrj bfd_mach_o_section_type; 263*a9fa9459Szrj 264*a9fa9459Szrj /* The flags field of a section structure is separated into two parts a section 265*a9fa9459Szrj type and section attributes. The section types are mutually exclusive (it 266*a9fa9459Szrj can only have one type) but the section attributes are not (it may have more 267*a9fa9459Szrj than one attribute). */ 268*a9fa9459Szrj 269*a9fa9459Szrj #define BFD_MACH_O_SECTION_TYPE_MASK 0x000000ff 270*a9fa9459Szrj 271*a9fa9459Szrj /* Constants for the section attributes part of the flags field of a section 272*a9fa9459Szrj structure. */ 273*a9fa9459Szrj #define BFD_MACH_O_SECTION_ATTRIBUTES_MASK 0xffffff00 274*a9fa9459Szrj /* System setable attributes. */ 275*a9fa9459Szrj #define BFD_MACH_O_SECTION_ATTRIBUTES_SYS 0x00ffff00 276*a9fa9459Szrj /* User attributes. */ 277*a9fa9459Szrj #define BFD_MACH_O_SECTION_ATTRIBUTES_USR 0xff000000 278*a9fa9459Szrj 279*a9fa9459Szrj typedef enum bfd_mach_o_section_attribute 280*a9fa9459Szrj { 281*a9fa9459Szrj /* Section has no specified attibutes. */ 282*a9fa9459Szrj BFD_MACH_O_S_ATTR_NONE = 0, 283*a9fa9459Szrj 284*a9fa9459Szrj /* Section has local relocation entries. */ 285*a9fa9459Szrj BFD_MACH_O_S_ATTR_LOC_RELOC = 0x00000100, 286*a9fa9459Szrj 287*a9fa9459Szrj /* Section has external relocation entries. */ 288*a9fa9459Szrj BFD_MACH_O_S_ATTR_EXT_RELOC = 0x00000200, 289*a9fa9459Szrj 290*a9fa9459Szrj /* Section contains some machine instructions. */ 291*a9fa9459Szrj BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS = 0x00000400, 292*a9fa9459Szrj 293*a9fa9459Szrj /* A debug section. */ 294*a9fa9459Szrj BFD_MACH_O_S_ATTR_DEBUG = 0x02000000, 295*a9fa9459Szrj 296*a9fa9459Szrj /* Used with i386 stubs. */ 297*a9fa9459Szrj BFD_MACH_O_S_SELF_MODIFYING_CODE = 0x04000000, 298*a9fa9459Szrj 299*a9fa9459Szrj /* Blocks are live if they reference live blocks. */ 300*a9fa9459Szrj BFD_MACH_O_S_ATTR_LIVE_SUPPORT = 0x08000000, 301*a9fa9459Szrj 302*a9fa9459Szrj /* No dead stripping. */ 303*a9fa9459Szrj BFD_MACH_O_S_ATTR_NO_DEAD_STRIP = 0x10000000, 304*a9fa9459Szrj 305*a9fa9459Szrj /* Section symbols can be stripped in files with MH_DYLDLINK flag. */ 306*a9fa9459Szrj BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS = 0x20000000, 307*a9fa9459Szrj 308*a9fa9459Szrj /* Section contains coalesced symbols that are not to be in the TOC of an 309*a9fa9459Szrj archive. */ 310*a9fa9459Szrj BFD_MACH_O_S_ATTR_NO_TOC = 0x40000000, 311*a9fa9459Szrj 312*a9fa9459Szrj /* Section contains only true machine instructions. */ 313*a9fa9459Szrj BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS = 0x80000000 314*a9fa9459Szrj } 315*a9fa9459Szrj bfd_mach_o_section_attribute; 316*a9fa9459Szrj 317*a9fa9459Szrj /* Symbol constants. */ 318*a9fa9459Szrj 319*a9fa9459Szrj /* Symbol n_type values. */ 320*a9fa9459Szrj #define BFD_MACH_O_N_STAB 0xe0 /* If any of these bits set, a symbolic debugging entry. */ 321*a9fa9459Szrj #define BFD_MACH_O_N_PEXT 0x10 /* Private external symbol bit. */ 322*a9fa9459Szrj #define BFD_MACH_O_N_TYPE 0x0e /* Mask for the type bits. */ 323*a9fa9459Szrj #define BFD_MACH_O_N_EXT 0x01 /* External symbol bit, set for external symbols. */ 324*a9fa9459Szrj #define BFD_MACH_O_N_UNDF 0x00 /* Undefined, n_sect == NO_SECT. */ 325*a9fa9459Szrj #define BFD_MACH_O_N_ABS 0x02 /* Absolute, n_sect == NO_SECT. */ 326*a9fa9459Szrj #define BFD_MACH_O_N_INDR 0x0a /* Indirect. */ 327*a9fa9459Szrj #define BFD_MACH_O_N_PBUD 0x0c /* Prebound undefined (defined in a dylib). */ 328*a9fa9459Szrj #define BFD_MACH_O_N_SECT 0x0e /* Defined in section number n_sect. */ 329*a9fa9459Szrj 330*a9fa9459Szrj #define BFD_MACH_O_NO_SECT 0 /* Symbol not in any section of the image. */ 331*a9fa9459Szrj 332*a9fa9459Szrj /* Symbol n_desc reference flags. */ 333*a9fa9459Szrj #define BFD_MACH_O_REFERENCE_MASK 0x07 334*a9fa9459Szrj #define BFD_MACH_O_REFERENCE_FLAG_UNDEFINED_NON_LAZY 0x00 335*a9fa9459Szrj #define BFD_MACH_O_REFERENCE_FLAG_UNDEFINED_LAZY 0x01 336*a9fa9459Szrj #define BFD_MACH_O_REFERENCE_FLAG_DEFINED 0x02 337*a9fa9459Szrj #define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_DEFINED 0x03 338*a9fa9459Szrj #define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY 0x04 339*a9fa9459Szrj #define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY 0x05 340*a9fa9459Szrj 341*a9fa9459Szrj #define BFD_MACH_O_REFERENCED_DYNAMICALLY 0x10 342*a9fa9459Szrj #define BFD_MACH_O_N_DESC_DISCARDED 0x20 343*a9fa9459Szrj #define BFD_MACH_O_N_NO_DEAD_STRIP 0x20 344*a9fa9459Szrj #define BFD_MACH_O_N_WEAK_REF 0x40 345*a9fa9459Szrj #define BFD_MACH_O_N_WEAK_DEF 0x80 346*a9fa9459Szrj #define BFD_MACH_O_N_REF_TO_WEAK 0x80 347*a9fa9459Szrj 348*a9fa9459Szrj #define BFD_MACH_O_N_ARM_THUMB_DEF 0x08 349*a9fa9459Szrj #define BFD_MACH_O_N_SYMBOL_RESOLVER 0x100 350*a9fa9459Szrj 351*a9fa9459Szrj #define BFD_MACH_O_INDIRECT_SYM_LOCAL 0x80000000 352*a9fa9459Szrj #define BFD_MACH_O_INDIRECT_SYM_ABS 0x40000000 353*a9fa9459Szrj 354*a9fa9459Szrj /* Constants for dyld info rebase. */ 355*a9fa9459Szrj #define BFD_MACH_O_REBASE_OPCODE_MASK 0xf0 356*a9fa9459Szrj #define BFD_MACH_O_REBASE_IMMEDIATE_MASK 0x0f 357*a9fa9459Szrj 358*a9fa9459Szrj /* The rebase opcodes. */ 359*a9fa9459Szrj #define BFD_MACH_O_REBASE_OPCODE_DONE 0x00 360*a9fa9459Szrj #define BFD_MACH_O_REBASE_OPCODE_SET_TYPE_IMM 0x10 361*a9fa9459Szrj #define BFD_MACH_O_REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB 0x20 362*a9fa9459Szrj #define BFD_MACH_O_REBASE_OPCODE_ADD_ADDR_ULEB 0x30 363*a9fa9459Szrj #define BFD_MACH_O_REBASE_OPCODE_ADD_ADDR_IMM_SCALED 0x40 364*a9fa9459Szrj #define BFD_MACH_O_REBASE_OPCODE_DO_REBASE_IMM_TIMES 0x50 365*a9fa9459Szrj #define BFD_MACH_O_REBASE_OPCODE_DO_REBASE_ULEB_TIMES 0x60 366*a9fa9459Szrj #define BFD_MACH_O_REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB 0x70 367*a9fa9459Szrj #define BFD_MACH_O_REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB 0x80 368*a9fa9459Szrj 369*a9fa9459Szrj /* The rebase type. */ 370*a9fa9459Szrj #define BFD_MACH_O_REBASE_TYPE_POINTER 1 371*a9fa9459Szrj #define BFD_MACH_O_REBASE_TYPE_TEXT_ABSOLUTE32 2 372*a9fa9459Szrj #define BFD_MACH_O_REBASE_TYPE_TEXT_PCREL32 3 373*a9fa9459Szrj 374*a9fa9459Szrj /* Constants for dyld info bind. */ 375*a9fa9459Szrj #define BFD_MACH_O_BIND_OPCODE_MASK 0xf0 376*a9fa9459Szrj #define BFD_MACH_O_BIND_IMMEDIATE_MASK 0x0f 377*a9fa9459Szrj 378*a9fa9459Szrj /* The bind opcodes. */ 379*a9fa9459Szrj #define BFD_MACH_O_BIND_OPCODE_DONE 0x00 380*a9fa9459Szrj #define BFD_MACH_O_BIND_OPCODE_SET_DYLIB_ORDINAL_IMM 0x10 381*a9fa9459Szrj #define BFD_MACH_O_BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB 0x20 382*a9fa9459Szrj #define BFD_MACH_O_BIND_OPCODE_SET_DYLIB_SPECIAL_IMM 0x30 383*a9fa9459Szrj #define BFD_MACH_O_BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM 0x40 384*a9fa9459Szrj #define BFD_MACH_O_BIND_OPCODE_SET_TYPE_IMM 0x50 385*a9fa9459Szrj #define BFD_MACH_O_BIND_OPCODE_SET_ADDEND_SLEB 0x60 386*a9fa9459Szrj #define BFD_MACH_O_BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB 0x70 387*a9fa9459Szrj #define BFD_MACH_O_BIND_OPCODE_ADD_ADDR_ULEB 0x80 388*a9fa9459Szrj #define BFD_MACH_O_BIND_OPCODE_DO_BIND 0x90 389*a9fa9459Szrj #define BFD_MACH_O_BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB 0xa0 390*a9fa9459Szrj #define BFD_MACH_O_BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED 0xb0 391*a9fa9459Szrj #define BFD_MACH_O_BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB 0xc0 392*a9fa9459Szrj 393*a9fa9459Szrj /* The bind types. */ 394*a9fa9459Szrj #define BFD_MACH_O_BIND_TYPE_POINTER 1 395*a9fa9459Szrj #define BFD_MACH_O_BIND_TYPE_TEXT_ABSOLUTE32 2 396*a9fa9459Szrj #define BFD_MACH_O_BIND_TYPE_TEXT_PCREL32 3 397*a9fa9459Szrj 398*a9fa9459Szrj /* The special dylib. */ 399*a9fa9459Szrj #define BFD_MACH_O_BIND_SPECIAL_DYLIB_SELF 0 400*a9fa9459Szrj #define BFD_MACH_O_BIND_SPECIAL_DYLIB_MAIN_EXECUTABLE -1 401*a9fa9459Szrj #define BFD_MACH_O_BIND_SPECIAL_DYLIB_FLAT_LOOKUP -2 402*a9fa9459Szrj 403*a9fa9459Szrj /* Constants for dyld info export. */ 404*a9fa9459Szrj #define BFD_MACH_O_EXPORT_SYMBOL_FLAGS_KIND_MASK 0x03 405*a9fa9459Szrj #define BFD_MACH_O_EXPORT_SYMBOL_FLAGS_KIND_REGULAR 0x00 406*a9fa9459Szrj #define BFD_MACH_O_EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL 0x01 407*a9fa9459Szrj #define BFD_MACH_O_EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION 0x04 408*a9fa9459Szrj #define BFD_MACH_O_EXPORT_SYMBOL_FLAGS_REEXPORT 0x08 409*a9fa9459Szrj #define BFD_MACH_O_EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER 0x10 410*a9fa9459Szrj 411*a9fa9459Szrj /* Constants for DATA_IN_CODE entries. */ 412*a9fa9459Szrj typedef enum bfd_mach_o_data_in_code_entry_kind 413*a9fa9459Szrj { 414*a9fa9459Szrj BFD_MACH_O_DICE_KIND_DATA = 0x0001, /* Data */ 415*a9fa9459Szrj BFD_MACH_O_DICE_JUMP_TABLES8 = 0x0002, /* 1 byte jump tables. */ 416*a9fa9459Szrj BFD_MACH_O_DICE_JUMP_TABLES16 = 0x0003, /* 2 bytes. */ 417*a9fa9459Szrj BFD_MACH_O_DICE_JUMP_TABLES32 = 0x0004, /* 4 bytes. */ 418*a9fa9459Szrj BFD_MACH_O_DICE_ABS_JUMP_TABLES32 = 0x0005 /* Absolute jump table. */ 419*a9fa9459Szrj } bfd_mach_o_data_in_code_entry_kind; 420*a9fa9459Szrj 421*a9fa9459Szrj /* Thread constants. */ 422*a9fa9459Szrj 423*a9fa9459Szrj typedef enum bfd_mach_o_ppc_thread_flavour 424*a9fa9459Szrj { 425*a9fa9459Szrj BFD_MACH_O_PPC_THREAD_STATE = 1, 426*a9fa9459Szrj BFD_MACH_O_PPC_FLOAT_STATE = 2, 427*a9fa9459Szrj BFD_MACH_O_PPC_EXCEPTION_STATE = 3, 428*a9fa9459Szrj BFD_MACH_O_PPC_VECTOR_STATE = 4, 429*a9fa9459Szrj BFD_MACH_O_PPC_THREAD_STATE64 = 5, 430*a9fa9459Szrj BFD_MACH_O_PPC_EXCEPTION_STATE64 = 6, 431*a9fa9459Szrj BFD_MACH_O_PPC_THREAD_STATE_NONE = 7 432*a9fa9459Szrj } 433*a9fa9459Szrj bfd_mach_o_ppc_thread_flavour; 434*a9fa9459Szrj 435*a9fa9459Szrj /* Defined in <mach/i386/thread_status.h> */ 436*a9fa9459Szrj typedef enum bfd_mach_o_i386_thread_flavour 437*a9fa9459Szrj { 438*a9fa9459Szrj BFD_MACH_O_x86_THREAD_STATE32 = 1, 439*a9fa9459Szrj BFD_MACH_O_x86_FLOAT_STATE32 = 2, 440*a9fa9459Szrj BFD_MACH_O_x86_EXCEPTION_STATE32 = 3, 441*a9fa9459Szrj BFD_MACH_O_x86_THREAD_STATE64 = 4, 442*a9fa9459Szrj BFD_MACH_O_x86_FLOAT_STATE64 = 5, 443*a9fa9459Szrj BFD_MACH_O_x86_EXCEPTION_STATE64 = 6, 444*a9fa9459Szrj BFD_MACH_O_x86_THREAD_STATE = 7, 445*a9fa9459Szrj BFD_MACH_O_x86_FLOAT_STATE = 8, 446*a9fa9459Szrj BFD_MACH_O_x86_EXCEPTION_STATE = 9, 447*a9fa9459Szrj BFD_MACH_O_x86_DEBUG_STATE32 = 10, 448*a9fa9459Szrj BFD_MACH_O_x86_DEBUG_STATE64 = 11, 449*a9fa9459Szrj BFD_MACH_O_x86_DEBUG_STATE = 12, 450*a9fa9459Szrj BFD_MACH_O_x86_THREAD_STATE_NONE = 13 451*a9fa9459Szrj } 452*a9fa9459Szrj bfd_mach_o_i386_thread_flavour; 453*a9fa9459Szrj 454*a9fa9459Szrj #endif /* _MACH_O_LOADER_H */ 455