Blame include/mach-o/external.h

Packit bbfece
/* Mach-O support for BFD.
Packit bbfece
   Copyright (C) 2011-2018 Free Software Foundation, Inc.
Packit bbfece
Packit bbfece
   This file is part of BFD, the Binary File Descriptor library.
Packit bbfece
Packit bbfece
   This program is free software; you can redistribute it and/or modify
Packit bbfece
   it under the terms of the GNU General Public License as published by
Packit bbfece
   the Free Software Foundation; either version 3 of the License, or
Packit bbfece
   (at your option) any later version.
Packit bbfece
Packit bbfece
   This program is distributed in the hope that it will be useful,
Packit bbfece
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit bbfece
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit bbfece
   GNU General Public License for more details.
Packit bbfece
Packit bbfece
   You should have received a copy of the GNU General Public License
Packit bbfece
   along with this program; if not, write to the Free Software
Packit bbfece
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
Packit bbfece
   MA 02110-1301, USA.  */
Packit bbfece
Packit bbfece
#ifndef _MACH_O_EXTERNAL_H
Packit bbfece
#define _MACH_O_EXTERNAL_H
Packit bbfece
Packit bbfece
struct mach_o_header_external
Packit bbfece
{
Packit bbfece
  unsigned char magic[4];	/* Magic number.  */
Packit bbfece
  unsigned char cputype[4];	/* CPU that this object is for.  */
Packit bbfece
  unsigned char cpusubtype[4];	/* CPU subtype.  */
Packit bbfece
  unsigned char filetype[4];	/* Type of file.  */
Packit bbfece
  unsigned char ncmds[4];	/* Number of load commands.  */
Packit bbfece
  unsigned char sizeofcmds[4];	/* Total size of load commands.  */
Packit bbfece
  unsigned char flags[4];	/* Flags.  */
Packit bbfece
  unsigned char reserved[4];	/* Reserved (on 64-bit version only).  */
Packit bbfece
};
Packit bbfece
Packit bbfece
#define BFD_MACH_O_HEADER_SIZE 28
Packit bbfece
#define BFD_MACH_O_HEADER_64_SIZE 32
Packit bbfece
Packit bbfece
/* 32-bit section header.  */
Packit bbfece
Packit bbfece
struct mach_o_section_32_external
Packit bbfece
{
Packit bbfece
  unsigned char sectname[16];   /* Section name.  */
Packit bbfece
  unsigned char segname[16];    /* Segment that the section belongs to.  */
Packit bbfece
  unsigned char addr[4];        /* Address of this section in memory.  */
Packit bbfece
  unsigned char size[4];        /* Size in bytes of this section.  */
Packit bbfece
  unsigned char offset[4];      /* File offset of this section.  */
Packit bbfece
  unsigned char align[4];       /* log2 of this section's alignment.  */
Packit bbfece
  unsigned char reloff[4];      /* File offset of this section's relocs.  */
Packit bbfece
  unsigned char nreloc[4];      /* Number of relocs for this section.  */
Packit bbfece
  unsigned char flags[4];       /* Section flags/attributes.  */
Packit bbfece
  unsigned char reserved1[4];
Packit bbfece
  unsigned char reserved2[4];
Packit bbfece
};
Packit bbfece
#define BFD_MACH_O_SECTION_SIZE 68
Packit bbfece
Packit bbfece
/* 64-bit section header.  */
Packit bbfece
Packit bbfece
struct mach_o_section_64_external
Packit bbfece
{
Packit bbfece
  unsigned char sectname[16];   /* Section name.  */
Packit bbfece
  unsigned char segname[16];    /* Segment that the section belongs to.  */
Packit bbfece
  unsigned char addr[8];        /* Address of this section in memory.  */
Packit bbfece
  unsigned char size[8];        /* Size in bytes of this section.  */
Packit bbfece
  unsigned char offset[4];      /* File offset of this section.  */
Packit bbfece
  unsigned char align[4];       /* log2 of this section's alignment.  */
Packit bbfece
  unsigned char reloff[4];      /* File offset of this section's relocs.  */
Packit bbfece
  unsigned char nreloc[4];      /* Number of relocs for this section.  */
Packit bbfece
  unsigned char flags[4];       /* Section flags/attributes.  */
Packit bbfece
  unsigned char reserved1[4];
Packit bbfece
  unsigned char reserved2[4];
Packit bbfece
  unsigned char reserved3[4];
Packit bbfece
};
Packit bbfece
#define BFD_MACH_O_SECTION_64_SIZE 80
Packit bbfece
Packit bbfece
struct mach_o_load_command_external
Packit bbfece
{
Packit bbfece
  unsigned char cmd[4];         /* The type of load command.  */
Packit bbfece
  unsigned char cmdsize[4];     /* Size in bytes of entire command.  */
Packit bbfece
};
Packit bbfece
#define BFD_MACH_O_LC_SIZE 8
Packit bbfece
Packit bbfece
struct mach_o_segment_command_32_external
Packit bbfece
{
Packit bbfece
  unsigned char segname[16];    /* Name of this segment.  */
Packit bbfece
  unsigned char vmaddr[4];      /* Virtual memory address of this segment.  */
Packit bbfece
  unsigned char vmsize[4];      /* Size there, in bytes.  */
Packit bbfece
  unsigned char fileoff[4];     /* Offset in bytes of the data to be mapped.  */
Packit bbfece
  unsigned char filesize[4];    /* Size in bytes on disk.  */
Packit bbfece
  unsigned char maxprot[4];     /* Maximum permitted vm protection.  */
Packit bbfece
  unsigned char initprot[4];    /* Initial vm protection.  */
Packit bbfece
  unsigned char nsects[4];      /* Number of sections in this segment.  */
Packit bbfece
  unsigned char flags[4];       /* Flags that affect the loading.  */
Packit bbfece
};
Packit bbfece
#define BFD_MACH_O_LC_SEGMENT_SIZE 56 /* Include the header.  */
Packit bbfece
Packit bbfece
struct mach_o_segment_command_64_external
Packit bbfece
{
Packit bbfece
  unsigned char segname[16];    /* Name of this segment.  */
Packit bbfece
  unsigned char vmaddr[8];      /* Virtual memory address of this segment.  */
Packit bbfece
  unsigned char vmsize[8];      /* Size there, in bytes.  */
Packit bbfece
  unsigned char fileoff[8];     /* Offset in bytes of the data to be mapped.  */
Packit bbfece
  unsigned char filesize[8];    /* Size in bytes on disk.  */
Packit bbfece
  unsigned char maxprot[4];     /* Maximum permitted vm protection.  */
Packit bbfece
  unsigned char initprot[4];    /* Initial vm protection.  */
Packit bbfece
  unsigned char nsects[4];      /* Number of sections in this segment.  */
Packit bbfece
  unsigned char flags[4];       /* Flags that affect the loading.  */
Packit bbfece
};
Packit bbfece
#define BFD_MACH_O_LC_SEGMENT_64_SIZE 72 /* Include the header.  */
Packit bbfece
Packit bbfece
struct mach_o_reloc_info_external
Packit bbfece
{
Packit bbfece
  unsigned char r_address[4];
Packit bbfece
  unsigned char r_symbolnum[4];
Packit bbfece
};
Packit bbfece
#define BFD_MACH_O_RELENT_SIZE 8
Packit bbfece
Packit bbfece
/* Relocations are based on 'address' being a section offset and an assumption
Packit bbfece
   that sections are never more than 2^24-1 bytes in size.  Relocation data
Packit bbfece
   also carry information on type/size/PC-relative/extern and whether scattered
Packit bbfece
   or not [stored in the MSB of the r_address].  */
