1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434
|
/* Mach-O support for BFD.
Copyright (C) 2011-2020 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
MA 02110-1301, USA. */
#ifndef _MACH_O_EXTERNAL_H
#define _MACH_O_EXTERNAL_H
struct mach_o_header_external
{
unsigned char magic[4]; /* Magic number. */
unsigned char cputype[4]; /* CPU that this object is for. */
unsigned char cpusubtype[4]; /* CPU subtype. */
unsigned char filetype[4]; /* Type of file. */
unsigned char ncmds[4]; /* Number of load commands. */
unsigned char sizeofcmds[4]; /* Total size of load commands. */
unsigned char flags[4]; /* Flags. */
unsigned char reserved[4]; /* Reserved (on 64-bit version only). */
};
#define BFD_MACH_O_HEADER_SIZE 28
#define BFD_MACH_O_HEADER_64_SIZE 32
/* 32-bit section header. */
struct mach_o_section_32_external
{
unsigned char sectname[16]; /* Section name. */
unsigned char segname[16]; /* Segment that the section belongs to. */
unsigned char addr[4]; /* Address of this section in memory. */
unsigned char size[4]; /* Size in bytes of this section. */
unsigned char offset[4]; /* File offset of this section. */
unsigned char align[4]; /* log2 of this section's alignment. */
unsigned char reloff[4]; /* File offset of this section's relocs. */
unsigned char nreloc[4]; /* Number of relocs for this section. */
unsigned char flags[4]; /* Section flags/attributes. */
unsigned char reserved1[4];
unsigned char reserved2[4];
};
#define BFD_MACH_O_SECTION_SIZE 68
/* 64-bit section header. */
struct mach_o_section_64_external
{
unsigned char sectname[16]; /* Section name. */
unsigned char segname[16]; /* Segment that the section belongs to. */
unsigned char addr[8]; /* Address of this section in memory. */
unsigned char size[8]; /* Size in bytes of this section. */
unsigned char offset[4]; /* File offset of this section. */
unsigned char align[4]; /* log2 of this section's alignment. */
unsigned char reloff[4]; /* File offset of this section's relocs. */
unsigned char nreloc[4]; /* Number of relocs for this section. */
unsigned char flags[4]; /* Section flags/attributes. */
unsigned char reserved1[4];
unsigned char reserved2[4];
unsigned char reserved3[4];
};
#define BFD_MACH_O_SECTION_64_SIZE 80
struct mach_o_load_command_external
{
unsigned char cmd[4]; /* The type of load command. */
unsigned char cmdsize[4]; /* Size in bytes of entire command. */
};
#define BFD_MACH_O_LC_SIZE 8
struct mach_o_segment_command_32_external
{
unsigned char segname[16]; /* Name of this segment. */
unsigned char vmaddr[4]; /* Virtual memory address of this segment. */
unsigned char vmsize[4]; /* Size there, in bytes. */
unsigned char fileoff[4]; /* Offset in bytes of the data to be mapped. */
unsigned char filesize[4]; /* Size in bytes on disk. */
unsigned char maxprot[4]; /* Maximum permitted vm protection. */
unsigned char initprot[4]; /* Initial vm protection. */
unsigned char nsects[4]; /* Number of sections in this segment. */
unsigned char flags[4]; /* Flags that affect the loading. */
};
#define BFD_MACH_O_LC_SEGMENT_SIZE 56 /* Include the header. */
struct mach_o_segment_command_64_external
{
unsigned char segname[16]; /* Name of this segment. */
unsigned char vmaddr[8]; /* Virtual memory address of this segment. */
unsigned char vmsize[8]; /* Size there, in bytes. */
unsigned char fileoff[8]; /* Offset in bytes of the data to be mapped. */
unsigned char filesize[8]; /* Size in bytes on disk. */
unsigned char maxprot[4]; /* Maximum permitted vm protection. */
unsigned char initprot[4]; /* Initial vm protection. */
unsigned char nsects[4]; /* Number of sections in this segment. */
unsigned char flags[4]; /* Flags that affect the loading. */
};
#define BFD_MACH_O_LC_SEGMENT_64_SIZE 72 /* Include the header. */
struct mach_o_reloc_info_external
{
unsigned char r_address[4];
unsigned char r_symbolnum[4];
};
#define BFD_MACH_O_RELENT_SIZE 8
/* Relocations are based on 'address' being a section offset and an assumption
that sections are never more than 2^24-1 bytes in size. Relocation data
also carry information on type/size/PC-relative/extern and whether scattered
or not [stored in the MSB of the r_address]. */
#define BFD_MACH_O_SR_SCATTERED 0x80000000
/* For a non-scattered reloc, the relocation info is found in r_symbolnum.
Bytes 1 to 3 contain the symbol number (0xffffff, in a non-scattered PAIR).
Byte 4 contains the relocation info - but with differing bit-positions
dependent on target endian-ness - as below. */
#define BFD_MACH_O_LE_PCREL 0x01
#define BFD_MACH_O_LE_LENGTH_SHIFT 1
#define BFD_MACH_O_LE_EXTERN 0x08
#define BFD_MACH_O_LE_TYPE_SHIFT 4
#define BFD_MACH_O_BE_PCREL 0x80
#define BFD_MACH_O_BE_LENGTH_SHIFT 5
#define BFD_MACH_O_BE_EXTERN 0x10
#define BFD_MACH_O_BE_TYPE_SHIFT 0
/* The field sizes are the same for both BE and LE. */
#define BFD_MACH_O_LENGTH_MASK 0x03
#define BFD_MACH_O_TYPE_MASK 0x0f
/* For a scattered reloc entry the info is contained in r_address. There
is no need to discriminate on target endian-ness, since the design was
arranged to produce the same layout on both. Scattered relocations are
only used for local items, therefore there is no 'extern' field. */
#define BFD_MACH_O_SR_PCREL 0x40000000
#define BFD_MACH_O_GET_SR_LENGTH(s) (((s) >> 28) & 0x3)
#define BFD_MACH_O_GET_SR_TYPE(s) (((s) >> 24) & 0x0f)
#define BFD_MACH_O_GET_SR_ADDRESS(s) ((s) & 0x00ffffff)
#define BFD_MACH_O_SET_SR_LENGTH(l) (((l) & 0x3) << 28)
#define BFD_MACH_O_SET_SR_TYPE(t) (((t) & 0xf) << 24)
#define BFD_MACH_O_SET_SR_ADDRESS(s) ((s) & 0x00ffffff)
struct mach_o_symtab_command_external
{
unsigned char symoff[4]; /* File offset of the symbol table. */
unsigned char nsyms[4]; /* Number of symbols. */
unsigned char stroff[4]; /* File offset of the string table. */
unsigned char strsize[4]; /* String table size. */
};
struct mach_o_nlist_external
{
unsigned char n_strx[4];
unsigned char n_type[1];
unsigned char n_sect[1];
unsigned char n_desc[2];
unsigned char n_value[4];
};
#define BFD_MACH_O_NLIST_SIZE 12
struct mach_o_nlist_64_external
{
unsigned char n_strx[4];
unsigned char n_type[1];
unsigned char n_sect[1];
unsigned char n_desc[2];
unsigned char n_value[8];
};
#define BFD_MACH_O_NLIST_64_SIZE 16
struct mach_o_thread_command_external
{
unsigned char flavour[4];
unsigned char count[4];
};
/* For commands that just have a string or a path. */
struct mach_o_str_command_external
{
unsigned char str[4];
};
struct mach_o_dylib_command_external
{
unsigned char name[4];
unsigned char timestamp[4];
unsigned char current_version[4];
unsigned char compatibility_version[4];
};
struct mach_o_dysymtab_command_external
{
unsigned char ilocalsym[4]; /* Index of. */
unsigned char nlocalsym[4]; /* Number of. */
unsigned char iextdefsym[4];
unsigned char nextdefsym[4];
unsigned char iundefsym[4];
unsigned char nundefsym[4];
unsigned char tocoff[4];
unsigned char ntoc[4];
unsigned char modtaboff[4];
unsigned char nmodtab[4];
unsigned char extrefsymoff[4];
unsigned char nextrefsyms[4];
unsigned char indirectsymoff[4];
unsigned char nindirectsyms[4];
unsigned char extreloff[4];
unsigned char nextrel[4];
unsigned char locreloff[4];
unsigned char nlocrel[4];
};
struct mach_o_dylib_module_external
{
unsigned char module_name[4];
unsigned char iextdefsym[4];
unsigned char nextdefsym[4];
unsigned char irefsym[4];
unsigned char nrefsym[4];
unsigned char ilocalsym[4];
unsigned char nlocalsym[4];
unsigned char iextrel[4];
unsigned char nextrel[4];
unsigned char iinit_iterm[4];
unsigned char ninit_nterm[4];
unsigned char objc_module_info_addr[4];
unsigned char objc_module_info_size[4];
};
#define BFD_MACH_O_DYLIB_MODULE_SIZE 52
struct mach_o_dylib_module_64_external
{
unsigned char module_name[4];
unsigned char iextdefsym[4];
unsigned char nextdefsym[4];
unsigned char irefsym[4];
unsigned char nrefsym[4];
unsigned char ilocalsym[4];
unsigned char nlocalsym[4];
unsigned char iextrel[4];
unsigned char nextrel[4];
unsigned char iinit_iterm[4];
unsigned char ninit_nterm[4];
unsigned char objc_module_info_size[4];
unsigned char objc_module_info_addr[8];
};
#define BFD_MACH_O_DYLIB_MODULE_64_SIZE 56
struct mach_o_dylib_table_of_contents_external
{
unsigned char symbol_index[4];
unsigned char module_index[4];
};
#define BFD_MACH_O_TABLE_OF_CONTENT_SIZE 8
struct mach_o_linkedit_data_command_external
{
unsigned char dataoff[4];
unsigned char datasize[4];
};
struct mach_o_dyld_info_command_external
{
unsigned char rebase_off[4];
unsigned char rebase_size[4];
unsigned char bind_off[4];
unsigned char bind_size[4];
unsigned char weak_bind_off[4];
unsigned char weak_bind_size[4];
unsigned char lazy_bind_off[4];
unsigned char lazy_bind_size[4];
unsigned char export_off[4];
unsigned char export_size[4];
};
struct mach_o_prebound_dylib_command_external
{
unsigned char name[4];
unsigned char nmodules[4];
unsigned char linked_modules[4];
};
struct mach_o_prebind_cksum_command_external
{
unsigned char cksum[4];
};
struct mach_o_twolevel_hints_command_external
{
unsigned char offset[4];
unsigned char nhints[4];
};
struct mach_o_version_min_command_external
{
unsigned char version[4];
unsigned char sdk[4];
};
struct mach_o_encryption_info_command_external
{
unsigned char cryptoff[4]; /* File offset of the encrypted area. */
unsigned char cryptsize[4]; /* Size of the encrypted area. */
unsigned char cryptid[4]; /* Encryption method. */
};
struct mach_o_encryption_info_64_command_external
{
unsigned char cryptoff[4]; /* File offset of the encrypted area. */
unsigned char cryptsize[4]; /* Size of the encrypted area. */
unsigned char cryptid[4]; /* Encryption method. */
unsigned char pad[4]; /* Pad to make struct size a multiple of 8. */
};
struct mach_o_fvmlib_command_external
{
unsigned char name[4]; /* Offset of the name. */
unsigned char minor_version[4];
unsigned char header_addr[4];
};
struct mach_o_entry_point_command_external
{
unsigned char entryoff[8]; /* File offset of the entry point. */
unsigned char stacksize[8]; /* Initial stack size, if no null. */
};
struct mach_o_source_version_command_external
{
unsigned char version[8]; /* Version A.B.C.D.E, with 10 bits for B-E,
and 24 bits for A. */
};
struct mach_o_note_command_external
{
unsigned char data_owner[16]; /* Owner name for this note. */
unsigned char offset[8]; /* File offset of the note. */
unsigned char size[8]; /* Length of the note. */
};
struct mach_o_build_version_command_external
{
unsigned char platform[4]; /* Target platform. */
unsigned char minos[4]; /* X.Y.Z is encoded in nibbles xxxx.yy.zz. */
unsigned char sdk[4]; /* X.Y.Z is encoded in nibbles xxxx.yy.zz. */
unsigned char ntools[4]; /* Number of tool entries following this. */
};
/* The LD_DATA_IN_CODE command use a linkedit_data_command that points to
a table of entries. */
struct mach_o_data_in_code_entry_external
{
unsigned char offset[4]; /* Offset from the mach_header. */
unsigned char length[2]; /* Number of bytes. */
unsigned char kind[2]; /* Kind. See BFD_MACH_O_DICE_ values. */
};
struct mach_o_linker_option_command_external
{
unsigned char count[4]; /* Number of strings. */
/* COUNT null terminated UTF-8 strings, with 0 at the end for padding. */
};
struct mach_o_fat_header_external
{
unsigned char magic[4];
unsigned char nfat_arch[4]; /* Number of components. */
};
struct mach_o_fat_arch_external
{
unsigned char cputype[4];
unsigned char cpusubtype[4];
unsigned char offset[4]; /* File offset of the member. */
unsigned char size[4]; /* Size of the member. */
unsigned char align[4]; /* Power of 2. */
};
struct mach_o_dyld_cache_header_external
{
unsigned char magic[16];
unsigned char mapping_offset[4];
unsigned char mapping_count[4];
unsigned char images_offset[4];
unsigned char images_count[4];
unsigned char dyld_base_address[8];
unsigned char code_signature_offset[8];
unsigned char code_signature_size[8];
unsigned char slide_info_offset[8];
unsigned char slide_info_size[8];
unsigned char local_symbols_offset[8];
unsigned char local_symbols_size[8];
};
struct mach_o_dyld_cache_mapping_info_external
{
unsigned char address[8];
unsigned char size[8];
unsigned char file_offset[8];
unsigned char max_prot[4];
unsigned char init_prot[4];
};
struct mach_o_dyld_cache_image_info_external
{
unsigned char address[8];
unsigned char mtime[8];
unsigned char inode[8];
unsigned char path_file_offset[4];
unsigned char pad[4];
};
#endif /* _MACH_O_EXTERNAL_H */
|