Packit bbfece
Packit bbfece
#define BFD_MACH_O_SR_SCATTERED		0x80000000
Packit bbfece
Packit bbfece
/* For a non-scattered reloc, the relocation info is found in r_symbolnum.
Packit bbfece
   Bytes 1 to 3 contain the symbol number (0xffffff, in a non-scattered PAIR).
Packit bbfece
   Byte 4 contains the relocation info - but with differing bit-positions
Packit bbfece
   dependent on target endian-ness - as below.  */
Packit bbfece
Packit bbfece
#define BFD_MACH_O_LE_PCREL		0x01
Packit bbfece
#define BFD_MACH_O_LE_LENGTH_SHIFT	1
Packit bbfece
#define BFD_MACH_O_LE_EXTERN		0x08
Packit bbfece
#define BFD_MACH_O_LE_TYPE_SHIFT	4
Packit bbfece
Packit bbfece
#define BFD_MACH_O_BE_PCREL		0x80
Packit bbfece
#define BFD_MACH_O_BE_LENGTH_SHIFT	5
Packit bbfece
#define BFD_MACH_O_BE_EXTERN		0x10
Packit bbfece
#define BFD_MACH_O_BE_TYPE_SHIFT	0
Packit bbfece
Packit bbfece
/* The field sizes are the same for both BE and LE.  */
Packit bbfece
#define BFD_MACH_O_LENGTH_MASK		0x03
Packit bbfece
#define BFD_MACH_O_TYPE_MASK		0x0f
Packit bbfece
Packit bbfece
/* For a scattered reloc entry the info is contained in r_address.  There
Packit bbfece
   is no need to discriminate on target endian-ness, since the design was
Packit bbfece
   arranged to produce the same layout on both.  Scattered relocations are
Packit bbfece
   only used for local items, therefore there is no 'extern' field.  */
Packit bbfece
Packit bbfece
#define BFD_MACH_O_SR_PCREL		0x40000000
Packit bbfece
#define BFD_MACH_O_GET_SR_LENGTH(s)	(((s) >> 28) & 0x3)
Packit bbfece
#define BFD_MACH_O_GET_SR_TYPE(s)	(((s) >> 24) & 0x0f)
Packit bbfece
#define BFD_MACH_O_GET_SR_ADDRESS(s)	((s) & 0x00ffffff)
Packit bbfece
#define BFD_MACH_O_SET_SR_LENGTH(l)	(((l) & 0x3) << 28)
Packit bbfece
#define BFD_MACH_O_SET_SR_TYPE(t)	(((t) & 0xf) << 24)
Packit bbfece
#define BFD_MACH_O_SET_SR_ADDRESS(s)	((s) & 0x00ffffff)
Packit bbfece
Packit bbfece
struct mach_o_symtab_command_external
Packit bbfece
{
Packit bbfece
  unsigned char symoff[4];	/* File offset of the symbol table.  */
Packit bbfece
  unsigned char nsyms[4];	/* Number of symbols.  */
Packit bbfece
  unsigned char stroff[4];	/* File offset of the string table.  */
Packit bbfece
  unsigned char strsize[4];	/* String table size.  */
Packit bbfece
};
Packit bbfece
Packit bbfece
struct mach_o_nlist_external
Packit bbfece
{
Packit bbfece
  unsigned char n_strx[4];
Packit bbfece
  unsigned char n_type[1];
Packit bbfece
  unsigned char n_sect[1];
Packit bbfece
  unsigned char n_desc[2];
Packit bbfece
  unsigned char n_value[4];
Packit bbfece
};
Packit bbfece
#define BFD_MACH_O_NLIST_SIZE 12
Packit bbfece
Packit bbfece
struct mach_o_nlist_64_external
Packit bbfece
{
Packit bbfece
  unsigned char n_strx[4];
Packit bbfece
  unsigned char n_type[1];
Packit bbfece
  unsigned char n_sect[1];
Packit bbfece
  unsigned char n_desc[2];
Packit bbfece
  unsigned char n_value[8];
Packit bbfece
};
Packit bbfece
#define BFD_MACH_O_NLIST_64_SIZE 16
Packit bbfece
Packit bbfece
struct mach_o_thread_command_external
Packit bbfece
{
Packit bbfece
  unsigned char flavour[4];
Packit bbfece
  unsigned char count[4];
Packit bbfece
};
Packit bbfece
Packit bbfece
/* For commands that just have a string or a path.  */
Packit bbfece
struct mach_o_str_command_external
Packit bbfece
{
Packit bbfece
  unsigned char str[4];
Packit bbfece
};
Packit bbfece
Packit bbfece
struct mach_o_dylib_command_external
Packit bbfece
{
Packit bbfece
  unsigned char name[4];
Packit bbfece
  unsigned char timestamp[4];
Packit bbfece
  unsigned char current_version[4];
Packit bbfece
  unsigned char compatibility_version[4];
Packit bbfece
};
Packit bbfece
Packit bbfece
struct mach_o_dysymtab_command_external
Packit bbfece
{
Packit bbfece
  unsigned char ilocalsym[4];	/* Index of.  */
Packit bbfece
  unsigned char nlocalsym[4];	/* Number of.  */
Packit bbfece
  unsigned char iextdefsym[4];
Packit bbfece
  unsigned char nextdefsym[4];
Packit bbfece
  unsigned char iundefsym[4];
Packit bbfece
  unsigned char nundefsym[4];
Packit bbfece
  unsigned char tocoff[4];
Packit bbfece
  unsigned char ntoc[4];
Packit bbfece
  unsigned char modtaboff[4];
Packit bbfece
  unsigned char nmodtab[4];
Packit bbfece
  unsigned char extrefsymoff[4];
Packit bbfece
  unsigned char nextrefsyms[4];
Packit bbfece
  unsigned char indirectsymoff[4];
Packit bbfece
  unsigned char nindirectsyms[4];
Packit bbfece
  unsigned char extreloff[4];
Packit bbfece
  unsigned char nextrel[4];
Packit bbfece
  unsigned char locreloff[4];
Packit bbfece
  unsigned char nlocrel[4];
Packit bbfece
};
Packit bbfece
Packit bbfece
struct mach_o_dylib_module_external
Packit bbfece
{
Packit bbfece
  unsigned char module_name[4];
Packit bbfece
  unsigned char iextdefsym[4];
Packit bbfece
  unsigned char nextdefsym[4];
Packit bbfece
  unsigned char irefsym[4];
Packit bbfece
  unsigned char nrefsym[4];
Packit bbfece
  unsigned char ilocalsym[4];
Packit bbfece
  unsigned char nlocalsym[4];
Packit bbfece
  unsigned char iextrel[4];
Packit bbfece
  unsigned char nextrel[4];
Packit bbfece
  unsigned char iinit_iterm[4];
Packit bbfece
  unsigned char ninit_nterm[4];
Packit bbfece
  unsigned char objc_module_info_addr[4];
Packit bbfece
  unsigned char objc_module_info_size[4];
Packit bbfece
};
Packit bbfece
#define BFD_MACH_O_DYLIB_MODULE_SIZE 52
Packit bbfece
Packit bbfece
struct mach_o_dylib_module_64_external
Packit bbfece
{
Packit bbfece
  unsigned char module_name[4];
Packit bbfece
  unsigned char iextdefsym[4];
Packit bbfece
  unsigned char nextdefsym[4];
Packit bbfece
  unsigned char irefsym[4];
Packit bbfece
  unsigned char nrefsym[4];
Packit bbfece
  unsigned char ilocalsym[4];
Packit bbfece
  unsigned char nlocalsym[4];
Packit bbfece
  unsigned char iextrel[4];
Packit bbfece
  unsigned char nextrel[4];
Packit bbfece
  unsigned char iinit_iterm[4];
Packit bbfece
  unsigned char ninit_nterm[4];
Packit bbfece
  unsigned char objc_module_info_size[4];
Packit bbfece
  unsigned char objc_module_info_addr[8];
Packit bbfece
};
Packit bbfece
#define BFD_MACH_O_DYLIB_MODULE_64_SIZE 56
Packit bbfece
Packit bbfece
struct mach_o_dylib_table_of_contents_external
Packit bbfece
{
Packit bbfece
  unsigned char symbol_index[4];
Packit bbfece
  unsigned char module_index[4];
Packit bbfece
};
Packit bbfece
#define BFD_MACH_O_TABLE_OF_CONTENT_SIZE 8
Packit bbfece
Packit bbfece
struct mach_o_linkedit_data_command_external
Packit bbfece
{
Packit bbfece
  unsigned char dataoff[4];
Packit bbfece
  unsigned char datasize[4];
Packit bbfece
};
Packit bbfece
Packit bbfece
struct mach_o_dyld_info_command_external
Packit bbfece
{
Packit bbfece
  unsigned char rebase_off[4];
Packit bbfece
  unsigned char rebase_size[4];
Packit bbfece
  unsigned char bind_off[4];
Packit bbfece
  unsigned char bind_size[4];
Packit bbfece
  unsigned char weak_bind_off[4];
Packit bbfece
  unsigned char weak_bind_size[4];
Packit bbfece
  unsigned char lazy_bind_off[4];
Packit bbfece
  unsigned char lazy_bind_size[4];
Packit bbfece
  unsigned char export_off[4];
Packit bbfece
  unsigned char export_size[4];
Packit bbfece
};
Packit bbfece
Packit bbfece
struct mach_o_prebound_dylib_command_external
Packit bbfece
{
Packit bbfece
  unsigned char name[4];
Packit bbfece
  unsigned char nmodules[4];
Packit bbfece
  unsigned char linked_modules[4];
Packit bbfece
};
Packit bbfece
Packit bbfece
struct mach_o_prebind_cksum_command_external
Packit bbfece
{
Packit bbfece
  unsigned char cksum[4];
Packit bbfece
};
Packit bbfece
Packit bbfece
struct mach_o_twolevel_hints_command_external
Packit bbfece
{
Packit bbfece
  unsigned char offset[4];
Packit bbfece
  unsigned char nhints[4];
Packit bbfece
};
Packit bbfece
Packit bbfece
struct mach_o_version_min_command_external
Packit bbfece
{
Packit bbfece
  unsigned char version[4];
Packit bbfece
  unsigned char reserved[4];
Packit bbfece
};
Packit bbfece
Packit bbfece
struct mach_o_encryption_info_command_external
Packit bbfece
{
Packit bbfece
  unsigned char cryptoff[4];	/* File offset of the encrypted area.  */
Packit bbfece
  unsigned char cryptsize[4];	/* Size of the encrypted area.  */
Packit bbfece
  unsigned char cryptid[4];	/* Encryption method.  */
Packit bbfece
};
Packit bbfece
Packit bbfece
struct mach_o_encryption_info_64_command_external
Packit bbfece
{
Packit bbfece
  unsigned char cryptoff[4];	/* File offset of the encrypted area.  */
Packit bbfece
  unsigned char cryptsize[4];	/* Size of the encrypted area.  */
Packit bbfece
  unsigned char cryptid[4];	/* Encryption method.  */
Packit bbfece
  unsigned char pad[4];		/* Pad to make struct size a multiple of 8.  */
Packit bbfece
};
Packit bbfece
Packit bbfece
struct mach_o_fvmlib_command_external
Packit bbfece
{
Packit bbfece
  unsigned char name[4];	/* Offset of the name.  */
Packit bbfece
  unsigned char minor_version[4];
Packit bbfece
  unsigned char header_addr[4];
Packit bbfece
};
Packit bbfece
Packit bbfece
struct mach_o_entry_point_command_external
Packit bbfece
{
Packit bbfece
  unsigned char entryoff[8];	/* File offset of the entry point.  */
Packit bbfece
  unsigned char stacksize[8];   /* Initial stack size, if no null.  */
Packit bbfece
};
Packit bbfece
Packit bbfece
struct mach_o_source_version_command_external
Packit bbfece
{
Packit bbfece
  unsigned char version[8];	/* Version A.B.C.D.E, with 10 bits for B-E,
Packit bbfece
				   and 24 bits for A.  */
Packit bbfece
};
Packit bbfece
Packit bbfece
/* The LD_DATA_IN_CODE command use a linkedit_data_command that points to
Packit bbfece
   a table of entries.  */
Packit bbfece
Packit bbfece
struct mach_o_data_in_code_entry_external
Packit bbfece
{
Packit bbfece
  unsigned char offset[4];	/* Offset from the mach_header. */
Packit bbfece
  unsigned char length[2];	/* Number of bytes.  */
Packit bbfece
  unsigned char kind[2];	/* Kind.  See BFD_MACH_O_DICE_ values.  */
Packit bbfece
};
Packit bbfece
Packit bbfece
struct mach_o_linker_option_command_external
Packit bbfece
{
Packit bbfece
  unsigned char count[4];	/* Number of strings.  */
Packit bbfece
  /* COUNT null terminated UTF-8 strings, with 0 at the end for padding.  */
Packit bbfece
};
Packit bbfece
Packit bbfece
struct mach_o_fat_header_external
Packit bbfece
{
Packit bbfece
  unsigned char magic[4];
Packit bbfece
  unsigned char nfat_arch[4];	/* Number of components.  */
Packit bbfece
};
Packit bbfece
Packit bbfece
struct mach_o_fat_arch_external
Packit bbfece
{
Packit bbfece
  unsigned char cputype[4];
Packit bbfece
  unsigned char cpusubtype[4];
Packit bbfece
  unsigned char offset[4];	/* File offset of the member.  */
Packit bbfece
  unsigned char size[4];	/* Size of the member.  */
Packit bbfece
  unsigned char align[4];	/* Power of 2.  */
Packit bbfece
};
Packit bbfece
Packit bbfece
struct mach_o_dyld_cache_header_external
Packit bbfece
{
Packit bbfece
  unsigned char magic[16];
Packit bbfece
Packit bbfece
  unsigned char mapping_offset[4];
Packit bbfece
  unsigned char mapping_count[4];
Packit bbfece
  unsigned char images_offset[4];
Packit bbfece
  unsigned char images_count[4];
Packit bbfece
Packit bbfece
  unsigned char dyld_base_address[8];
Packit bbfece
Packit bbfece
  unsigned char code_signature_offset[8];
Packit bbfece
  unsigned char code_signature_size[8];
Packit bbfece
Packit bbfece
  unsigned char slide_info_offset[8];
Packit bbfece
  unsigned char slide_info_size[8];
Packit bbfece
Packit bbfece
  unsigned char local_symbols_offset[8];
Packit bbfece
  unsigned char local_symbols_size[8];
Packit bbfece
};
Packit bbfece
Packit bbfece
struct mach_o_dyld_cache_mapping_info_external
Packit bbfece
{
Packit bbfece
  unsigned char address[8];
Packit bbfece
  unsigned char size[8];
Packit bbfece
  unsigned char file_offset[8];
Packit bbfece
  unsigned char max_prot[4];
Packit bbfece
  unsigned char init_prot[4];
Packit bbfece
};
Packit bbfece
Packit bbfece
struct mach_o_dyld_cache_image_info_external
Packit bbfece
{
Packit bbfece
  unsigned char address[8];
Packit bbfece
  unsigned char mtime[8];
Packit bbfece
  unsigned char inode[8];
Packit bbfece
  unsigned char path_file_offset[4];
Packit bbfece
  unsigned char pad[4];
Packit bbfece
};
Packit bbfece
Packit bbfece
Packit bbfece
#endif /* _MACH_O_EXTERNAL_H */